roo 1.11.2 → 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +26 -1
- data/Gemfile +2 -1
- data/Gemfile.lock +26 -0
- data/README.markdown +82 -62
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/examples/roo_soap_server.rb +1 -1
- data/lib/roo.rb +28 -10
- data/lib/roo/{generic_spreadsheet.rb → base.rb} +127 -159
- data/lib/roo/csv.rb +28 -30
- data/lib/roo/excel.rb +38 -48
- data/lib/roo/excel2003xml.rb +24 -36
- data/lib/roo/excelx.rb +59 -61
- data/lib/roo/google.rb +36 -59
- data/lib/roo/openoffice.rb +41 -65
- data/lib/roo/roo_rails_helper.rb +2 -1
- data/lib/roo/spreadsheet.rb +17 -8
- data/roo.gemspec +20 -8
- data/spec/fixtures/vcr_cassettes/google_drive.yml +165 -0
- data/spec/fixtures/vcr_cassettes/google_drive_access_token.yml +73 -0
- data/spec/lib/roo/base_spec.rb +7 -0
- data/spec/lib/roo/csv_spec.rb +54 -0
- data/spec/lib/roo/excel_spec.rb +17 -0
- data/spec/lib/roo/excelx_spec.rb +13 -0
- data/spec/lib/roo/google_spec.rb +36 -0
- data/spec/lib/roo/libreoffice_spec.rb +19 -0
- data/spec/lib/roo/openoffice_spec.rb +21 -0
- data/spec/lib/roo/spreadsheet_spec.rb +13 -1
- data/spec/spec_helper.rb +7 -0
- data/test/all_ss.rb +1 -1
- data/test/files/1900_base.xlsx +0 -0
- data/test/files/1904_base.xlsx +0 -0
- data/test/rm_sub_test.rb +1 -1
- data/test/test_generic_spreadsheet.rb +68 -66
- data/test/test_helper.rb +3 -84
- data/test/test_roo.rb +85 -708
- data/website/index.html +16 -16
- data/website/index.txt +42 -42
- metadata +44 -7
- data/TODO +0 -2
data/lib/roo/google.rb
CHANGED
@@ -1,59 +1,32 @@
|
|
1
1
|
begin
|
2
|
-
require "
|
2
|
+
require "google_drive"
|
3
3
|
rescue LoadError => e
|
4
|
-
raise e, "Using Roo::Google requires the
|
4
|
+
raise e, "Using Roo::Google requires the google_drive gem"
|
5
5
|
end
|
6
6
|
|
7
|
-
class
|
8
|
-
class GoogleReadError < RuntimeError; end
|
9
|
-
class GoogleWriteError < RuntimeError; end
|
10
|
-
|
11
|
-
class Roo::Google < Roo::GenericSpreadsheet
|
7
|
+
class Roo::Google < Roo::Base
|
12
8
|
attr_accessor :date_format, :datetime_format
|
13
9
|
|
14
|
-
# Creates a new Google
|
15
|
-
def initialize(
|
16
|
-
@filename =
|
17
|
-
@
|
18
|
-
@
|
19
|
-
@
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
password = ENV['GOOGLE_PASSWORD']
|
25
|
-
end
|
26
|
-
unless user and user.size > 0
|
27
|
-
warn "user not set"
|
28
|
-
end
|
29
|
-
unless password and password.size > 0
|
30
|
-
warn "password not set"
|
31
|
-
end
|
10
|
+
# Creates a new Google Drive object.
|
11
|
+
def initialize(spreadsheet_key, options = {})
|
12
|
+
@filename = spreadsheet_key
|
13
|
+
@user = options[:user] || ENV['GOOGLE_MAIL']
|
14
|
+
@password = options[:password] || ENV['GOOGLE_PASSWORD']
|
15
|
+
@access_token = options[:access_token] || ENV['GOOGLE_TOKEN']
|
16
|
+
|
17
|
+
@worksheets = session.spreadsheet_by_key(@filename).worksheets
|
18
|
+
@sheets = @worksheets.map {|sheet| sheet.title }
|
19
|
+
super
|
32
20
|
@cell = Hash.new {|h,k| h[k]=Hash.new}
|
33
21
|
@cell_type = Hash.new {|h,k| h[k]=Hash.new}
|
34
22
|
@formula = Hash.new
|
35
|
-
@first_row = Hash.new
|
36
|
-
@last_row = Hash.new
|
37
|
-
@first_column = Hash.new
|
38
|
-
@last_column = Hash.new
|
39
|
-
@cells_read = Hash.new
|
40
|
-
@header_line = 1
|
41
23
|
@date_format = '%d/%m/%Y'
|
42
24
|
@datetime_format = '%d/%m/%Y %H:%M:%S'
|
43
25
|
@time_format = '%H:%M:%S'
|
44
|
-
session = GoogleSpreadsheet.login(user, password)
|
45
|
-
@sheetlist = []
|
46
|
-
session.spreadsheet_by_key(@spreadsheetkey).worksheets.each { |sheet|
|
47
|
-
@sheetlist << sheet.title
|
48
|
-
}
|
49
|
-
@default_sheet = self.sheets.first
|
50
|
-
@worksheets = session.spreadsheet_by_key(@spreadsheetkey).worksheets
|
51
26
|
end
|
52
27
|
|
53
28
|
# returns an array of sheet names in the spreadsheet
|
54
|
-
|
55
|
-
@sheetlist
|
56
|
-
end
|
29
|
+
attr_reader :sheets
|
57
30
|
|
58
31
|
def date?(string)
|
59
32
|
Date.strptime(string, @date_format)
|
@@ -93,7 +66,7 @@ class Roo::Google < Roo::GenericSpreadsheet
|
|
93
66
|
def cell(row, col, sheet=nil)
|
94
67
|
sheet ||= @default_sheet
|
95
68
|
validate_sheet!(sheet) #TODO: 2007-12-16
|
96
|
-
read_cells(sheet)
|
69
|
+
read_cells(sheet)
|
97
70
|
row,col = normalize(row,col)
|
98
71
|
value = @cell[sheet]["#{row},#{col}"]
|
99
72
|
if celltype(row,col,sheet) == :date
|
@@ -122,10 +95,10 @@ class Roo::Google < Roo::GenericSpreadsheet
|
|
122
95
|
# * :datetime
|
123
96
|
def celltype(row, col, sheet=nil)
|
124
97
|
sheet ||= @default_sheet
|
125
|
-
read_cells(sheet)
|
98
|
+
read_cells(sheet)
|
126
99
|
row,col = normalize(row,col)
|
127
100
|
if @formula.size > 0 && @formula[sheet]["#{row},#{col}"]
|
128
|
-
|
101
|
+
:formula
|
129
102
|
else
|
130
103
|
@cell_type[sheet]["#{row},#{col}"]
|
131
104
|
end
|
@@ -136,22 +109,11 @@ class Roo::Google < Roo::GenericSpreadsheet
|
|
136
109
|
# The method #formula? checks if there is a formula.
|
137
110
|
def formula(row,col,sheet=nil)
|
138
111
|
sheet ||= @default_sheet
|
139
|
-
read_cells(sheet)
|
140
|
-
row,col = normalize(row,col)
|
141
|
-
if @formula[sheet]["#{row},#{col}"] == nil
|
142
|
-
return nil
|
143
|
-
else
|
144
|
-
return @formula[sheet]["#{row},#{col}"]
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
# true, if there is a formula
|
149
|
-
def formula?(row,col,sheet=nil)
|
150
|
-
sheet ||= @default_sheet
|
151
|
-
read_cells(sheet) unless @cells_read[sheet]
|
112
|
+
read_cells(sheet)
|
152
113
|
row,col = normalize(row,col)
|
153
|
-
formula
|
114
|
+
@formula[sheet]["#{row},#{col}"] && @formula[sheet]["#{row},#{col}"]
|
154
115
|
end
|
116
|
+
alias_method :formula?, :formula
|
155
117
|
|
156
118
|
# true, if the cell is empty
|
157
119
|
def empty?(row, col, sheet=nil)
|
@@ -247,6 +209,8 @@ class Roo::Google < Roo::GenericSpreadsheet
|
|
247
209
|
def read_cells(sheet=nil)
|
248
210
|
sheet ||= @default_sheet
|
249
211
|
validate_sheet!(sheet)
|
212
|
+
return if @cells_read[sheet]
|
213
|
+
|
250
214
|
sheet_no = sheets.index(sheet)
|
251
215
|
ws = @worksheets[sheet_no]
|
252
216
|
for row in 1..ws.num_rows
|
@@ -312,4 +276,17 @@ class Roo::Google < Roo::GenericSpreadsheet
|
|
312
276
|
return rows.min, rows.max, cols.min, cols.max
|
313
277
|
end
|
314
278
|
|
315
|
-
|
279
|
+
def reinitialize
|
280
|
+
initialize(@filename, user: @user, password: @password, access_token: @access_token)
|
281
|
+
end
|
282
|
+
|
283
|
+
def session
|
284
|
+
@session ||= if @user && @password
|
285
|
+
GoogleDrive.login(@user, @password)
|
286
|
+
elsif @access_token
|
287
|
+
GoogleDrive.login_with_oauth(@access_token)
|
288
|
+
else
|
289
|
+
warn 'set user and password or access token'
|
290
|
+
end
|
291
|
+
end
|
292
|
+
end
|
data/lib/roo/openoffice.rb
CHANGED
@@ -1,10 +1,8 @@
|
|
1
|
-
require 'fileutils'
|
2
1
|
require 'date'
|
3
2
|
require 'nokogiri'
|
4
3
|
require 'cgi'
|
5
|
-
require 'pp' #TODO
|
6
|
-
class Roo::Openoffice < Roo::GenericSpreadsheet
|
7
4
|
|
5
|
+
class Roo::OpenOffice < Roo::Base
|
8
6
|
class << self
|
9
7
|
def extract_content(tmpdir, filename)
|
10
8
|
Zip::ZipFile.open(filename) do |zip|
|
@@ -32,34 +30,35 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
|
|
32
30
|
|
33
31
|
# initialization and opening of a spreadsheet file
|
34
32
|
# values for packed: :zip
|
35
|
-
def initialize(filename,
|
36
|
-
|
33
|
+
def initialize(filename, options={}, deprecated_file_warning=:error, deprecated_tmpdir_root=nil)
|
34
|
+
if Hash === options
|
35
|
+
packed = options[:packed]
|
36
|
+
file_warning = options[:file_warning] || :error
|
37
|
+
tmpdir_root = options[:tmpdir_root]
|
38
|
+
else
|
39
|
+
warn 'Supplying `packed`, `file_warning`, or `tmpdir_root` as separate arguments to `Roo::OpenOffice.new` is deprected. Use an options hash instead.'
|
40
|
+
packed = options
|
41
|
+
file_warning = deprecated_file_warning
|
42
|
+
tmpdir_root = deprecated_tmpdir_root
|
43
|
+
end
|
44
|
+
|
45
|
+
file_type_check(filename,'.ods','an Roo::OpenOffice', file_warning, packed)
|
37
46
|
make_tmpdir(tmpdir_root) do |tmpdir|
|
38
|
-
filename =
|
47
|
+
filename = download_uri(filename, tmpdir) if uri?(filename)
|
39
48
|
filename = unzip(filename, tmpdir) if packed == :zip
|
40
|
-
@cells_read = Hash.new
|
41
49
|
#TODO: @cells_read[:default] = false
|
42
50
|
@filename = filename
|
43
51
|
unless File.file?(@filename)
|
44
52
|
raise IOError, "file #{@filename} does not exist"
|
45
53
|
end
|
46
54
|
self.class.extract_content(tmpdir, @filename)
|
47
|
-
@doc =
|
48
|
-
Nokogiri::XML(file)
|
49
|
-
end
|
55
|
+
@doc = load_xml(File.join(tmpdir, "roo_content.xml"))
|
50
56
|
end
|
51
|
-
|
52
|
-
@cell = Hash.new
|
53
|
-
@cell_type = Hash.new
|
57
|
+
super(filename, options)
|
54
58
|
@formula = Hash.new
|
55
|
-
@first_row = Hash.new
|
56
|
-
@last_row = Hash.new
|
57
|
-
@first_column = Hash.new
|
58
|
-
@last_column = Hash.new
|
59
59
|
@style = Hash.new
|
60
60
|
@style_defaults = Hash.new { |h,k| h[k] = [] }
|
61
61
|
@style_definitions = Hash.new
|
62
|
-
@header_line = 1
|
63
62
|
@comment = Hash.new
|
64
63
|
@comments_read = Hash.new
|
65
64
|
end
|
@@ -82,7 +81,7 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
|
|
82
81
|
# cell at the first line and first row.
|
83
82
|
def cell(row, col, sheet=nil)
|
84
83
|
sheet ||= @default_sheet
|
85
|
-
read_cells(sheet)
|
84
|
+
read_cells(sheet)
|
86
85
|
row,col = normalize(row,col)
|
87
86
|
if celltype(row,col,sheet) == :date
|
88
87
|
yyyy,mm,dd = @cell[sheet][[row,col]].to_s.split('-')
|
@@ -96,36 +95,17 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
|
|
96
95
|
# The method #formula? checks if there is a formula.
|
97
96
|
def formula(row,col,sheet=nil)
|
98
97
|
sheet ||= @default_sheet
|
99
|
-
read_cells(sheet)
|
100
|
-
row,col = normalize(row,col)
|
101
|
-
if @formula[sheet][[row,col]] == nil
|
102
|
-
return nil
|
103
|
-
else
|
104
|
-
# return @formula[sheet][[row,col]]["oooc:".length..-1]
|
105
|
-
# TODO:
|
106
|
-
#str = @formula[sheet][[row,col]]
|
107
|
-
#if str.include? ':'
|
108
|
-
#return str[str.index(':')+1..-1]
|
109
|
-
#else
|
110
|
-
#return str
|
111
|
-
#end
|
112
|
-
@formula[sheet][[row,col]]
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
# true, if there is a formula
|
117
|
-
def formula?(row,col,sheet=nil)
|
118
|
-
sheet ||= @default_sheet
|
119
|
-
read_cells(sheet) unless @cells_read[sheet]
|
98
|
+
read_cells(sheet)
|
120
99
|
row,col = normalize(row,col)
|
121
|
-
formula
|
100
|
+
@formula[sheet][[row,col]]
|
122
101
|
end
|
102
|
+
alias_method :formula?, :formula
|
123
103
|
|
124
104
|
# returns each formula in the selected sheet as an array of elements
|
125
105
|
# [row, col, formula]
|
126
106
|
def formulas(sheet=nil)
|
127
107
|
sheet ||= @default_sheet
|
128
|
-
read_cells(sheet)
|
108
|
+
read_cells(sheet)
|
129
109
|
if @formula[sheet]
|
130
110
|
@formula[sheet].each.collect do |elem|
|
131
111
|
[elem[0][0], elem[0][1], elem[1]]
|
@@ -154,7 +134,7 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
|
|
154
134
|
# Given a cell, return the cell's style
|
155
135
|
def font(row, col, sheet=nil)
|
156
136
|
sheet ||= @default_sheet
|
157
|
-
read_cells(sheet)
|
137
|
+
read_cells(sheet)
|
158
138
|
row,col = normalize(row,col)
|
159
139
|
style_name = @style[sheet][[row,col]] || @style_defaults[sheet][col - 1] || 'Default'
|
160
140
|
@style_definitions[style_name]
|
@@ -170,7 +150,7 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
|
|
170
150
|
# * :datetime
|
171
151
|
def celltype(row,col,sheet=nil)
|
172
152
|
sheet ||= @default_sheet
|
173
|
-
read_cells(sheet)
|
153
|
+
read_cells(sheet)
|
174
154
|
row,col = normalize(row,col)
|
175
155
|
if @formula[sheet][[row,col]]
|
176
156
|
return :formula
|
@@ -180,14 +160,12 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
|
|
180
160
|
end
|
181
161
|
|
182
162
|
def sheets
|
183
|
-
|
184
|
-
|
185
|
-
return_sheets << sheet.attributes["name"].value
|
163
|
+
@doc.xpath("//*[local-name()='table']").map do |sheet|
|
164
|
+
sheet.attributes["name"].value
|
186
165
|
end
|
187
|
-
return_sheets
|
188
166
|
end
|
189
167
|
|
190
|
-
# version of the Roo::
|
168
|
+
# version of the Roo::OpenOffice document
|
191
169
|
# at 2007 this is always "1.0"
|
192
170
|
def officeversion
|
193
171
|
oo_version
|
@@ -198,7 +176,7 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
|
|
198
176
|
# mainly for debugging purposes
|
199
177
|
def to_s(sheet=nil)
|
200
178
|
sheet ||= @default_sheet
|
201
|
-
read_cells(sheet)
|
179
|
+
read_cells(sheet)
|
202
180
|
@cell[sheet].inspect
|
203
181
|
end
|
204
182
|
|
@@ -211,7 +189,7 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
|
|
211
189
|
end
|
212
190
|
if @label.has_key? labelname
|
213
191
|
return @label[labelname][1].to_i,
|
214
|
-
Roo::
|
192
|
+
Roo::Base.letter_to_number(@label[labelname][2]),
|
215
193
|
@label[labelname][0]
|
216
194
|
else
|
217
195
|
return nil,nil,nil
|
@@ -225,7 +203,7 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
|
|
225
203
|
@label.map do |label|
|
226
204
|
[ label[0], # name
|
227
205
|
[ label[1][1].to_i, # row
|
228
|
-
Roo::
|
206
|
+
Roo::Base.letter_to_number(label[1][2]), # column
|
229
207
|
label[1][0], # sheet
|
230
208
|
] ]
|
231
209
|
end
|
@@ -235,7 +213,7 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
|
|
235
213
|
# nil if there is no comment
|
236
214
|
def comment(row,col,sheet=nil)
|
237
215
|
sheet ||= @default_sheet
|
238
|
-
read_cells(sheet)
|
216
|
+
read_cells(sheet)
|
239
217
|
row,col = normalize(row,col)
|
240
218
|
return nil unless @comment[sheet]
|
241
219
|
@comment[sheet][[row,col]]
|
@@ -244,7 +222,7 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
|
|
244
222
|
# true, if there is a comment
|
245
223
|
def comment?(row,col,sheet=nil)
|
246
224
|
sheet ||= @default_sheet
|
247
|
-
read_cells(sheet)
|
225
|
+
read_cells(sheet)
|
248
226
|
row,col = normalize(row,col)
|
249
227
|
comment(row,col) != nil
|
250
228
|
end
|
@@ -277,7 +255,7 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
|
|
277
255
|
def set_cell_values(sheet,x,y,i,v,value_type,formula,table_cell,str_v,style_name)
|
278
256
|
key = [y,x+i]
|
279
257
|
@cell_type[sheet] = {} unless @cell_type[sheet]
|
280
|
-
@cell_type[sheet][key] = Roo::
|
258
|
+
@cell_type[sheet][key] = Roo::OpenOffice.oo_type_2_roo_type(value_type)
|
281
259
|
@formula[sheet] = {} unless @formula[sheet]
|
282
260
|
if formula
|
283
261
|
['of:', 'oooc:'].each do |prefix|
|
@@ -323,8 +301,9 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
|
|
323
301
|
def read_cells(sheet=nil)
|
324
302
|
sheet ||= @default_sheet
|
325
303
|
validate_sheet!(sheet)
|
326
|
-
|
304
|
+
return if @cells_read[sheet]
|
327
305
|
|
306
|
+
sheet_found = false
|
328
307
|
@doc.xpath("//*[local-name()='table']").each do |ws|
|
329
308
|
if sheet == attr(ws,'name')
|
330
309
|
sheet_found = true
|
@@ -436,8 +415,8 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
|
|
436
415
|
@comments_read[sheet] = true
|
437
416
|
end
|
438
417
|
|
439
|
-
# Only calls read_cells because Roo::
|
440
|
-
# whereas the reading of comments is done in read_cells for Roo::
|
418
|
+
# Only calls read_cells because Roo::Base calls read_comments
|
419
|
+
# whereas the reading of comments is done in read_cells for Roo::OpenOffice-objects
|
441
420
|
def read_comments(sheet=nil)
|
442
421
|
read_cells(sheet)
|
443
422
|
end
|
@@ -456,12 +435,12 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
|
|
456
435
|
end
|
457
436
|
|
458
437
|
def read_styles(style_elements)
|
459
|
-
@style_definitions['Default'] = Roo::
|
438
|
+
@style_definitions['Default'] = Roo::OpenOffice::Font.new
|
460
439
|
style_elements.each do |style|
|
461
440
|
next unless style.name == 'style'
|
462
441
|
style_name = attr(style,'name')
|
463
442
|
style.each do |properties|
|
464
|
-
font = Roo::
|
443
|
+
font = Roo::OpenOffice::Font.new
|
465
444
|
font.bold = attr(properties,'font-weight')
|
466
445
|
font.italic = attr(properties,'font-style')
|
467
446
|
font.underline = attr(properties,'text-underline-style')
|
@@ -505,16 +484,13 @@ class Roo::Openoffice < Roo::GenericSpreadsheet
|
|
505
484
|
result
|
506
485
|
end
|
507
486
|
|
508
|
-
|
509
|
-
private
|
510
487
|
def attr(node, attr_name)
|
511
488
|
if node.attributes[attr_name]
|
512
489
|
node.attributes[attr_name].value
|
513
490
|
end
|
514
491
|
end
|
515
|
-
|
516
492
|
end # class
|
517
493
|
|
518
|
-
#
|
519
|
-
class Roo::
|
494
|
+
# LibreOffice is just an alias for Roo::OpenOffice class
|
495
|
+
class Roo::LibreOffice < Roo::OpenOffice
|
520
496
|
end
|
data/lib/roo/roo_rails_helper.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
warn "Roo's roo_rails_helper, aka the spreadsheet view method is currently deprecated with no replacement. If you find it helpful, tell http://github.com/Empact or extract it yourself."
|
1
2
|
def spreadsheet(spreadsheet, sheets, options={})
|
2
3
|
@rspreadsheet = spreadsheet
|
3
4
|
coordinates = true # default
|
@@ -43,7 +44,7 @@ def spreadsheet(spreadsheet, sheets, options={})
|
|
43
44
|
next
|
44
45
|
end
|
45
46
|
o << " <td>"
|
46
|
-
o << " <b>#{Roo::
|
47
|
+
o << " <b>#{Roo::Base.number_to_letter(c)}</b>"
|
47
48
|
o << " </td>"
|
48
49
|
}
|
49
50
|
o << "</tr>"
|
data/lib/roo/spreadsheet.rb
CHANGED
@@ -1,21 +1,30 @@
|
|
1
1
|
module Roo
|
2
2
|
class Spreadsheet
|
3
3
|
class << self
|
4
|
-
def open(file)
|
4
|
+
def open(file, options = {})
|
5
5
|
file = File === file ? file.path : file
|
6
|
-
|
6
|
+
|
7
|
+
extension =
|
8
|
+
if options[:extension]
|
9
|
+
options[:file_warning] = :ignore
|
10
|
+
".#{options[:extension]}"
|
11
|
+
else
|
12
|
+
File.extname(file)
|
13
|
+
end
|
14
|
+
|
15
|
+
case extension.downcase
|
7
16
|
when '.xls'
|
8
|
-
Roo::Excel.new(file)
|
17
|
+
Roo::Excel.new(file, options)
|
9
18
|
when '.xlsx'
|
10
|
-
Roo::Excelx.new(file)
|
19
|
+
Roo::Excelx.new(file, options)
|
11
20
|
when '.ods'
|
12
|
-
Roo::
|
21
|
+
Roo::OpenOffice.new(file, options)
|
13
22
|
when '.xml'
|
14
|
-
Roo::Excel2003XML.new(file)
|
23
|
+
Roo::Excel2003XML.new(file, options)
|
15
24
|
when ''
|
16
|
-
Roo::Google.new(file)
|
25
|
+
Roo::Google.new(file, options)
|
17
26
|
when '.csv'
|
18
|
-
Roo::
|
27
|
+
Roo::CSV.new(file, options)
|
19
28
|
else
|
20
29
|
raise ArgumentError, "Don't know how to open file #{file}"
|
21
30
|
end
|