spreadsheet 1.3.3 → 1.3.4
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.
- checksums.yaml +4 -4
- data/lib/parseexcel/parseexcel.rb +66 -58
- data/lib/parseexcel/parser.rb +1 -1
- data/lib/parseexcel.rb +1 -1
- data/lib/spreadsheet/column.rb +11 -9
- data/lib/spreadsheet/compatibility.rb +3 -1
- data/lib/spreadsheet/datatypes.rb +149 -147
- data/lib/spreadsheet/encodings.rb +20 -16
- data/lib/spreadsheet/errors.rb +2 -2
- data/lib/spreadsheet/excel/error.rb +23 -22
- data/lib/spreadsheet/excel/internals/biff5.rb +11 -11
- data/lib/spreadsheet/excel/internals/biff8.rb +13 -13
- data/lib/spreadsheet/excel/internals.rb +451 -451
- data/lib/spreadsheet/excel/offset.rb +32 -31
- data/lib/spreadsheet/excel/password_hash.rb +18 -18
- data/lib/spreadsheet/excel/reader/biff5.rb +34 -35
- data/lib/spreadsheet/excel/reader/biff8.rb +234 -222
- data/lib/spreadsheet/excel/reader.rb +1320 -1274
- data/lib/spreadsheet/excel/rgb.rb +91 -91
- data/lib/spreadsheet/excel/row.rb +99 -91
- data/lib/spreadsheet/excel/sst_entry.rb +40 -38
- data/lib/spreadsheet/excel/workbook.rb +86 -76
- data/lib/spreadsheet/excel/worksheet.rb +125 -107
- data/lib/spreadsheet/excel/writer/biff8.rb +56 -55
- data/lib/spreadsheet/excel/writer/format.rb +273 -256
- data/lib/spreadsheet/excel/writer/n_worksheet.rb +837 -798
- data/lib/spreadsheet/excel/writer/workbook.rb +671 -635
- data/lib/spreadsheet/excel/writer/worksheet.rb +898 -861
- data/lib/spreadsheet/excel/writer.rb +1 -1
- data/lib/spreadsheet/excel.rb +18 -11
- data/lib/spreadsheet/font.rb +30 -26
- data/lib/spreadsheet/format.rb +74 -59
- data/lib/spreadsheet/link.rb +7 -5
- data/lib/spreadsheet/note.rb +6 -6
- data/lib/spreadsheet/noteObject.rb +5 -5
- data/lib/spreadsheet/row.rb +33 -23
- data/lib/spreadsheet/version.rb +1 -1
- data/lib/spreadsheet/workbook.rb +27 -13
- data/lib/spreadsheet/worksheet.rb +102 -68
- data/lib/spreadsheet/writer.rb +3 -0
- data/lib/spreadsheet.rb +12 -15
- data/test/excel/reader.rb +8 -8
- data/test/excel/row.rb +35 -31
- data/test/excel/writer/workbook.rb +18 -16
- data/test/excel/writer/worksheet.rb +10 -8
- data/test/font.rb +44 -32
- data/test/format.rb +38 -33
- data/test/integration.rb +627 -598
- data/test/row.rb +5 -3
- data/test/suite.rb +7 -7
- data/test/workbook.rb +15 -14
- data/test/workbook_protection.rb +5 -5
- data/test/worksheet.rb +36 -34
- metadata +48 -6
@@ -1,8 +1,8 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
1
|
+
require "date"
|
2
|
+
require "spreadsheet/column"
|
3
|
+
require "spreadsheet/encodings"
|
4
|
+
require "spreadsheet/row"
|
5
|
+
require "spreadsheet/excel/password_hash"
|
6
6
|
|
7
7
|
module Spreadsheet
|
8
8
|
##
|
@@ -32,24 +32,24 @@ module Spreadsheet
|
|
32
32
|
attr_reader :rows, :columns, :merged_cells, :margins, :pagesetup
|
33
33
|
attr_reader :froze_top, :froze_left
|
34
34
|
enum :visibility, :visible, :hidden, :strong_hidden
|
35
|
-
def initialize opts={}
|
35
|
+
def initialize opts = {}
|
36
36
|
@froze_top = 0
|
37
37
|
@froze_left = 0
|
38
38
|
@default_format = nil
|
39
39
|
@selected = opts[:selected]
|
40
|
-
@dimensions = [0,0,0,0]
|
40
|
+
@dimensions = [0, 0, 0, 0]
|
41
41
|
@pagesetup = {
|
42
|
-
:
|
43
|
-
:
|
44
|
-
:
|
42
|
+
orig_data: [9, 100, 1, 1, 1, 0, 300, 300, 0.5, 0.5, 1],
|
43
|
+
orientation: :portrait,
|
44
|
+
adjust_to: 100
|
45
45
|
}
|
46
46
|
@margins = {
|
47
|
-
:
|
48
|
-
:
|
49
|
-
:
|
50
|
-
:
|
47
|
+
top: 1,
|
48
|
+
left: 0.75,
|
49
|
+
right: 0.75,
|
50
|
+
bottom: 1
|
51
51
|
}
|
52
|
-
@name = sanitize_invalid_characters(opts[:name] ||
|
52
|
+
@name = sanitize_invalid_characters(opts[:name] || "Worksheet")
|
53
53
|
@workbook = opts[:workbook]
|
54
54
|
@rows = []
|
55
55
|
@columns = []
|
@@ -59,6 +59,7 @@ module Spreadsheet
|
|
59
59
|
@password_hash = 0
|
60
60
|
@visibility = opts[:visibility]
|
61
61
|
end
|
62
|
+
|
62
63
|
def has_frozen_panel?
|
63
64
|
@froze_top > 0 or @froze_left > 0
|
64
65
|
end
|
@@ -67,39 +68,47 @@ module Spreadsheet
|
|
67
68
|
@froze_top = top.to_i
|
68
69
|
@froze_left = left.to_i
|
69
70
|
end
|
71
|
+
|
70
72
|
def active # :nodoc:
|
71
73
|
warn "Worksheet#active is deprecated. Please use Worksheet#selected instead."
|
72
74
|
selected
|
73
75
|
end
|
76
|
+
|
74
77
|
def active= selected # :nodoc:
|
75
78
|
warn "Worksheet#active= is deprecated. Please use Worksheet#selected= instead."
|
76
79
|
self.selected = selected
|
77
80
|
end
|
81
|
+
|
78
82
|
##
|
79
83
|
# Add a Format to the Workbook. If you use Row#set_format, you should not
|
80
84
|
# need to use this Method.
|
81
85
|
def add_format fmt
|
82
86
|
@workbook.add_format fmt if fmt
|
83
87
|
end
|
88
|
+
|
84
89
|
##
|
85
90
|
# Get the enriched value of the Cell at _row_, _column_.
|
86
91
|
# See also Worksheet#[], Row#[].
|
87
92
|
def cell row, column
|
88
93
|
row(row)[column]
|
89
94
|
end
|
95
|
+
|
90
96
|
##
|
91
97
|
# Returns the Column at _idx_.
|
92
98
|
def column idx
|
93
|
-
@columns[idx] || Column.new(idx, default_format, :
|
99
|
+
@columns[idx] || Column.new(idx, default_format, worksheet: self)
|
94
100
|
end
|
101
|
+
|
95
102
|
##
|
96
103
|
# The number of columns in this Worksheet which contain data.
|
97
104
|
def column_count
|
98
105
|
dimensions[3] - dimensions[2]
|
99
106
|
end
|
107
|
+
|
100
108
|
def column_updated idx, column
|
101
109
|
@columns[idx] = column
|
102
110
|
end
|
111
|
+
|
103
112
|
##
|
104
113
|
# Delete the Row at _idx_ (0-based) from this Worksheet.
|
105
114
|
def delete_row idx
|
@@ -107,33 +116,36 @@ module Spreadsheet
|
|
107
116
|
updated_from idx
|
108
117
|
res
|
109
118
|
end
|
119
|
+
|
110
120
|
##
|
111
121
|
# The default Format of this Worksheet, if you have set one.
|
112
122
|
# Returns the Workbook's default Format otherwise.
|
113
123
|
def default_format
|
114
124
|
@default_format || @workbook.default_format
|
115
125
|
end
|
126
|
+
|
116
127
|
##
|
117
128
|
# Set the default Format of this Worksheet.
|
118
129
|
def default_format= format
|
119
130
|
@default_format = format
|
120
131
|
add_format format
|
121
|
-
format
|
122
132
|
end
|
133
|
+
|
123
134
|
##
|
124
135
|
# Is the worksheet protected?
|
125
136
|
def protected?
|
126
137
|
@protected
|
127
138
|
end
|
139
|
+
|
128
140
|
##
|
129
141
|
# Set worklist protection
|
130
|
-
def protect! password =
|
142
|
+
def protect! password = ""
|
131
143
|
@protected = true
|
132
144
|
password = password.to_s
|
133
|
-
if password.size == 0
|
134
|
-
|
145
|
+
@password_hash = if password.size == 0
|
146
|
+
0
|
135
147
|
else
|
136
|
-
|
148
|
+
Excel::Password.password_hash password
|
137
149
|
end
|
138
150
|
end
|
139
151
|
|
@@ -146,6 +158,7 @@ module Spreadsheet
|
|
146
158
|
def dimensions
|
147
159
|
@dimensions || recalculate_dimensions
|
148
160
|
end
|
161
|
+
|
149
162
|
##
|
150
163
|
# If no argument is given, #each iterates over all used Rows (from the first
|
151
164
|
# used Row until but omitting the first unused Row, see also #dimensions).
|
@@ -153,7 +166,7 @@ module Spreadsheet
|
|
153
166
|
# If the argument skip is given, #each iterates from that row until but
|
154
167
|
# omitting the first unused Row, effectively skipping the first _skip_ Rows
|
155
168
|
# from the top of the Worksheet.
|
156
|
-
def each(skip=dimensions[0], &block)
|
169
|
+
def each(skip = dimensions[0], &block)
|
157
170
|
rows = skip.upto(dimensions[1] - 1).map { |index| row(index) }.to_enum
|
158
171
|
|
159
172
|
if block_given?
|
@@ -162,9 +175,11 @@ module Spreadsheet
|
|
162
175
|
rows
|
163
176
|
end
|
164
177
|
end
|
178
|
+
|
165
179
|
def encoding # :nodoc:
|
166
180
|
@workbook.encoding
|
167
181
|
end
|
182
|
+
|
168
183
|
##
|
169
184
|
# Sets the default Format of the column at _idx_.
|
170
185
|
#
|
@@ -175,39 +190,40 @@ module Spreadsheet
|
|
175
190
|
#
|
176
191
|
# Returns an instance of Column if _idx_ is an Integer, an Array of Columns
|
177
192
|
# otherwise.
|
178
|
-
def format_column idx, format=nil, opts={}
|
193
|
+
def format_column idx, format = nil, opts = {}
|
179
194
|
opts[:worksheet] = self
|
180
195
|
res = case idx
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
196
|
+
when Integer
|
197
|
+
column = nil
|
198
|
+
if format
|
199
|
+
column = Column.new(idx, format, opts)
|
200
|
+
end
|
201
|
+
@columns[idx] = column
|
202
|
+
else
|
203
|
+
idx.collect { |col| format_column col, format, opts }
|
204
|
+
end
|
190
205
|
shorten @columns
|
191
206
|
res
|
192
207
|
end
|
208
|
+
|
193
209
|
##
|
194
210
|
# Formats all Date, DateTime and Time cells with _format_ or the default
|
195
211
|
# formats:
|
196
212
|
# - 'DD.MM.YYYY' for Date
|
197
213
|
# - 'DD.MM.YYYY hh:mm:ss' for DateTime and Time
|
198
|
-
def format_dates! format=nil
|
214
|
+
def format_dates! format = nil
|
199
215
|
new_formats = {}
|
200
|
-
fmt_str_time = client(
|
201
|
-
fmt_str_date = client(
|
216
|
+
fmt_str_time = client("DD.MM.YYYY hh:mm:ss", "UTF-8")
|
217
|
+
fmt_str_date = client("DD.MM.YYYY", "UTF-8")
|
202
218
|
each do |row|
|
203
219
|
row.each_with_index do |value, idx|
|
204
220
|
unless row.formats[idx] || row.format(idx).date_or_time?
|
205
221
|
numfmt = case value
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
222
|
+
when DateTime, Time
|
223
|
+
format || fmt_str_time
|
224
|
+
when Date
|
225
|
+
format || fmt_str_date
|
226
|
+
end
|
211
227
|
case numfmt
|
212
228
|
when Format
|
213
229
|
row.set_format idx, numfmt
|
@@ -225,52 +241,61 @@ module Spreadsheet
|
|
225
241
|
end
|
226
242
|
end
|
227
243
|
end
|
244
|
+
|
228
245
|
##
|
229
246
|
# Insert a Row at _idx_ (0-based) containing _cells_
|
230
|
-
def insert_row idx, cells=[]
|
247
|
+
def insert_row idx, cells = []
|
231
248
|
res = @rows.insert idx, Row.new(self, idx, cells)
|
232
249
|
updated_from idx
|
233
250
|
res
|
234
251
|
end
|
235
|
-
|
252
|
+
|
253
|
+
def << cells = []
|
236
254
|
insert_row @rows.size, cells
|
237
255
|
end
|
256
|
+
|
238
257
|
def inspect
|
239
258
|
names = instance_variables
|
240
|
-
names.delete
|
259
|
+
names.delete "@rows"
|
241
260
|
variables = names.collect do |name|
|
242
261
|
"%s=%s" % [name, instance_variable_get(name)]
|
243
|
-
end.join(
|
262
|
+
end.join(" ")
|
244
263
|
sprintf "#<%s:0x%014x %s @rows[%i]>", self.class, object_id,
|
245
|
-
|
264
|
+
variables, row_count
|
246
265
|
end
|
266
|
+
|
247
267
|
## The last Row containing any data
|
248
268
|
def last_row
|
249
269
|
row(last_row_index)
|
250
270
|
end
|
271
|
+
|
251
272
|
## The index of the last Row containing any data
|
252
273
|
def last_row_index
|
253
274
|
[dimensions[1] - 1, 0].max
|
254
275
|
end
|
276
|
+
|
255
277
|
##
|
256
278
|
# Replace the Row at _idx_ with the following arguments. Like #update_row,
|
257
279
|
# but truncates the Row if there are fewer arguments than Cells in the Row.
|
258
280
|
def replace_row idx, *cells
|
259
|
-
if(row = @rows[idx]) && cells.size < row.size
|
281
|
+
if (row = @rows[idx]) && cells.size < row.size
|
260
282
|
cells.concat Array.new(row.size - cells.size)
|
261
283
|
end
|
262
284
|
update_row idx, *cells
|
263
285
|
end
|
286
|
+
|
264
287
|
##
|
265
288
|
# The Row at _idx_ or a new Row.
|
266
289
|
def row idx
|
267
290
|
@rows[idx] || Row.new(self, idx)
|
268
291
|
end
|
292
|
+
|
269
293
|
##
|
270
294
|
# The number of Rows in this Worksheet which contain data.
|
271
295
|
def row_count
|
272
296
|
dimensions[1] - dimensions[0]
|
273
297
|
end
|
298
|
+
|
274
299
|
##
|
275
300
|
# Tell Worksheet that the Row at _idx_ has been updated and the #dimensions
|
276
301
|
# need to be recalculated. You should not need to call this directly.
|
@@ -278,18 +303,20 @@ module Spreadsheet
|
|
278
303
|
@dimensions = nil
|
279
304
|
@rows[idx] = row
|
280
305
|
end
|
306
|
+
|
281
307
|
##
|
282
308
|
# Updates the Row at _idx_ with the following arguments.
|
283
309
|
def update_row idx, *cells
|
284
|
-
res = if row = @rows[idx]
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
310
|
+
res = if (row = @rows[idx])
|
311
|
+
row[0, cells.size] = cells
|
312
|
+
row
|
313
|
+
else
|
314
|
+
Row.new self, idx, cells
|
315
|
+
end
|
290
316
|
row_updated idx, res
|
291
317
|
res
|
292
318
|
end
|
319
|
+
|
293
320
|
##
|
294
321
|
# Renumbers all Rows starting at _idx_ and calls #row_updated for each of
|
295
322
|
# them.
|
@@ -300,18 +327,21 @@ module Spreadsheet
|
|
300
327
|
row_updated idx, row
|
301
328
|
end
|
302
329
|
end
|
330
|
+
|
303
331
|
##
|
304
332
|
# Get the enriched value of the Cell at _row_, _column_.
|
305
333
|
# See also Worksheet#cell, Row#[].
|
306
334
|
def [] row, column
|
307
335
|
row(row)[column]
|
308
336
|
end
|
337
|
+
|
309
338
|
##
|
310
339
|
# Set the value of the Cell at _row_, _column_ to _value_.
|
311
340
|
# See also Row#[]=.
|
312
341
|
def []= row, column, value
|
313
342
|
row(row)[column] = value
|
314
343
|
end
|
344
|
+
|
315
345
|
##
|
316
346
|
# Merges multiple cells into one.
|
317
347
|
def merge_cells start_row, start_col, end_row, end_col
|
@@ -323,66 +353,70 @@ module Spreadsheet
|
|
323
353
|
recalculate_dimensions
|
324
354
|
|
325
355
|
# detect first non-nil non-empty row if given first row is empty or nil
|
326
|
-
if row(@dimensions[0]).empty? || row(@dimensions[0]).compact.join(
|
356
|
+
if row(@dimensions[0]).empty? || row(@dimensions[0]).compact.join("").empty?
|
327
357
|
(@dimensions[0]...@dimensions[1]).each do |i|
|
328
|
-
break unless row(i).empty? || row(i).compact.join(
|
358
|
+
break unless row(i).empty? || row(i).compact.join("").empty?
|
329
359
|
@dimensions[0] = i
|
330
360
|
end
|
331
361
|
end
|
332
362
|
|
333
363
|
# detect last non-nil non-empty row if given last row is empty or nil
|
334
|
-
if row(@dimensions[1] - 1).empty? || row(@dimensions[1] - 1).compact.join(
|
364
|
+
if row(@dimensions[1] - 1).empty? || row(@dimensions[1] - 1).compact.join("").empty?
|
335
365
|
row_size = @dimensions[1] - 1
|
336
366
|
@dimensions[1] = @dimensions[0]
|
337
367
|
# divide and conquer
|
338
|
-
while
|
339
|
-
if row(row_size).empty? || row(row_size).compact.join(
|
368
|
+
while row_size - @dimensions[1] > 1
|
369
|
+
if row(row_size).empty? || row(row_size).compact.join("").empty?
|
340
370
|
row_size = @dimensions[1] + (((row_size - @dimensions[1]) + 1) / 2).to_i
|
341
371
|
else
|
342
|
-
|
372
|
+
idx = ((row_size - @dimensions[1]) / 2).to_i + 1
|
343
373
|
@dimensions[1] = row_size
|
344
|
-
row_size
|
374
|
+
row_size += idx
|
345
375
|
end
|
346
376
|
end
|
347
377
|
@dimensions[1] = row_size + 1
|
348
378
|
end
|
349
379
|
|
350
380
|
# detect first non-empty non-nil column if first column is empty or nil
|
351
|
-
if (@dimensions[0]..@dimensions[1]).inject(true){|t, j| t && row(j)[@dimensions[2]].nil?}
|
381
|
+
if (@dimensions[0]..@dimensions[1]).inject(true) { |t, j| t && row(j)[@dimensions[2]].nil? }
|
352
382
|
(@dimensions[2]..@dimensions[3]).each do |i|
|
353
|
-
break unless (@dimensions[0]..@dimensions[1]).inject(true){|t, j| t && row(j)[i].to_s.empty?}
|
383
|
+
break unless (@dimensions[0]..@dimensions[1]).inject(true) { |t, j| t && row(j)[i].to_s.empty? }
|
354
384
|
@dimensions[2] = i
|
355
385
|
end
|
356
386
|
end
|
357
387
|
|
358
388
|
# detect last non-empty non-nil column if last column is empty or nil
|
359
|
-
if (@dimensions[0]..@dimensions[1]).inject(true){|t, j| t && row(j)[@dimensions[3]].nil?}
|
389
|
+
if (@dimensions[0]..@dimensions[1]).inject(true) { |t, j| t && row(j)[@dimensions[3]].nil? }
|
360
390
|
(@dimensions[2]..@dimensions[3]).reverse_each do |i|
|
361
|
-
break unless (@dimensions[0]..@dimensions[1]).inject(true){|t, j| t && row(j)[i].to_s.empty?}
|
391
|
+
break unless (@dimensions[0]..@dimensions[1]).inject(true) { |t, j| t && row(j)[i].to_s.empty? }
|
362
392
|
@dimensions[3] = i
|
363
393
|
end
|
364
|
-
@dimensions[3]
|
394
|
+
@dimensions[3]
|
365
395
|
end
|
366
396
|
end
|
367
397
|
|
368
398
|
private
|
399
|
+
|
369
400
|
def sanitize_invalid_characters(name) # :nodoc:
|
370
|
-
name.gsub(Regexp.new('[\\\/\*\?\:\[\]]'.encode(Spreadsheet.client_encoding)),
|
401
|
+
name.gsub(Regexp.new('[\\\/\*\?\:\[\]]'.encode(Spreadsheet.client_encoding)), "_")
|
371
402
|
end
|
403
|
+
|
372
404
|
def index_of_first ary # :nodoc:
|
373
405
|
return unless ary
|
374
|
-
ary.index(ary.find
|
406
|
+
ary.index(ary.find { |elm| elm })
|
375
407
|
end
|
408
|
+
|
376
409
|
def recalculate_dimensions # :nodoc:
|
377
410
|
shorten @rows
|
378
411
|
@dimensions = []
|
379
412
|
@dimensions[0] = index_of_first(@rows) || 0
|
380
413
|
@dimensions[1] = @rows.size
|
381
414
|
compact = @rows.compact
|
382
|
-
@dimensions[2] = compact.collect
|
383
|
-
@dimensions[3] = compact.collect
|
415
|
+
@dimensions[2] = compact.collect { |row| row.first_used }.compact.min || 0
|
416
|
+
@dimensions[3] = compact.collect { |row| row.first_unused }.max || 0
|
384
417
|
@dimensions
|
385
418
|
end
|
419
|
+
|
386
420
|
def shorten ary # :nodoc:
|
387
421
|
return unless ary
|
388
422
|
while !ary.empty? && !ary.last
|
data/lib/spreadsheet/writer.rb
CHANGED
@@ -6,6 +6,7 @@ module Spreadsheet
|
|
6
6
|
def initialize io_or_path
|
7
7
|
@io_or_path = io_or_path
|
8
8
|
end
|
9
|
+
|
9
10
|
def write workbook
|
10
11
|
if @io_or_path.respond_to? :seek
|
11
12
|
@io_or_path.binmode
|
@@ -16,7 +17,9 @@ module Spreadsheet
|
|
16
17
|
end
|
17
18
|
end
|
18
19
|
end
|
20
|
+
|
19
21
|
private
|
22
|
+
|
20
23
|
def write_workbook workbook, io
|
21
24
|
reader = workbook.io
|
22
25
|
unless io == reader
|
data/lib/spreadsheet.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
### Spreadsheet - A Library for reading and writing Spreadsheet Documents.
|
3
2
|
#
|
4
3
|
# Copyright (C) 2008-2010 ywesee GmbH
|
@@ -25,12 +24,12 @@
|
|
25
24
|
# 8006 Zürich
|
26
25
|
### Switzerland
|
27
26
|
|
28
|
-
require
|
29
|
-
require
|
27
|
+
require "spreadsheet/version"
|
28
|
+
require "spreadsheet/errors"
|
30
29
|
|
31
|
-
require
|
32
|
-
require
|
33
|
-
require
|
30
|
+
require "spreadsheet/excel/workbook"
|
31
|
+
require "spreadsheet/excel/reader"
|
32
|
+
require "spreadsheet/excel/rgb"
|
34
33
|
|
35
34
|
# = Synopsis
|
36
35
|
# The Spreadsheet Library is designed to read and write Spreadsheet Documents.
|
@@ -44,38 +43,36 @@ require 'spreadsheet/excel/rgb'
|
|
44
43
|
# sheet = book.worksheet 0
|
45
44
|
# sheet.each do |row| puts row[0] end
|
46
45
|
module Spreadsheet
|
47
|
-
|
48
46
|
##
|
49
47
|
# Default client Encoding. Change this value if your application uses a
|
50
48
|
# different Encoding:
|
51
49
|
# Spreadsheet.client_encoding = 'ISO-LATIN-1//TRANSLIT//IGNORE'
|
52
|
-
@client_encoding =
|
53
|
-
@enc_translit =
|
54
|
-
@enc_ignore =
|
50
|
+
@client_encoding = "UTF-8"
|
51
|
+
@enc_translit = "TRANSLIT"
|
52
|
+
@enc_ignore = "IGNORE"
|
55
53
|
|
56
54
|
class << self
|
57
|
-
|
58
55
|
attr_accessor :client_encoding, :enc_translit, :enc_ignore
|
59
56
|
|
60
57
|
##
|
61
58
|
# Parses a Spreadsheet Document and returns a Workbook object. At present,
|
62
59
|
# only Excel-Documents can be read.
|
63
|
-
def open io_or_path, mode="rb+"
|
60
|
+
def open io_or_path, mode = "rb+"
|
64
61
|
if io_or_path.respond_to? :seek
|
65
62
|
Excel::Workbook.open(io_or_path)
|
66
63
|
elsif block_given?
|
67
64
|
File.open(io_or_path, mode) do |fh|
|
68
|
-
yield open(fh)
|
65
|
+
yield open(fh) # standard:disable Security/Open
|
69
66
|
end
|
70
67
|
else
|
71
|
-
open File.open(io_or_path, mode)
|
68
|
+
open File.open(io_or_path, mode) # standard:disable Security/Open
|
72
69
|
end
|
73
70
|
end
|
74
71
|
|
75
72
|
##
|
76
73
|
# Returns a Writer object for the specified path. At present, only the
|
77
74
|
# Excel-Writer is available.
|
78
|
-
def writer io_or_path, type=Excel
|
75
|
+
def writer io_or_path, type = Excel
|
79
76
|
Excel::Writer::Workbook.new io_or_path
|
80
77
|
end
|
81
78
|
end
|
data/test/excel/reader.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# Excel::TestReader -- Spreadsheet -- 22.01.2013
|
3
3
|
|
4
|
-
$: << File.expand_path(
|
4
|
+
$: << File.expand_path("../../../lib", File.dirname(__FILE__))
|
5
5
|
|
6
|
-
require
|
6
|
+
require "test/unit"
|
7
7
|
|
8
8
|
module Spreadsheet
|
9
9
|
module Excel
|
@@ -18,8 +18,8 @@ module Spreadsheet
|
|
18
18
|
|
19
19
|
def test_not_empty_file_error_on_setup
|
20
20
|
reader = Spreadsheet::Excel::Reader.new
|
21
|
-
data = File.expand_path File.join(
|
22
|
-
path = File.join data,
|
21
|
+
data = File.expand_path File.join("test", "data")
|
22
|
+
path = File.join data, "test_empty.xls"
|
23
23
|
not_empty_io = File.open(path, "rb")
|
24
24
|
assert_nothing_thrown do
|
25
25
|
reader.setup not_empty_io
|
@@ -27,11 +27,11 @@ module Spreadsheet
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def test_not_frozen_stream_error_on_setup
|
30
|
-
return if Gem::Version.new(RUBY_VERSION) < Gem::Version.new(
|
30
|
+
return if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2.3.0")
|
31
31
|
|
32
32
|
reader = Spreadsheet::Excel::Reader.new
|
33
|
-
data = File.expand_path File.join(
|
34
|
-
path = File.join data,
|
33
|
+
data = File.expand_path File.join("test", "data")
|
34
|
+
path = File.join data, "test_empty.xls"
|
35
35
|
content_string = File.read path
|
36
36
|
frozen_io = StringIO.new(content_string.freeze)
|
37
37
|
assert_nothing_thrown do
|
@@ -40,4 +40,4 @@ module Spreadsheet
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
43
|
-
end
|
43
|
+
end
|
data/test/excel/row.rb
CHANGED
@@ -1,40 +1,44 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# Excel::TestRow -- Spreadsheet -- 12.10.2008 -- hwyss@ywesee.com
|
3
3
|
|
4
|
-
$: << File.expand_path(
|
4
|
+
$: << File.expand_path("../../lib", File.dirname(__FILE__))
|
5
5
|
|
6
|
-
require
|
7
|
-
require
|
6
|
+
require "test/unit"
|
7
|
+
require "spreadsheet"
|
8
8
|
|
9
9
|
module Spreadsheet
|
10
10
|
module Excel
|
11
|
-
class TestRow < Test::Unit::TestCase
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
11
|
+
class TestRow < Test::Unit::TestCase
|
12
|
+
def setup
|
13
|
+
@workbook = Excel::Workbook.new
|
14
|
+
@worksheet = Excel::Worksheet.new
|
15
|
+
@workbook.add_worksheet @worksheet
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_date
|
19
|
+
row = Row.new @worksheet, 0, [nil, 27627.6789]
|
20
|
+
assert_equal Date.new(1975, 8, 21), row.date(1)
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_to_a
|
24
|
+
row = Row.new @worksheet, 0, [nil, 1, 27627.6789]
|
25
|
+
row.set_format(2, Format.new(number_format: "DD.MM.YYYY"))
|
26
|
+
assert_equal [nil, 1, Date.new(1975, 8, 21)], row.to_a
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_datetime
|
30
|
+
row = Row.new @worksheet, 0, [nil, 27627.765]
|
31
|
+
d1 = DateTime.new(1975, 8, 21) + 0.765
|
32
|
+
d2 = row.datetime 1
|
33
|
+
assert_equal d1, d2
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_datetime_overflow
|
37
|
+
row = Row.new @worksheet, 0, [nil, 40010.6666666666]
|
38
|
+
d1 = DateTime.new(2009, 0o7, 16, 16)
|
39
|
+
d2 = row.datetime 1
|
40
|
+
assert_equal d1, d2
|
41
|
+
end
|
42
|
+
end
|
39
43
|
end
|
40
44
|
end
|