Class: Openoffice
- Inherits:
-
GenericSpreadsheet
- Object
- GenericSpreadsheet
- Openoffice
- Defined in:
- lib/roo/openoffice.rb
Direct Known Subclasses
Defined Under Namespace
Classes: Font
Constant Summary collapse
- @@nr =
0
Instance Attribute Summary
Attributes inherited from GenericSpreadsheet
Instance Method Summary collapse
-
#cell(row, col, sheet = nil) ⇒ Object
Returns the content of a spreadsheet-cell.
-
#celltype(row, col, sheet = nil) ⇒ Object
returns the type of a cell: * :float * :string * :date * :percentage * :formula * :time * :datetime.
-
#create_openoffice(filename) ⇒ Object
creates a new empty openoffice-spreadsheet file.
-
#font(row, col, sheet = nil) ⇒ Object
Given a cell, return the cell’s style.
-
#formula(row, col, sheet = nil) ⇒ Object
Returns the formula at (row,col).
-
#formula?(row, col, sheet = nil) ⇒ Boolean
true, if there is a formula.
-
#initialize(filename, packed = nil, file_warning = :error, tmpdir = nil) ⇒ Openoffice
constructor
initialization and opening of a spreadsheet file values for packed: :zip.
-
#label(labelname, sheet = nil) ⇒ Object
returns the row,col values of the labelled cell (nil,nil) if label is not defined sheet parameter is not really needed because label names are global to the whole spreadsheet.
- #method_missing(m, *args) ⇒ Object
-
#officeversion ⇒ Object
version of the openoffice document at 2007 this is always “1.0”.
-
#save ⇒ Object
save spreadsheet.
-
#set(row, col, value, sheet = nil) ⇒ Object
set a cell to a certain value (this will not be saved back to the spreadsheet file!).
- #sheets ⇒ Object
-
#to_s(sheet = nil) ⇒ Object
shows the internal representation of all cells mainly for debugging purposes.
Methods inherited from GenericSpreadsheet
#column, #empty?, #find, #first_column, #first_column_as_letter, #first_row, #formulas, #info, #last_column, #last_column_as_letter, #last_row, #reload, #remove_tmp, #row, #to_csv, #to_matrix, #to_xml, #to_yaml
Constructor Details
#initialize(filename, packed = nil, file_warning = :error, tmpdir = nil) ⇒ Openoffice
initialization and opening of a spreadsheet file values for packed: :zip
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/roo/openoffice.rb', line 15 def initialize(filename, packed=nil, file_warning=:error, tmpdir=nil) #, create = false) @file_warning = file_warning super() file_type_check(filename,'.ods','an openoffice', packed) @tmpdir = GenericSpreadsheet.next_tmpdir @tmpdir = File.join(ENV['ROO_TMP'], @tmpdir) if ENV['ROO_TMP'] @tmpdir = File.join(tmpdir, @tmpdir) if tmpdir unless File.exists?(@tmpdir) FileUtils::mkdir(@tmpdir) end filename = open_from_uri(filename) if filename[0,7] == "http://" filename = unzip(filename) if packed and packed == :zip #if create and ! File.exists?(filename) # self.create_openoffice(filename) #end @cells_read = Hash.new #TODO: @cells_read[:default] = false @filename = filename unless File.file?(@filename) FileUtils::rm_r(@tmpdir) raise IOError, "file #{@filename} does not exist" end @@nr += 1 @file_nr = @@nr extract_content file = File.new(File.join(@tmpdir, @file_nr.to_s+"_roo_content.xml")) @doc = Nokogiri::XML(file) file.close #unless Dir.glob(@tmpdir).empty? FileUtils::rm_r(@tmpdir) #end @default_sheet = self.sheets.first @cell = Hash.new @cell_type = Hash.new @formula = Hash.new @first_row = Hash.new @last_row = Hash.new @first_column = Hash.new @last_column = Hash.new @style = Hash.new @style_defaults = Hash.new { |h,k| h[k] = [] } @style_definitions = Hash.new @header_line = 1 @labels = {} end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(m, *args) ⇒ Object
61 62 63 64 65 66 67 68 69 70 |
# File 'lib/roo/openoffice.rb', line 61 def method_missing(m,*args) # is method name a label name if @labels.has_key?(m.to_s) row,col = label(m.to_s) cell(row,col) else # call super for methods like #a1 super end end |
Instance Method Details
#cell(row, col, sheet = nil) ⇒ Object
Returns the content of a spreadsheet-cell. (1,1) is the upper left corner. (1,1), (1,‘A’), (‘A’,1), (‘a’,1) all refers to the cell at the first line and first row.
88 89 90 91 92 93 94 95 96 97 98 |
# File 'lib/roo/openoffice.rb', line 88 def cell(row, col, sheet=nil) sheet = @default_sheet unless sheet read_cells(sheet) unless @cells_read[sheet] row,col = normalize(row,col) if celltype(row,col,sheet) == :date #TODO: yyyy,mm,dd = @cell[sheet][[row,col]].split('-') yyyy,mm,dd = @cell[sheet][[row,col]].to_s.split('-') return Date.new(yyyy.to_i,mm.to_i,dd.to_i) end @cell[sheet][[row,col]] end |
#celltype(row, col, sheet = nil) ⇒ Object
returns the type of a cell:
-
:float
-
:string
-
:date
-
:percentage
-
:formula
-
:time
-
:datetime
173 174 175 176 177 178 179 180 181 182 |
# File 'lib/roo/openoffice.rb', line 173 def celltype(row,col,sheet=nil) sheet = @default_sheet unless sheet read_cells(sheet) unless @cells_read[sheet] row,col = normalize(row,col) if @formula[sheet][[row,col]] return :formula else @cell_type[sheet][[row,col]] end end |
#create_openoffice(filename) ⇒ Object
creates a new empty openoffice-spreadsheet file
73 74 75 76 77 78 79 80 81 82 |
# File 'lib/roo/openoffice.rb', line 73 def create_openoffice(filename) #:nodoc: #TODO: a better way for creating the file contents # now you have to call mkbase64...rb to create an include file with all # the empty files in an openoffice zip-file load 'base64include.rb' # puts @@empty_spreadsheet f = File.open(filename,'wb') f.print(Base64.decode64(@@empty_spreadsheet)) f.close end |
#font(row, col, sheet = nil) ⇒ Object
Given a cell, return the cell’s style
139 140 141 142 143 144 145 |
# File 'lib/roo/openoffice.rb', line 139 def font(row, col, sheet=nil) sheet = @default_sheet unless sheet read_cells(sheet) unless @cells_read[sheet] row,col = normalize(row,col) style_name = @style[sheet][[row,col]] || @style_defaults[sheet][col - 1] || 'Default' @style_definitions[style_name] end |
#formula(row, col, sheet = nil) ⇒ Object
Returns the formula at (row,col). Returns nil if there is no formula. The method #formula? checks if there is a formula.
103 104 105 106 107 108 109 110 111 112 |
# File 'lib/roo/openoffice.rb', line 103 def formula(row,col,sheet=nil) sheet = @default_sheet unless sheet read_cells(sheet) unless @cells_read[sheet] row,col = normalize(row,col) if @formula[sheet][[row,col]] == nil return nil else return @formula[sheet][[row,col]]["oooc:".length..-1] end end |
#formula?(row, col, sheet = nil) ⇒ Boolean
true, if there is a formula
115 116 117 118 119 120 |
# File 'lib/roo/openoffice.rb', line 115 def formula?(row,col,sheet=nil) sheet = @default_sheet unless sheet read_cells(sheet) unless @cells_read[sheet] row,col = normalize(row,col) formula(row,col) != nil end |
#label(labelname, sheet = nil) ⇒ Object
returns the row,col values of the labelled cell (nil,nil) if label is not defined sheet parameter is not really needed because label names are global to the whole spreadsheet
218 219 220 221 222 223 224 225 226 227 228 |
# File 'lib/roo/openoffice.rb', line 218 def label(labelname,sheet=nil) sheet = @default_sheet unless sheet read_cells(sheet) unless @cells_read[sheet] if @labels.has_key? labelname return @labels[labelname][1].to_i, GenericSpreadsheet.letter_to_number(@labels[labelname][2]), @labels[labelname][0] else return nil,nil,nil end end |
#officeversion ⇒ Object
version of the openoffice document at 2007 this is always “1.0”
196 197 198 199 |
# File 'lib/roo/openoffice.rb', line 196 def officeversion oo_version @officeversion end |
#save ⇒ Object
save spreadsheet
210 211 212 |
# File 'lib/roo/openoffice.rb', line 210 def save #:nodoc: 42 end |
#set(row, col, value, sheet = nil) ⇒ Object
set a cell to a certain value (this will not be saved back to the spreadsheet file!)
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
# File 'lib/roo/openoffice.rb', line 149 def set(row,col,value,sheet=nil) #:nodoc: sheet = @default_sheet unless sheet read_cells(sheet) unless @cells_read[sheet] row,col = normalize(row,col) set_value(row,col,value,sheet) if value.class == Fixnum set_type(row,col,:float,sheet) elsif value.class == String set_type(row,col,:string,sheet) elsif value.class == Float set_type(row,col,:string,sheet) else raise ArgumentError, "Type for "+value.to_s+" not set" end end |
#sheets ⇒ Object
184 185 186 187 188 189 190 191 192 |
# File 'lib/roo/openoffice.rb', line 184 def sheets return_sheets = [] #TODO: @doc.find("//*[local-name()='table']").each do |sheet| @doc.xpath("//*[local-name()='table']").each do |sheet| #TODO: return_sheets << sheet.attributes['name'] return_sheets << sheet['name'] end return_sheets end |
#to_s(sheet = nil) ⇒ Object
shows the internal representation of all cells mainly for debugging purposes
203 204 205 206 207 |
# File 'lib/roo/openoffice.rb', line 203 def to_s(sheet=nil) sheet = @default_sheet unless sheet read_cells(sheet) unless @cells_read[sheet] @cell[sheet].inspect end |