spreadsheet 0.6.4 → 0.6.4.1
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 +28 -0
- data/Manifest.txt +3 -0
- data/README.txt +5 -5
- data/bin/xlsopcodes +1 -1
- data/lib/spreadsheet.rb +1 -1
- data/lib/spreadsheet/excel/internals.rb +1 -0
- data/lib/spreadsheet/excel/reader.rb +29 -4
- data/lib/spreadsheet/excel/row.rb +2 -0
- data/lib/spreadsheet/excel/worksheet.rb +1 -1
- data/lib/spreadsheet/excel/writer/worksheet.rb +8 -0
- data/lib/spreadsheet/row.rb +1 -1
- data/test/data/test_changes.xls +0 -0
- data/test/data/test_datetime.xls +0 -0
- data/test/data/test_formula.xls +0 -0
- data/test/data/test_missing_row.xls +0 -0
- data/test/excel/row.rb +6 -0
- data/test/integration.rb +36 -0
- metadata +17 -7
data/History.txt
CHANGED
@@ -1,3 +1,31 @@
|
|
1
|
+
=== 0.6.4.1 / 2009-09-17
|
2
|
+
|
3
|
+
* 3 Bugfixes
|
4
|
+
|
5
|
+
* Fixes the issue reported by Thomas Preymesser and tracked down most of the
|
6
|
+
way by Hugh McGowan in
|
7
|
+
http://rubyforge.org/tracker/index.php?func=detail&aid=26647&group_id=678&atid=2677
|
8
|
+
where reading the value of the first occurrence of a shared formula
|
9
|
+
failed.
|
10
|
+
|
11
|
+
* Fixes the issue reported by Anonymous in
|
12
|
+
http://rubyforge.org/tracker/index.php?func=detail&aid=26546&group_id=678&atid=2677
|
13
|
+
where InvalidDate was raised for some Dates.
|
14
|
+
|
15
|
+
* Fixes the issue reported by John Lee in
|
16
|
+
http://rubyforge.org/tracker/index.php?func=detail&aid=27110&group_id=678&atid=2677
|
17
|
+
which is probably a duplicate of the Bug previously reported by Kadvin XJ in
|
18
|
+
http://rubyforge.org/tracker/index.php?func=detail&aid=26182&group_id=678&atid=2677
|
19
|
+
where unchanged rows were marked as changed in the Excel-Writer while the
|
20
|
+
File was being written, triggering an Error.
|
21
|
+
|
22
|
+
* 1 minor enhancement
|
23
|
+
|
24
|
+
* Detect row offsets from Cell data if Row-Ops are missing
|
25
|
+
This fixes a bug reported by Alexander Logvinov in
|
26
|
+
http://rubyforge.org/tracker/index.php?func=detail&aid=26513&group_id=678&atid=2677
|
27
|
+
|
28
|
+
|
1
29
|
=== 0.6.4 / 2009-07-03
|
2
30
|
|
3
31
|
* 5 Bugfixes
|
data/Manifest.txt
CHANGED
@@ -40,9 +40,12 @@ lib/spreadsheet/row.rb
|
|
40
40
|
lib/spreadsheet/workbook.rb
|
41
41
|
lib/spreadsheet/worksheet.rb
|
42
42
|
lib/spreadsheet/writer.rb
|
43
|
+
test/data/test_changes.xls
|
43
44
|
test/data/test_copy.xls
|
44
45
|
test/data/test_datetime.xls
|
45
46
|
test/data/test_empty.xls
|
47
|
+
test/data/test_formula.xls
|
48
|
+
test/data/test_missing_row.xls
|
46
49
|
test/data/test_version_excel5.xls
|
47
50
|
test/data/test_version_excel95.xls
|
48
51
|
test/data/test_version_excel97.xls
|
data/README.txt
CHANGED
@@ -1,18 +1,18 @@
|
|
1
|
-
Last Update:
|
1
|
+
Last Update: 17.09.2009, 16.32 - hwyss
|
2
2
|
|
3
3
|
|
4
4
|
= Spreadsheet
|
5
5
|
|
6
|
-
|
7
|
-
|
6
|
+
http://spreadsheet.rubyforge.org
|
7
|
+
http://scm.ywesee.com/spreadsheet
|
8
8
|
|
9
9
|
For a viewable directory of all recent changes, please see:
|
10
10
|
|
11
|
-
|
11
|
+
http://scm.ywesee.com/?p=spreadsheet;a=summary
|
12
12
|
|
13
13
|
For Non-GPLv3 commercial licencing, please see:
|
14
14
|
|
15
|
-
|
15
|
+
http://www.spreadsheet.ch
|
16
16
|
|
17
17
|
|
18
18
|
== Description
|
data/bin/xlsopcodes
CHANGED
data/lib/spreadsheet.rb
CHANGED
@@ -226,6 +226,7 @@ module Internals
|
|
226
226
|
:string => 0x0207, # STRING ➜ 6.98
|
227
227
|
:style => 0x0293, # ●● STYLE ➜ 6.99
|
228
228
|
:xf => 0x00e0, # ●● XF ➜ 6.115
|
229
|
+
:sharedfmla => 0x04bc, # SHAREDFMLA ➜ 5.94
|
229
230
|
########################## Unhandled Opcodes ################################
|
230
231
|
:extsst => 0x00ff, # ● EXTSST ➜ 6.40
|
231
232
|
:index => 0x020b, # ○ INDEX ➜ 5.7 (Row Blocks), ➜ 6.55
|
@@ -16,10 +16,11 @@ module Spreadsheet
|
|
16
16
|
class Reader
|
17
17
|
include Spreadsheet::Encodings
|
18
18
|
include Spreadsheet::Excel::Internals
|
19
|
-
ROW_BLOCK_OPS =
|
20
|
-
:blank, :boolerr, :dbcell, :formula
|
21
|
-
:
|
22
|
-
|
19
|
+
ROW_BLOCK_OPS = {
|
20
|
+
:blank => true, :boolerr => true, :dbcell => true, :formula => true,
|
21
|
+
:label => true, :labelsst => true, :mulblank => true, :mulrk => true,
|
22
|
+
:number => true, :rk => true, :rstring => true,
|
23
|
+
}
|
23
24
|
def initialize opts = {}
|
24
25
|
@pos = 0
|
25
26
|
@bigendian = opts.fetch(:bigendian) {
|
@@ -378,6 +379,10 @@ class Reader
|
|
378
379
|
formula.value = value
|
379
380
|
elsif rtype == 0
|
380
381
|
pos, op, len, work = get_next_chunk
|
382
|
+
if op == :sharedfmla
|
383
|
+
## TODO: formula-support in 0.8.0
|
384
|
+
pos, op, len, work = get_next_chunk
|
385
|
+
end
|
381
386
|
if op == :string
|
382
387
|
formula.value = client read_string(work, 2), @workbook.encoding
|
383
388
|
else
|
@@ -804,6 +809,7 @@ class Reader
|
|
804
809
|
end
|
805
810
|
def read_worksheet worksheet, offset
|
806
811
|
@pos = offset
|
812
|
+
@detected_rows = {}
|
807
813
|
previous = nil
|
808
814
|
while tuple = get_next_chunk
|
809
815
|
pos, op, len, work = tuple
|
@@ -835,6 +841,10 @@ class Reader
|
|
835
841
|
read_hlink worksheet, work, pos, len
|
836
842
|
when :window2
|
837
843
|
read_window2 worksheet, work, pos, len
|
844
|
+
else
|
845
|
+
if ROW_BLOCK_OPS.include?(op)
|
846
|
+
set_missing_row_address worksheet, work, pos, len
|
847
|
+
end
|
838
848
|
end
|
839
849
|
previous = op
|
840
850
|
end
|
@@ -1021,6 +1031,21 @@ class Reader
|
|
1021
1031
|
cells.formats[column] = @workbook.format(xf) unless xf == 0
|
1022
1032
|
cells[column] = value
|
1023
1033
|
end
|
1034
|
+
def set_missing_row_address worksheet, work, pos, len
|
1035
|
+
# Offset Size Contents
|
1036
|
+
# 0 2 Index of this row
|
1037
|
+
# 2 2 Index to this column
|
1038
|
+
row_index, column_index = work.unpack 'v2'
|
1039
|
+
unless worksheet.offsets[row_index]
|
1040
|
+
@current_row_block_offset ||= [pos]
|
1041
|
+
data = {
|
1042
|
+
:index => row_index,
|
1043
|
+
:row_block => @current_row_block_offset,
|
1044
|
+
:offset => @current_row_block_offset[0],
|
1045
|
+
}
|
1046
|
+
worksheet.set_row_address row_index, data
|
1047
|
+
end
|
1048
|
+
end
|
1024
1049
|
def set_row_address worksheet, work, pos, len
|
1025
1050
|
# Offset Size Contents
|
1026
1051
|
# 0 2 Index of this row
|
@@ -45,7 +45,7 @@ class Worksheet < Spreadsheet::Worksheet
|
|
45
45
|
if addr = @row_addresses[idx]
|
46
46
|
row = @reader.read_row self, addr
|
47
47
|
[:default_format, :height, :outline_level, :hidden, ].each do |key|
|
48
|
-
row.send "#{key}=", addr[key]
|
48
|
+
row.send "unupdated_#{key}=", addr[key]
|
49
49
|
end
|
50
50
|
row.worksheet = self
|
51
51
|
row
|
@@ -265,6 +265,7 @@ class Worksheet
|
|
265
265
|
end
|
266
266
|
row_offsets.sort!
|
267
267
|
row_offsets.reverse!
|
268
|
+
control = changes.size
|
268
269
|
@worksheet.each do |row|
|
269
270
|
key = row.idx
|
270
271
|
if changes.include?(key) && !work.include?(key)
|
@@ -272,6 +273,13 @@ class Worksheet
|
|
272
273
|
work.store key, pair
|
273
274
|
end
|
274
275
|
end
|
276
|
+
if changes.size > control
|
277
|
+
warn <<-EOS
|
278
|
+
Your Worksheet was modified while it was being written. This should not happen.
|
279
|
+
Please contact the author (hannes dot wyss at gmail dot com) with a sample file
|
280
|
+
and minimal code that generates this warning. Thanks!
|
281
|
+
EOS
|
282
|
+
end
|
275
283
|
work = work.sort_by do |key, (pos, len)|
|
276
284
|
[pos, key.is_a?(Integer) ? key : -1]
|
277
285
|
end
|
data/lib/spreadsheet/row.rb
CHANGED
@@ -69,9 +69,9 @@ module Spreadsheet
|
|
69
69
|
# stored for the cell.
|
70
70
|
def default_format= format
|
71
71
|
@worksheet.add_format format if @worksheet
|
72
|
-
@worksheet.row_updated @idx, self if @worksheet
|
73
72
|
@default_format = format
|
74
73
|
end
|
74
|
+
format_updater :default_format
|
75
75
|
##
|
76
76
|
# #first_used the 0-based index of the first non-blank Cell.
|
77
77
|
def first_used
|
Binary file
|
data/test/data/test_datetime.xls
CHANGED
Binary file
|
Binary file
|
Binary file
|
data/test/excel/row.rb
CHANGED
@@ -24,6 +24,12 @@ class TestRow < Test::Unit::TestCase
|
|
24
24
|
d2 = row.datetime 1
|
25
25
|
assert_equal d1, d2
|
26
26
|
end
|
27
|
+
def test_datetime_overflow
|
28
|
+
row = Row.new @worksheet, 0, [nil, 40010.6666666666]
|
29
|
+
d1 = DateTime.new(2009,07,16,16)
|
30
|
+
d2 = row.datetime 1
|
31
|
+
assert_equal d1, d2
|
32
|
+
end
|
27
33
|
end
|
28
34
|
end
|
29
35
|
end
|
data/test/integration.rb
CHANGED
@@ -535,9 +535,19 @@ module Spreadsheet
|
|
535
535
|
assert_equal 00, time.min
|
536
536
|
assert_equal 00, time.sec
|
537
537
|
time = sheet[1,0]
|
538
|
+
assert_equal 1899, time.year
|
539
|
+
assert_equal 12, time.month
|
540
|
+
assert_equal 30, time.day
|
538
541
|
assert_equal 22, time.hour
|
539
542
|
assert_equal 30, time.min
|
540
543
|
assert_equal 45, time.sec
|
544
|
+
time = sheet[0,1]
|
545
|
+
assert_equal 1899, time.year
|
546
|
+
assert_equal 12, time.month
|
547
|
+
assert_equal 31, time.day
|
548
|
+
assert_equal 4, time.hour
|
549
|
+
assert_equal 30, time.min
|
550
|
+
assert_equal 45, time.sec
|
541
551
|
end
|
542
552
|
def test_change_encoding
|
543
553
|
path = File.join @data, 'test_version_excel95.xls'
|
@@ -1234,5 +1244,31 @@ module Spreadsheet
|
|
1234
1244
|
assert_equal date1, sheet.row(0).date(0)
|
1235
1245
|
assert_equal datetime1, sheet.row(1).datetime(0)
|
1236
1246
|
end
|
1247
|
+
def test_sharedfmla
|
1248
|
+
path = File.join @data, 'test_formula.xls'
|
1249
|
+
book = Spreadsheet.open path
|
1250
|
+
assert_instance_of Excel::Workbook, book
|
1251
|
+
sheet = book.worksheet 0
|
1252
|
+
64.times do |idx|
|
1253
|
+
assert_equal '5026', sheet[idx.next, 2].value
|
1254
|
+
end
|
1255
|
+
end
|
1256
|
+
def test_missing_row_op
|
1257
|
+
path = File.join @data, 'test_missing_row.xls'
|
1258
|
+
book = Spreadsheet.open path
|
1259
|
+
assert_instance_of Excel::Workbook, book
|
1260
|
+
sheet = book.worksheet 0
|
1261
|
+
assert_not_nil sheet[1,0]
|
1262
|
+
assert_not_nil sheet[2,1]
|
1263
|
+
end
|
1264
|
+
def test_changes
|
1265
|
+
path = File.join @data, 'test_changes.xls'
|
1266
|
+
book = Spreadsheet.open path
|
1267
|
+
assert_instance_of Excel::Workbook, book
|
1268
|
+
sheet = book.worksheet 1
|
1269
|
+
sheet[20,0] = 'Ciao Mundo!'
|
1270
|
+
target = File.join @var, 'test_changes.xls'
|
1271
|
+
assert_nothing_raised do book.write target end
|
1272
|
+
end
|
1237
1273
|
end
|
1238
1274
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spreadsheet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.4
|
4
|
+
version: 0.6.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hannes Wyss
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-09-17 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -30,9 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 2.3.3
|
34
34
|
version:
|
35
|
-
description:
|
35
|
+
description: |-
|
36
|
+
The Spreadsheet Library is designed to read and write Spreadsheet Documents.
|
37
|
+
As of version 0.6.0, only Microsoft Excel compatible spreadsheets are
|
38
|
+
supported. Spreadsheet is a combination/complete rewrite of the
|
39
|
+
Spreadsheet::Excel Library by Daniel J. Berger and the ParseExcel Library by
|
40
|
+
Hannes Wyss. Spreadsheet can read, write and modify Spreadsheet Documents.
|
36
41
|
email:
|
37
42
|
- hannes.wyss@gmail.com
|
38
43
|
executables:
|
@@ -88,9 +93,12 @@ files:
|
|
88
93
|
- lib/spreadsheet/workbook.rb
|
89
94
|
- lib/spreadsheet/worksheet.rb
|
90
95
|
- lib/spreadsheet/writer.rb
|
96
|
+
- test/data/test_changes.xls
|
91
97
|
- test/data/test_copy.xls
|
92
98
|
- test/data/test_datetime.xls
|
93
99
|
- test/data/test_empty.xls
|
100
|
+
- test/data/test_formula.xls
|
101
|
+
- test/data/test_missing_row.xls
|
94
102
|
- test/data/test_version_excel5.xls
|
95
103
|
- test/data/test_version_excel95.xls
|
96
104
|
- test/data/test_version_excel97.xls
|
@@ -103,7 +111,9 @@ files:
|
|
103
111
|
- test/workbook.rb
|
104
112
|
- test/worksheet.rb
|
105
113
|
has_rdoc: true
|
106
|
-
homepage:
|
114
|
+
homepage: http://spreadsheet.rubyforge.org
|
115
|
+
licenses: []
|
116
|
+
|
107
117
|
post_install_message:
|
108
118
|
rdoc_options:
|
109
119
|
- --main
|
@@ -125,9 +135,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
125
135
|
requirements: []
|
126
136
|
|
127
137
|
rubyforge_project: spreadsheet
|
128
|
-
rubygems_version: 1.3.
|
138
|
+
rubygems_version: 1.3.4
|
129
139
|
signing_key:
|
130
|
-
specification_version:
|
140
|
+
specification_version: 3
|
131
141
|
summary: The Spreadsheet Library is designed to read and write Spreadsheet Documents
|
132
142
|
test_files: []
|
133
143
|
|