roo 1.0.2 → 1.1.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/History.txt +7 -0
- data/Manifest.txt +3 -0
- data/Rakefile +15 -1
- data/lib/roo/excel.rb +113 -133
- data/lib/roo/excelx.rb +124 -53
- data/lib/roo/generic_spreadsheet.rb +266 -218
- data/lib/roo/google.rb +3 -2
- data/lib/roo/openoffice.rb +21 -57
- data/lib/roo/version.rb +2 -2
- data/test/Bibelbund.xlsx +0 -0
- data/test/emptysheets.ods +0 -0
- data/test/emptysheets.xls +0 -0
- data/test/test_helper.rb +11 -0
- data/test/test_roo.rb +741 -717
- data/website/index.html +87 -6
- data/website/index.txt +61 -3
- metadata +5 -2
data/History.txt
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
== 1.1.0 2008-07-26
|
2
|
+
* 2 major enhancements
|
3
|
+
* Excel: speed improvements
|
4
|
+
* Changed the behaviour of reading files with the false type
|
5
|
+
* 2 bugfixex
|
6
|
+
* Excel: last_row in Excel class did not work properly under some circumstances
|
7
|
+
* all: fixed a bug in #to_xml if there is an empty sheet
|
1
8
|
== 1.0.2 2008-07-04
|
2
9
|
* 2 bugfixes
|
3
10
|
* Excelx: fixed a bug when there are .xml.rels files in the XLSX archive
|
data/Manifest.txt
CHANGED
@@ -21,6 +21,7 @@ test/false_encoding.xls
|
|
21
21
|
test/Bibelbund1.ods
|
22
22
|
test/Bibelbund.ods
|
23
23
|
test/Bibelbund.xls
|
24
|
+
test/Bibelbund.xlsx
|
24
25
|
test/Bibelbund.csv
|
25
26
|
test/bbu.xls
|
26
27
|
test/bbu.xlsx
|
@@ -55,6 +56,8 @@ test/bode-v1.xls.zip
|
|
55
56
|
test/bode-v1.ods.zip
|
56
57
|
test/ric.ods
|
57
58
|
test/bug-row-column-fixnum-float.xls
|
59
|
+
test/emptysheets.ods
|
60
|
+
test/emptysheets.xls
|
58
61
|
website/index.html
|
59
62
|
website/index.txt
|
60
63
|
website/javascripts/rounded_corners_lite.inc.js
|
data/Rakefile
CHANGED
@@ -106,8 +106,22 @@ end
|
|
106
106
|
desc 'Generate and upload website files'
|
107
107
|
task :website => [:website_generate, :website_upload]
|
108
108
|
|
109
|
+
#-- prey: BEGIN
|
110
|
+
require 'fileutils'
|
111
|
+
include FileUtils::Verbose
|
112
|
+
desc 'Test the local installation'
|
113
|
+
task :test_local_installation do
|
114
|
+
# gehe nach $GEM_PATH und starte dort rake test
|
115
|
+
# cd(ENV['GEM_PATH']+"roo-1.1.0") do
|
116
|
+
cd("/usr/lib/ruby/gems/1.8/gems/roo-1.1.0") do
|
117
|
+
sh %{sudo rake test}
|
118
|
+
end
|
119
|
+
puts 'local installation test done'
|
120
|
+
end
|
121
|
+
#-- prey: END
|
122
|
+
|
109
123
|
desc 'Release the website and new gem version'
|
110
|
-
task :deploy => [:check_log_params, :check_version, :website, :release ] do
|
124
|
+
task :deploy => [:check_log_params, :check_version, :test_local_installation, :website, :release ] do
|
111
125
|
puts "Remember to create SVN tag:"
|
112
126
|
puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
|
113
127
|
"svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
|
data/lib/roo/excel.rb
CHANGED
@@ -20,16 +20,20 @@ class Excel < GenericSpreadsheet
|
|
20
20
|
|
21
21
|
# Creates a new Excel spreadsheet object.
|
22
22
|
# Parameter packed: :zip - File is a zip-file
|
23
|
-
def initialize(filename, packed = nil)
|
23
|
+
def initialize(filename, packed = nil, file_warning = :error)
|
24
|
+
super()
|
25
|
+
@file_warning = file_warning
|
24
26
|
@tmpdir = "oo_"+$$.to_s
|
25
27
|
unless File.exists?(@tmpdir)
|
26
28
|
FileUtils::mkdir(@tmpdir)
|
27
29
|
end
|
28
30
|
filename = open_from_uri(filename) if filename[0,7] == "http://"
|
29
31
|
filename = unzip(filename) if packed and packed == :zip
|
30
|
-
if File.extname(filename) != ".xls"
|
31
|
-
|
32
|
-
end
|
32
|
+
#if File.extname(filename).downcase != ".xls"
|
33
|
+
# warn "are you sure, this is an excel file?"
|
34
|
+
#end
|
35
|
+
#@file_warning = :error
|
36
|
+
file_type_check(filename,'.xls','an Excel')
|
33
37
|
@filename = filename
|
34
38
|
begin
|
35
39
|
unless File.file?(@filename)
|
@@ -45,12 +49,16 @@ class Excel < GenericSpreadsheet
|
|
45
49
|
#if ENV["roo_local"] != "thomas-p"
|
46
50
|
ensure
|
47
51
|
FileUtils::rm_r(@tmpdir)
|
48
|
-
|
52
|
+
#end
|
49
53
|
end
|
54
|
+
@cell = Hash.new
|
55
|
+
@cell_type = Hash.new
|
56
|
+
@formula = Hash.new
|
50
57
|
@first_row = Hash.new
|
51
58
|
@last_row = Hash.new
|
52
59
|
@first_column = Hash.new
|
53
60
|
@last_column = Hash.new
|
61
|
+
@header_line = 1
|
54
62
|
@cells_read = Hash.new
|
55
63
|
end
|
56
64
|
|
@@ -68,18 +76,7 @@ class Excel < GenericSpreadsheet
|
|
68
76
|
@workbook.worksheet(i).name
|
69
77
|
)
|
70
78
|
else
|
71
|
-
# result << platform_specific_iconv(inject_null_characters(@workbook.worksheet(i).name))
|
72
79
|
result << platform_specific_iconv(@workbook.worksheet(i).name)
|
73
|
-
#case RUBY_PLATFORM.downcase
|
74
|
-
#when /darwin/
|
75
|
-
# result << Iconv.new('utf-8','utf-8').iconv(
|
76
|
-
# @workbook.worksheet(i).name
|
77
|
-
# )
|
78
|
-
#else
|
79
|
-
# result << Iconv.new('utf-8','unicode').iconv(
|
80
|
-
# @workbook.worksheet(i).name
|
81
|
-
# )
|
82
|
-
#end # case
|
83
80
|
end
|
84
81
|
end
|
85
82
|
return result
|
@@ -101,127 +98,31 @@ class Excel < GenericSpreadsheet
|
|
101
98
|
# returns the content of a cell. The upper left corner is (1,1) or ('A',1)
|
102
99
|
def cell(row,col,sheet=nil)
|
103
100
|
sheet = @default_sheet unless sheet
|
101
|
+
read_cells(sheet) unless @cells_read[sheet]
|
104
102
|
row,col = normalize(row,col)
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
if row_par == nil
|
111
|
-
return nil
|
112
|
-
end
|
113
|
-
cell = row_par.at(col-1)
|
114
|
-
return nil unless cell
|
115
|
-
case cell.type
|
116
|
-
when :numeric then return cell.to_f
|
117
|
-
when :text then return cell.to_s('utf-8')
|
118
|
-
# when :date then return cell.date
|
119
|
-
when :date
|
120
|
-
if cell.to_s.to_f < 1.0
|
121
|
-
f = cell.to_s.to_f*24.0*60.0*60.0
|
122
|
-
secs = f.round
|
123
|
-
h = (secs / 3600.0).floor
|
124
|
-
secs = secs - 3600*h
|
125
|
-
m = (secs / 60.0).floor
|
126
|
-
secs = secs - 60*m
|
127
|
-
s = secs
|
128
|
-
return h*3600+m*60+s
|
129
|
-
else
|
130
|
-
return cell.date
|
131
|
-
end
|
132
|
-
else
|
133
|
-
return nil # cell.to_s('utf-8')
|
134
|
-
end
|
135
|
-
end
|
136
|
-
line += 1
|
137
|
-
}
|
103
|
+
if celltype(row,col,sheet) == :date
|
104
|
+
yyyy,mm,dd = @cell[sheet]["#{row},#{col}"].split('-')
|
105
|
+
return Date.new(yyyy.to_i,mm.to_i,dd.to_i)
|
106
|
+
end
|
107
|
+
return @cell[sheet]["#{row},#{col}"]
|
138
108
|
end
|
139
109
|
|
140
|
-
# returns the type of a cell:
|
110
|
+
# returns the type of a cell:
|
111
|
+
# * :float
|
112
|
+
# * :string,
|
113
|
+
# * :date
|
114
|
+
# * :percentage
|
115
|
+
# * :formula
|
116
|
+
# * :time
|
141
117
|
def celltype(row,col,sheet=nil)
|
142
118
|
sheet = @default_sheet unless sheet
|
119
|
+
read_cells(sheet) unless @cells_read[sheet]
|
143
120
|
row,col = normalize(row,col)
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
worksheet.each(skip) { |row_par|
|
149
|
-
if line == row
|
150
|
-
return nil unless row_par
|
151
|
-
cell = row_par.at(col-1)
|
152
|
-
return nil unless cell
|
153
|
-
case cell.type
|
154
|
-
when :numeric
|
155
|
-
return :float
|
156
|
-
when :text
|
157
|
-
return :string
|
158
|
-
when :date
|
159
|
-
if cell.to_s.to_f < 1.0
|
160
|
-
return :time
|
161
|
-
else
|
162
|
-
return :date
|
163
|
-
end
|
164
|
-
else
|
165
|
-
return cell.type.to_sym
|
166
|
-
end
|
167
|
-
end
|
168
|
-
line += 1
|
169
|
-
}
|
170
|
-
end
|
171
|
-
|
172
|
-
# returns all values in this row as an array
|
173
|
-
# row numbers are 1,2,3,... like in the spreadsheet
|
174
|
-
def row(rownumber,sheet=nil)
|
175
|
-
sheet = @default_sheet unless sheet
|
176
|
-
worksheet = @workbook.worksheet(sheet_no(sheet))
|
177
|
-
#therow = worksheet.row(rownumber-1)
|
178
|
-
result = []
|
179
|
-
worksheet.row(rownumber-1).each {|cell|
|
180
|
-
if cell
|
181
|
-
case cell.type
|
182
|
-
when :numeric then result << cell.to_f
|
183
|
-
when :text then result << cell.to_s('utf-8')
|
184
|
-
when :date then result << cell.date
|
185
|
-
else
|
186
|
-
result << cell.to_s('utf-8')
|
187
|
-
end
|
188
|
-
else
|
189
|
-
result << nil
|
190
|
-
end
|
191
|
-
}
|
192
|
-
return result
|
193
|
-
end
|
194
|
-
|
195
|
-
# returns all values in this column as an array
|
196
|
-
# column numbers are 1,2,3,... like in the spreadsheet
|
197
|
-
def column(columnnumber,sheet=nil)
|
198
|
-
if columnnumber.class == String
|
199
|
-
columnnumber = Openoffice.letter_to_number(columnnumber)
|
121
|
+
if @formula[sheet]["#{row},#{col}"]
|
122
|
+
return :formula
|
123
|
+
else
|
124
|
+
@cell_type[sheet]["#{row},#{col}"]
|
200
125
|
end
|
201
|
-
sheet = @default_sheet unless sheet
|
202
|
-
worksheet = @workbook.worksheet(sheet_no(sheet))
|
203
|
-
skip = 0
|
204
|
-
result = []
|
205
|
-
worksheet.each(skip) { |row_par|
|
206
|
-
if defined? row_par.at(columnnumber-1)
|
207
|
-
cell = row_par.at(columnnumber-1)
|
208
|
-
#if defined? cell = row_par.at(columnnumber-1)
|
209
|
-
if cell
|
210
|
-
case cell.type
|
211
|
-
when :numeric then result << cell.to_f
|
212
|
-
when :text then result << cell.to_s('utf-8')
|
213
|
-
when :date then result << cell.date
|
214
|
-
else
|
215
|
-
result << cell.to_s('utf-8')
|
216
|
-
end
|
217
|
-
else
|
218
|
-
result << nil
|
219
|
-
end
|
220
|
-
else
|
221
|
-
result << nil
|
222
|
-
end
|
223
|
-
}
|
224
|
-
result
|
225
126
|
end
|
226
127
|
|
227
128
|
# returns the first non empty column
|
@@ -304,7 +205,9 @@ class Excel < GenericSpreadsheet
|
|
304
205
|
# parsexcel liefert (mir unverstaendlich) eine Zeile als letzte Zeile
|
305
206
|
# zurueck, die aber leer ist. Deshalb Korrekturfunktion, die wirklich
|
306
207
|
# die letzte nicht leere Zeile liefert.
|
307
|
-
|
208
|
+
# 2008-07-23 meine Loesung funtionierte auch noch nicht unter allen
|
209
|
+
# Umstaenden row() == nil ergaenzt
|
210
|
+
while row(lr,sheet) == nil || empty_row?(row(lr,sheet))
|
308
211
|
lr -= 1
|
309
212
|
end
|
310
213
|
end
|
@@ -332,9 +235,8 @@ class Excel < GenericSpreadsheet
|
|
332
235
|
|
333
236
|
def empty_row?(row)
|
334
237
|
content = false
|
335
|
-
row.each {|elem|
|
238
|
+
row.compact.each {|elem|
|
336
239
|
if elem != ''
|
337
|
-
#if elem.class == String and elem.size > 0
|
338
240
|
content = true
|
339
241
|
end
|
340
242
|
}
|
@@ -380,4 +282,82 @@ class Excel < GenericSpreadsheet
|
|
380
282
|
result
|
381
283
|
end
|
382
284
|
|
285
|
+
# helper function to set the internal representation of cells
|
286
|
+
def set_cell_values(sheet,x,y,i,v,vt,formula,tr,str_v)
|
287
|
+
key = "#{y},#{x+i}"
|
288
|
+
@cell_type[sheet] = {} unless @cell_type[sheet]
|
289
|
+
@cell_type[sheet][key] = vt
|
290
|
+
@formula[sheet] = {} unless @formula[sheet]
|
291
|
+
@formula[sheet][key] = formula if formula
|
292
|
+
@cell[sheet] = {} unless @cell[sheet]
|
293
|
+
case @cell_type[sheet][key]
|
294
|
+
when :float
|
295
|
+
@cell[sheet][key] = v.to_f
|
296
|
+
when :string
|
297
|
+
@cell[sheet][key] = str_v
|
298
|
+
when :date
|
299
|
+
@cell[sheet][key] = v
|
300
|
+
when :percentage
|
301
|
+
@cell[sheet][key] = v.to_f
|
302
|
+
when :time
|
303
|
+
@cell[sheet][key] = v
|
304
|
+
else
|
305
|
+
@cell[sheet][key] = v
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
# read all cells in the selected sheet
|
310
|
+
def read_cells(sheet=nil)
|
311
|
+
sheet = @default_sheet unless sheet
|
312
|
+
raise ArgumentError, "Error: sheet '#{sheet||'nil'}' not valid" if @default_sheet == nil and sheet==nil
|
313
|
+
raise RangeError unless self.sheets.include? sheet
|
314
|
+
worksheet = @workbook.worksheet(sheet_no(sheet))
|
315
|
+
skip = 0
|
316
|
+
x =1
|
317
|
+
y=1
|
318
|
+
i=0
|
319
|
+
worksheet.each(skip) { |row_par|
|
320
|
+
if row_par
|
321
|
+
x =1
|
322
|
+
row_par.each do # |void|
|
323
|
+
cell = row_par.at(x-1)
|
324
|
+
if cell
|
325
|
+
case cell.type
|
326
|
+
when :numeric
|
327
|
+
vt = :float
|
328
|
+
v = cell.to_f
|
329
|
+
when :text
|
330
|
+
vt = :string
|
331
|
+
str_v = cell.to_s('utf-8')
|
332
|
+
when :date
|
333
|
+
if cell.to_s.to_f < 1.0
|
334
|
+
vt = :time
|
335
|
+
f = cell.to_s.to_f*24.0*60.0*60.0
|
336
|
+
secs = f.round
|
337
|
+
h = (secs / 3600.0).floor
|
338
|
+
secs = secs - 3600*h
|
339
|
+
m = (secs / 60.0).floor
|
340
|
+
secs = secs - 60*m
|
341
|
+
s = secs
|
342
|
+
v = h*3600+m*60+s
|
343
|
+
else
|
344
|
+
vt = :date
|
345
|
+
v = cell.date
|
346
|
+
v = sprintf("%04d-%02d-%02d",v.year,v.month,v.day)
|
347
|
+
end
|
348
|
+
else
|
349
|
+
vt = cell.type.to_sym
|
350
|
+
v = nil
|
351
|
+
end # case
|
352
|
+
formula = tr = nil #TODO:???
|
353
|
+
set_cell_values(sheet,x,y,i,v,vt,formula,tr,str_v)
|
354
|
+
end # if cell
|
355
|
+
x += 1
|
356
|
+
end
|
357
|
+
end
|
358
|
+
y += 1
|
359
|
+
}
|
360
|
+
@cells_read[sheet] = true
|
361
|
+
end
|
362
|
+
|
383
363
|
end
|
data/lib/roo/excelx.rb
CHANGED
@@ -5,7 +5,7 @@ require 'fileutils'
|
|
5
5
|
require 'zip/zipfilesystem'
|
6
6
|
require 'date'
|
7
7
|
#require 'base64'
|
8
|
-
|
8
|
+
|
9
9
|
class String
|
10
10
|
def end_with?(str)
|
11
11
|
self[-str.length,str.length] == str
|
@@ -13,22 +13,24 @@ class String
|
|
13
13
|
end
|
14
14
|
|
15
15
|
class Excelx < GenericSpreadsheet
|
16
|
-
#$log = Logger.new("excelx.log",5,100*1024)
|
17
|
-
#$log.level = Logger::DEBUG
|
18
16
|
@@nr = 0
|
19
17
|
|
20
18
|
# initialization and opening of a spreadsheet file
|
21
19
|
# values for packed: :zip
|
22
|
-
def initialize(filename, packed=nil) #, create = false)
|
20
|
+
def initialize(filename, packed=nil, file_warning = :error) #, create = false)
|
21
|
+
super()
|
22
|
+
@file_warning = file_warning
|
23
23
|
@tmpdir = "oo_"+$$.to_s
|
24
24
|
unless File.exists?(@tmpdir)
|
25
25
|
FileUtils::mkdir(@tmpdir)
|
26
26
|
end
|
27
27
|
filename = open_from_uri(filename) if filename[0,7] == "http://"
|
28
28
|
filename = unzip(filename) if packed and packed == :zip
|
29
|
-
if File.extname(filename) != ".xlsx"
|
30
|
-
|
31
|
-
end
|
29
|
+
#if File.extname(filename).downcase != ".xlsx"
|
30
|
+
# warn "are you sure, this is an Excel-xlsx file?"
|
31
|
+
#end
|
32
|
+
#@file_warning = :error
|
33
|
+
file_type_check(filename,'.xlsx','an Excel-xlsx')
|
32
34
|
@cells_read = Hash.new
|
33
35
|
@filename = filename
|
34
36
|
begin
|
@@ -72,6 +74,7 @@ class Excelx < GenericSpreadsheet
|
|
72
74
|
@first_column = Hash.new
|
73
75
|
@last_column = Hash.new
|
74
76
|
@header_line = 1
|
77
|
+
@excelx_type = Hash.new
|
75
78
|
end
|
76
79
|
|
77
80
|
# Returns the content of a spreadsheet-cell.
|
@@ -106,7 +109,7 @@ class Excelx < GenericSpreadsheet
|
|
106
109
|
# true, if there is a formula
|
107
110
|
def formula?(row,col,sheet=nil)
|
108
111
|
sheet = @default_sheet unless sheet
|
109
|
-
read_cells unless @cells_read[sheet]
|
112
|
+
read_cells(sheet) unless @cells_read[sheet]
|
110
113
|
row,col = normalize(row,col)
|
111
114
|
formula(row,col) != nil
|
112
115
|
end
|
@@ -134,17 +137,30 @@ class Excelx < GenericSpreadsheet
|
|
134
137
|
# * :string,
|
135
138
|
# * :date
|
136
139
|
# * :percentage
|
140
|
+
# * :formula
|
141
|
+
# * :time
|
137
142
|
def celltype(row,col,sheet=nil)
|
138
143
|
sheet = @default_sheet unless sheet
|
139
144
|
read_cells(sheet) unless @cells_read[sheet]
|
140
145
|
row,col = normalize(row,col)
|
141
|
-
if @formula and @formula[sheet] and @formula[sheet]["#{row},#{col}"]
|
146
|
+
# if @formula and @formula[sheet] and @formula[sheet]["#{row},#{col}"]
|
147
|
+
if @formula[sheet]["#{row},#{col}"]
|
142
148
|
return :formula
|
143
149
|
else
|
144
150
|
@cell_type[sheet]["#{row},#{col}"]
|
145
151
|
end
|
146
152
|
end
|
147
153
|
|
154
|
+
# returns the internal type of a excel cell
|
155
|
+
# * :numeric_or_formula
|
156
|
+
# * :string
|
157
|
+
def excelx_type(row,col,sheet=nil)
|
158
|
+
sheet = @default_sheet unless sheet
|
159
|
+
read_cells(sheet) unless @cells_read[sheet]
|
160
|
+
row,col = normalize(row,col)
|
161
|
+
:numeric_or_formula
|
162
|
+
end
|
163
|
+
|
148
164
|
# returns an array of sheet names in the spreadsheet
|
149
165
|
def sheets
|
150
166
|
return_sheets = []
|
@@ -168,43 +184,6 @@ class Excelx < GenericSpreadsheet
|
|
168
184
|
@cell[sheet].inspect
|
169
185
|
end
|
170
186
|
|
171
|
-
# returns all values in this row as an array
|
172
|
-
# row numbers are 1,2,3,... like in the spreadsheet
|
173
|
-
def row(rownumber,sheet=nil)
|
174
|
-
sheet = @default_sheet unless sheet
|
175
|
-
read_cells(sheet) unless @cells_read[sheet]
|
176
|
-
result = []
|
177
|
-
tmp_arr = []
|
178
|
-
@cell[sheet].each_pair {|key,value|
|
179
|
-
y,x = key.split(',')
|
180
|
-
x = x.to_i
|
181
|
-
y = y.to_i
|
182
|
-
if y == rownumber
|
183
|
-
tmp_arr[x] = value
|
184
|
-
end
|
185
|
-
}
|
186
|
-
result = tmp_arr[1..-1]
|
187
|
-
while result[-1] == nil
|
188
|
-
result = result[0..-2]
|
189
|
-
end
|
190
|
-
result
|
191
|
-
end
|
192
|
-
|
193
|
-
# returns all values in this column as an array
|
194
|
-
# column numbers are 1,2,3,... like in the spreadsheet
|
195
|
-
def column(columnnumber,sheet=nil)
|
196
|
-
if columnnumber.class == String
|
197
|
-
columnnumber = GenericSpreadsheet.letter_to_number(columnnumber)
|
198
|
-
end
|
199
|
-
sheet = @default_sheet unless sheet
|
200
|
-
read_cells(sheet) unless @cells_read[sheet]
|
201
|
-
result = []
|
202
|
-
first_row(sheet).upto(last_row(sheet)) do |row|
|
203
|
-
result << cell(row,columnnumber,sheet)
|
204
|
-
end
|
205
|
-
result
|
206
|
-
end
|
207
|
-
|
208
187
|
# returns each formula in the selected sheet as an array of elements
|
209
188
|
# [row, col, formula]
|
210
189
|
def formulas(sheet=nil)
|
@@ -225,7 +204,7 @@ class Excelx < GenericSpreadsheet
|
|
225
204
|
private
|
226
205
|
|
227
206
|
# helper function to set the internal representation of cells
|
228
|
-
def set_cell_values(sheet,x,y,i,v,vt,formula,tr,str_v)
|
207
|
+
def set_cell_values(sheet,x,y,i,v,vt,formula,tr,str_v,excelx_type=nil)
|
229
208
|
key = "#{y},#{x+i}"
|
230
209
|
@cell_type[sheet] = {} unless @cell_type[sheet]
|
231
210
|
@cell_type[sheet][key] = vt
|
@@ -244,10 +223,12 @@ class Excelx < GenericSpreadsheet
|
|
244
223
|
when :time
|
245
224
|
#hms = v.split(':')
|
246
225
|
#@cell[sheet][key] = hms[0].to_i*3600 + hms[1].to_i*60 + hms[2].to_i
|
247
|
-
|
226
|
+
@cell[sheet][key] = v.to_f*(24*60*60)
|
248
227
|
else
|
249
228
|
@cell[sheet][key] = v
|
250
229
|
end
|
230
|
+
@excelx_type[sheet] = {} unless @excelx_type[sheet]
|
231
|
+
@excelx_type[sheet][key] = excelx_type
|
251
232
|
end
|
252
233
|
|
253
234
|
def split_coord(s)
|
@@ -258,7 +239,7 @@ class Excelx < GenericSpreadsheet
|
|
258
239
|
letter += s[i,1]
|
259
240
|
i+=1
|
260
241
|
end
|
261
|
-
while i<s.length and "
|
242
|
+
while i<s.length and "0123456789".include?(s[i,1])
|
262
243
|
number = number*10 + s[i,1].to_i
|
263
244
|
i+=1
|
264
245
|
end
|
@@ -276,10 +257,11 @@ class Excelx < GenericSpreadsheet
|
|
276
257
|
end
|
277
258
|
|
278
259
|
# read all cells in the selected sheet
|
279
|
-
def
|
260
|
+
def ALTER_ANSATZ_read_cells(sheet=nil)
|
280
261
|
sheet = @default_sheet unless sheet
|
281
262
|
sheet_found = false
|
282
263
|
raise ArgumentError, "Error: sheet '#{sheet||'nil'}' not valid" if @default_sheet == nil and sheet==nil
|
264
|
+
raise RangeError unless self.sheets.include? sheet
|
283
265
|
n = self.sheets.index(sheet)
|
284
266
|
@sheet_doc[n].each_element do |worksheet|
|
285
267
|
worksheet.each_element do |elem|
|
@@ -291,8 +273,9 @@ class Excelx < GenericSpreadsheet
|
|
291
273
|
if row.attributes['t'] == 's'
|
292
274
|
tmp_type = :shared
|
293
275
|
end
|
294
|
-
if row.attributes['s'] == '2'
|
295
|
-
|
276
|
+
if row.attributes['s'] == '2' #or
|
277
|
+
#row.attributes['s'] == '1' # 2008-07-26
|
278
|
+
tmp_type = :time
|
296
279
|
elsif row.attributes['s'] == '1' and row.attributes['t'] == nil # and ergaenzt 2008-07-03
|
297
280
|
tmp_type = :formula
|
298
281
|
end
|
@@ -305,8 +288,17 @@ class Excelx < GenericSpreadsheet
|
|
305
288
|
end
|
306
289
|
if cell.name == 'v'
|
307
290
|
if tmp_type == :formula and f_element_found == false
|
291
|
+
#if cell.text.to_f < 1.0 # 2008-07-26
|
308
292
|
tmp_type = :time
|
293
|
+
#else # 2008-07-26
|
294
|
+
#tmp_type = :date #2008-07-26
|
295
|
+
#end #2008-07-26
|
309
296
|
end
|
297
|
+
if tmp_type == :time #2008-07-26
|
298
|
+
if cell.text.to_f >= 1.0 # 2008-07-26
|
299
|
+
tmp_type = :date # 2008-07-26
|
300
|
+
end # 2008-07-26
|
301
|
+
end # 2008-07-26
|
310
302
|
if tmp_type == :shared
|
311
303
|
vt = :string
|
312
304
|
str_v = @shared_table[cell.text.to_i]
|
@@ -326,7 +318,86 @@ class Excelx < GenericSpreadsheet
|
|
326
318
|
x,y = split_coordinate(row.attributes['r'])
|
327
319
|
tr=nil #TODO: ???s
|
328
320
|
set_cell_values(sheet,x,y,0,v,vt,formula,tr,str_v)
|
329
|
-
|
321
|
+
end
|
322
|
+
end
|
323
|
+
end
|
324
|
+
end
|
325
|
+
end
|
326
|
+
end
|
327
|
+
end
|
328
|
+
end
|
329
|
+
end
|
330
|
+
sheet_found = true #TODO:
|
331
|
+
if !sheet_found
|
332
|
+
raise RangeError
|
333
|
+
end
|
334
|
+
@cells_read[sheet] = true
|
335
|
+
end
|
336
|
+
|
337
|
+
# read all cells in the selected sheet
|
338
|
+
def read_cells(sheet=nil)
|
339
|
+
sheet = @default_sheet unless sheet
|
340
|
+
sheet_found = false
|
341
|
+
raise ArgumentError, "Error: sheet '#{sheet||'nil'}' not valid" if @default_sheet == nil and sheet==nil
|
342
|
+
raise RangeError unless self.sheets.include? sheet
|
343
|
+
n = self.sheets.index(sheet)
|
344
|
+
@sheet_doc[n].each_element do |worksheet|
|
345
|
+
worksheet.each_element do |elem|
|
346
|
+
if elem.name == 'sheetData'
|
347
|
+
elem.each_element do |sheetdata|
|
348
|
+
if sheetdata.name == 'row'
|
349
|
+
sheetdata.each_element do |row|
|
350
|
+
if row.name == 'c'
|
351
|
+
if row.attributes['t'] == 's'
|
352
|
+
tmp_type = :shared
|
353
|
+
end
|
354
|
+
if row.attributes['s'] == '2' #or
|
355
|
+
#row.attributes['s'] == '1' # 2008-07-26
|
356
|
+
tmp_type = :time
|
357
|
+
elsif row.attributes['s'] == '1' and row.attributes['t'] == nil # and ergaenzt 2008-07-03
|
358
|
+
tmp_type = :formula
|
359
|
+
end
|
360
|
+
formula = nil
|
361
|
+
f_element_found = false
|
362
|
+
row.each_element do |cell|
|
363
|
+
if cell.name == 'f'
|
364
|
+
f_element_found = true
|
365
|
+
formula = cell.text
|
366
|
+
end
|
367
|
+
if cell.name == 'v'
|
368
|
+
if tmp_type == :formula and f_element_found == false
|
369
|
+
#if cell.text.to_f < 1.0 # 2008-07-26
|
370
|
+
tmp_type = :time
|
371
|
+
#else # 2008-07-26
|
372
|
+
#tmp_type = :date #2008-07-26
|
373
|
+
#end #2008-07-26
|
374
|
+
end
|
375
|
+
if tmp_type == :time #2008-07-26
|
376
|
+
if cell.text.to_f >= 1.0 # 2008-07-26
|
377
|
+
tmp_type = :date # 2008-07-26
|
378
|
+
end # 2008-07-26
|
379
|
+
end # 2008-07-26
|
380
|
+
excelx_type = :numeric_or_formula
|
381
|
+
if tmp_type == :shared
|
382
|
+
vt = :string
|
383
|
+
str_v = @shared_table[cell.text.to_i]
|
384
|
+
excelx_type = :string
|
385
|
+
elsif tmp_type == :date
|
386
|
+
vt = :date
|
387
|
+
v = cell.text
|
388
|
+
elsif tmp_type == :time
|
389
|
+
vt = :time
|
390
|
+
v = cell.text
|
391
|
+
elsif tmp_type == :formula
|
392
|
+
vt = :formula
|
393
|
+
v = cell.text.to_f #TODO: !!!!
|
394
|
+
else
|
395
|
+
vt = :float
|
396
|
+
v = cell.text
|
397
|
+
end
|
398
|
+
x,y = split_coordinate(row.attributes['r'])
|
399
|
+
tr=nil #TODO: ???s
|
400
|
+
set_cell_values(sheet,x,y,0,v,vt,formula,tr,str_v,excelx_type)
|
330
401
|
end
|
331
402
|
end
|
332
403
|
end
|