Class: Rspreadsheet::Workbook

Inherits:
Object
  • Object
show all
Defined in:
lib/rspreadsheet/workbook.rb

Instance Attribute Summary collapse

Worskheets methods collapse

Loading and saving related methods collapse

Instance Method Summary collapse

Constructor Details

#initialize(afilename = nil) ⇒ Workbook

Returns a new instance of Workbook.



54
55
56
57
58
59
60
61
62
63
64
# File 'lib/rspreadsheet/workbook.rb', line 54

def initialize(afilename=nil)
  @worksheets=[]
  @filename = afilename
  @content_xml = Zip::File.open(@filename || TEMPLATE_FILE_NAME) do |zip|
    LibXML::XML::Document.io zip.get_input_stream(CONTENT_FILE_NAME)
  end
  @xmlnode = @content_xml.find_first('//office:spreadsheet')
  @xmlnode.find('./table:table').each do |node|
    create_worksheet_from_node(node)
  end
end

Instance Attribute Details

#filenameObject (readonly)

Returns the value of attribute filename.



6
7
8
# File 'lib/rspreadsheet/workbook.rb', line 6

def filename
  @filename
end

#xmlnodeObject (readonly)

debug



7
8
9
# File 'lib/rspreadsheet/workbook.rb', line 7

def xmlnode
  @xmlnode
end

Instance Method Details

#[](index_or_name) ⇒ Object



45
# File 'lib/rspreadsheet/workbook.rb', line 45

def [](index_or_name); self.worksheets(index_or_name) end

#create_worksheet(name = "Sheet#{worksheets_count+1}") ⇒ Object Also known as: add_worksheet



16
17
18
19
20
# File 'lib/rspreadsheet/workbook.rb', line 16

def create_worksheet(name = "Sheet#{worksheets_count+1}")
  sheet = Worksheet.new(name,self)
  register_worksheet(sheet)
  return sheet
end

#create_worksheet_from_node(source_node) ⇒ Object



11
12
13
14
15
# File 'lib/rspreadsheet/workbook.rb', line 11

def create_worksheet_from_node(source_node)
  sheet = Worksheet.new(source_node,self)
  register_worksheet(sheet)
  return sheet
end

#mimeObject

Returns Mime of the file.

Returns:

  • Mime of the file



49
# File 'lib/rspreadsheet/workbook.rb', line 49

def mime; 'application/vnd.oasis.opendocument.spreadsheet'.freeze end

#mime_preferred_extensionString Also known as: mime_default_extension

Returns Prefered file extension.

Returns:

  • (String)

    Prefered file extension



51
# File 'lib/rspreadsheet/workbook.rb', line 51

def mime_preferred_extension; 'ods'.freeze end

#save(io = nil) ⇒ Object Also known as: to_io, save_to_io

Saves the worksheet. Optionally you can provide new filename or IO stream to which the file should be saved.

Parameters:

  • Optional (String)

    new filename



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/rspreadsheet/workbook.rb', line 69

def save(io=nil)
  case
    when @filename.nil? && io.nil?
      raise 'New file should be named on first save.'
    when @filename.nil? && (io.kind_of?(String) || io.kind_of?(File) || io.kind_of?(IO) || io.kind_of?(StringIO))
      Zip::File.open(TEMPLATE_FILE_NAME) do |empty_template_zip|                       # open empty_template file
        write_zip_to(io) do |output_zip|                                               # open output stream of file
          copy_internally_without_content(empty_template_zip,output_zip)  # copy empty_template internals
          update_manifest_and_content_xml(empty_template_zip,output_zip)               # update xmls + pictures
        end
      end
    when @filename.kind_of?(String) && io.nil?
      write_zip_to(@filename) do |input_and_output_zip|                            # open old file
        update_manifest_and_content_xml(input_and_output_zip,input_and_output_zip) # input and output are identical
      end
      
    when @filename.kind_of?(String) && (io.kind_of?(String) || io.kind_of?(File))
      io = io.path if io.kind_of?(File)                                            # convert file to its filename
      FileUtils.cp(@filename , io)                                                 # copy file externally
      @filename = io                                                               # remember new name
      save_to_io(nil)                                                              # continue modyfying file on spot
      
    when @filename.kind_of?(String) && (io.kind_of?(IO) || io.kind_of?(StringIO))
      Zip::File.open(@filename) do | old_zip |                                    # open old file
        write_zip_to(io) do |output_zip_stream|                                   # open output stream
          copy_internally_without_content(old_zip,output_zip_stream) # copy the old internals
          update_manifest_and_content_xml(old_zip,output_zip_stream)              # update xmls + pictures
        end
      end
      # rewind result
      io.rewind
    else
  end
end

#worksheet_namesString

Returns names of sheets in the workbook.

Returns:

  • (String)

    names of sheets in the workbook



25
# File 'lib/rspreadsheet/workbook.rb', line 25

def worksheet_names; @worksheets.collect{ |ws| ws.name } end

#worksheets(index_or_name) ⇒ Worskheet Also known as: worksheet, sheet, sheets

Returns worksheet with given index or name.

Parameters:

  • (Integer, String)

Returns:

  • (Worskheet)

    worksheet with given index or name



28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/rspreadsheet/workbook.rb', line 28

def worksheets(index_or_name)
  case index_or_name
    when Integer then begin
      case index_or_name
        when 0 then nil
        when 1..Float::INFINITY then @worksheets[index_or_name-1]
        when -Float::INFINITY..-1 then @worksheets[index_or_name]    # zaporne indexy znamenaji pocitani zezadu
      end
    end
    when String then @worksheets.select{|ws| ws.name == index_or_name}.first
    when NilClass then nil
    else raise 'method worksheets requires Integer index of the sheet or its String name'
  end
end

#worksheets_countInteger

Returns number of sheets in the workbook.

Returns:

  • (Integer)

    number of sheets in the workbook



23
# File 'lib/rspreadsheet/workbook.rb', line 23

def worksheets_count; @worksheets.length end

#xmldocObject



8
# File 'lib/rspreadsheet/workbook.rb', line 8

def xmldoc; @xmlnode.doc end