simple_xlsx_reader 0.9.6 → 0.9.7
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 +7 -0
- data/CHANGELOG.md +6 -0
- data/lib/simple_xlsx_reader.rb +2 -1
- data/lib/simple_xlsx_reader/version.rb +1 -1
- data/test/performance_test.rb +111 -0
- data/test/sesame_street_blog.xlsx +0 -0
- data/test/simple_xlsx_reader_test.rb +41 -27
- metadata +21 -30
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6c495d2161ffcb0fb72029aa65b3030b01761030
|
4
|
+
data.tar.gz: 3064fcfd2ea46a5ede489cc32faff627740b569d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9468df9742e49b5d7c8eb830f724702b6e145dd50dc0f62e2330561091c7587364085ae850938e5853bb3ab5de744e2e87049d722e64d4989da06b5e9d0de09a
|
7
|
+
data.tar.gz: 029b31bff2274d01d43ff8498e76b6bdd7839621ed052af63c5348ec85fec90ce842831e5d739b39951a5807cf9ac6ff938343263709a17f826190afdc45d11d
|
data/CHANGELOG.md
CHANGED
data/lib/simple_xlsx_reader.rb
CHANGED
@@ -137,7 +137,8 @@ module SimpleXlsxReader
|
|
137
137
|
xcell.at_xpath('xmlns:is/xmlns:t') : xcell.at_xpath('xmlns:v')
|
138
138
|
|
139
139
|
cells << begin
|
140
|
-
self.class.cast(xvalue.text.strip, type, style,
|
140
|
+
self.class.cast(xvalue && xvalue.text.strip, type, style,
|
141
|
+
:shared_strings => shared_strings)
|
141
142
|
rescue => e
|
142
143
|
if !SimpleXlsxReader.configuration.catch_cell_load_errors
|
143
144
|
error = CellLoadError.new(
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'minitest/benchmark'
|
3
|
+
|
4
|
+
describe SimpleXlsxReader do
|
5
|
+
|
6
|
+
# n is 0-indexed for us, then converted to 1-indexed for excel
|
7
|
+
def build_row(n)
|
8
|
+
n += 1
|
9
|
+
<<-XML
|
10
|
+
<row>
|
11
|
+
<c r='A#{n}' s='0'>
|
12
|
+
<v>Cell A#{n}</v>
|
13
|
+
</c>
|
14
|
+
<c r='B#{n}' s='1'>
|
15
|
+
<v>2.4</v>
|
16
|
+
</c>
|
17
|
+
<c r='C#{n}' s='2'>
|
18
|
+
<v>30687</v>
|
19
|
+
</c>
|
20
|
+
<c r='D#{n}' t='inlineStr' s='0'>
|
21
|
+
<is><t>Cell D#{n}</t></is>
|
22
|
+
</c>
|
23
|
+
|
24
|
+
<c r='E#{n}' s='0'>
|
25
|
+
<v>Cell E#{n}</v>
|
26
|
+
</c>
|
27
|
+
<c r='F#{n}' s='1'>
|
28
|
+
<v>2.4</v>
|
29
|
+
</c>
|
30
|
+
<c r='G#{n}' s='2'>
|
31
|
+
<v>30687</v>
|
32
|
+
</c>
|
33
|
+
<c r='H#{n}' t='inlineStr' s='0'>
|
34
|
+
<is><t>Cell H#{n}</t></is>
|
35
|
+
</c>
|
36
|
+
|
37
|
+
<c r='I#{n}' s='0'>
|
38
|
+
<v>Cell I#{n}</v>
|
39
|
+
</c>
|
40
|
+
<c r='J#{n}' s='1'>
|
41
|
+
<v>2.4</v>
|
42
|
+
</c>
|
43
|
+
<c r='K#{n}' s='2'>
|
44
|
+
<v>30687</v>
|
45
|
+
</c>
|
46
|
+
<c r='L#{n}' t='inlineStr' s='0'>
|
47
|
+
<is><t>Cell L#{n}</t></is>
|
48
|
+
</c>
|
49
|
+
</row>
|
50
|
+
XML
|
51
|
+
end
|
52
|
+
|
53
|
+
before do
|
54
|
+
base = Nokogiri::XML(
|
55
|
+
<<-XML
|
56
|
+
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
|
57
|
+
<sheetData>
|
58
|
+
</sheetData>
|
59
|
+
</worksheet>
|
60
|
+
XML
|
61
|
+
)
|
62
|
+
base.at_xpath("/xmlns:worksheet/xmlns:sheetData").add_child(build_row(0))
|
63
|
+
|
64
|
+
@xml = SimpleXlsxReader::Document::Xml.new.tap do |xml|
|
65
|
+
xml.sheets = [base]
|
66
|
+
|
67
|
+
# s='0' above refers to the value of numFmtId at cellXfs index 0,
|
68
|
+
# which is in this case 'General' type
|
69
|
+
xml.styles = Nokogiri::XML(
|
70
|
+
<<-XML
|
71
|
+
<styleSheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
|
72
|
+
<cellXfs count="1">
|
73
|
+
<xf numFmtId="0" />
|
74
|
+
<xf numFmtId="2" />
|
75
|
+
<xf numFmtId="14" />
|
76
|
+
</cellXfs>
|
77
|
+
</styleSheet>
|
78
|
+
XML
|
79
|
+
)
|
80
|
+
end
|
81
|
+
|
82
|
+
# Every new sheet has one more row
|
83
|
+
self.class.bench_range.each do |range|
|
84
|
+
sheet = base.clone
|
85
|
+
|
86
|
+
range.times do |n|
|
87
|
+
sheet.xpath("/xmlns:worksheet/xmlns:sheetData/xmlns:row").last.
|
88
|
+
add_next_sibling(build_row(n))
|
89
|
+
end
|
90
|
+
|
91
|
+
@xml.sheets[range] = sheet
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def self.bench_range
|
96
|
+
bench_exp(1,1000)
|
97
|
+
end
|
98
|
+
|
99
|
+
bench_performance_linear 'parses sheets in linear time', 0.9999 do |n|
|
100
|
+
|
101
|
+
raise "not enough sample data; asked for #{n}, only have #{@xml.sheets.count}"\
|
102
|
+
if @xml.sheets[n].nil?
|
103
|
+
|
104
|
+
sheet = SimpleXlsxReader::Document::Mapper.new(@xml).
|
105
|
+
parse_sheet('test', @xml.sheets[n])
|
106
|
+
|
107
|
+
raise "sheet didn't parse correctly; expected #{n + 1} rows, got #{sheet.rows.count}"\
|
108
|
+
if sheet.rows.count != n + 1
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
Binary file
|
@@ -18,7 +18,8 @@ describe SimpleXlsxReader do
|
|
18
18
|
[["Author Name", "Title", "Body", "Created At", "Comment Count"],
|
19
19
|
["Big Bird", "The Number 1", "The Greatest", Time.parse("2002-01-01 11:00:00 UTC"), 1],
|
20
20
|
["Big Bird", "The Number 2", "Second Best", Time.parse("2002-01-02 14:00:00 UTC"), 2],
|
21
|
-
["Big Bird", "Formula Dates", "Tricky tricky", Time.parse("2002-01-03 14:00:00 UTC"), 0]
|
21
|
+
["Big Bird", "Formula Dates", "Tricky tricky", Time.parse("2002-01-03 14:00:00 UTC"), 0],
|
22
|
+
["Empty Eagress", nil, "The title, date, and comment have types, but no values", nil, nil]]
|
22
23
|
})
|
23
24
|
end
|
24
25
|
end
|
@@ -239,20 +240,25 @@ describe SimpleXlsxReader do
|
|
239
240
|
xml.sheets = [Nokogiri::XML(
|
240
241
|
<<-XML
|
241
242
|
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
|
242
|
-
<dimension ref="A1:
|
243
|
+
<dimension ref="A1:G1" />
|
243
244
|
<sheetData>
|
244
245
|
<row>
|
245
246
|
<c r='A1' s='0'>
|
246
247
|
<v>Cell A1</v>
|
247
248
|
</c>
|
249
|
+
|
248
250
|
<c r='C1' s='1'>
|
249
251
|
<v>2.4</v>
|
250
252
|
</c>
|
251
|
-
<c r='D1' s='
|
252
|
-
|
253
|
+
<c r='D1' s='1' />
|
254
|
+
|
255
|
+
<c r='E1' s='2'>
|
256
|
+
<v>30687</v>
|
253
257
|
</c>
|
254
|
-
<c r='
|
255
|
-
|
258
|
+
<c r='F1' s='2' />
|
259
|
+
|
260
|
+
<c r='G1' t='inlineStr' s='0'>
|
261
|
+
<is><t>Cell G1</t></is>
|
256
262
|
</c>
|
257
263
|
</row>
|
258
264
|
</sheetData>
|
@@ -274,34 +280,42 @@ describe SimpleXlsxReader do
|
|
274
280
|
XML
|
275
281
|
)
|
276
282
|
end
|
283
|
+
end
|
277
284
|
|
278
|
-
|
279
|
-
|
280
|
-
|
285
|
+
before do
|
286
|
+
@row = described_class.new(xml).parse_sheet('test', xml.sheets.first).rows[0]
|
287
|
+
end
|
281
288
|
|
282
|
-
|
283
|
-
|
284
|
-
|
289
|
+
it "reads 'Generic' cells as strings" do
|
290
|
+
@row[0].must_equal "Cell A1"
|
291
|
+
end
|
285
292
|
|
286
|
-
|
287
|
-
|
288
|
-
|
293
|
+
it "reads empty 'Generic' cells as nil" do
|
294
|
+
@row[1].must_equal nil
|
295
|
+
end
|
289
296
|
|
290
|
-
|
291
|
-
|
292
|
-
|
297
|
+
# We could expand on these type tests, but really just a couple
|
298
|
+
# demonstrate that it's wired together. Type-specific tests should go
|
299
|
+
# on #cast
|
293
300
|
|
294
|
-
|
295
|
-
|
296
|
-
|
301
|
+
it "reads floats" do
|
302
|
+
@row[2].must_equal 2.4
|
303
|
+
end
|
297
304
|
|
298
|
-
|
299
|
-
|
300
|
-
|
305
|
+
it "reads empty floats as nil" do
|
306
|
+
@row[3].must_equal nil
|
307
|
+
end
|
301
308
|
|
302
|
-
|
303
|
-
|
304
|
-
|
309
|
+
it "reads dates" do
|
310
|
+
@row[4].must_equal Date.parse('Jan 6, 1984')
|
311
|
+
end
|
312
|
+
|
313
|
+
it "reads empty date cells as nil" do
|
314
|
+
@row[5].must_equal nil
|
315
|
+
end
|
316
|
+
|
317
|
+
it "reads strings formatted as inlineStr" do
|
318
|
+
@row[6].must_equal 'Cell G1'
|
305
319
|
end
|
306
320
|
end
|
307
321
|
end
|
metadata
CHANGED
@@ -1,78 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_xlsx_reader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
version: 0.9.6
|
4
|
+
version: 0.9.7
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Woody Peterson
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-07-30 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: nokogiri
|
16
|
-
type: :runtime
|
17
15
|
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
16
|
requirements:
|
20
|
-
- -
|
17
|
+
- - '>='
|
21
18
|
- !ruby/object:Gem::Version
|
22
19
|
version: '0'
|
20
|
+
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rubyzip
|
32
|
-
type: :runtime
|
33
29
|
requirement: !ruby/object:Gem::Requirement
|
34
|
-
none: false
|
35
30
|
requirements:
|
36
|
-
- -
|
31
|
+
- - '>='
|
37
32
|
- !ruby/object:Gem::Version
|
38
33
|
version: '0'
|
34
|
+
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: minitest
|
48
|
-
type: :development
|
49
43
|
requirement: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
44
|
requirements:
|
52
|
-
- -
|
45
|
+
- - '>='
|
53
46
|
- !ruby/object:Gem::Version
|
54
47
|
version: '0'
|
48
|
+
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - '>='
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: pry
|
64
|
-
type: :development
|
65
57
|
requirement: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
58
|
requirements:
|
68
|
-
- -
|
59
|
+
- - '>='
|
69
60
|
- !ruby/object:Gem::Version
|
70
61
|
version: '0'
|
62
|
+
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - '>='
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: '0'
|
78
69
|
description: Read xlsx data the Ruby way
|
@@ -91,6 +82,7 @@ files:
|
|
91
82
|
- lib/simple_xlsx_reader.rb
|
92
83
|
- lib/simple_xlsx_reader/version.rb
|
93
84
|
- simple_xlsx_reader.gemspec
|
85
|
+
- test/performance_test.rb
|
94
86
|
- test/sesame_street_blog.xlsx
|
95
87
|
- test/shared_strings.xml
|
96
88
|
- test/simple_xlsx_reader_test.rb
|
@@ -98,32 +90,31 @@ files:
|
|
98
90
|
- test/test_helper.rb
|
99
91
|
homepage: ''
|
100
92
|
licenses: []
|
93
|
+
metadata: {}
|
101
94
|
post_install_message:
|
102
95
|
rdoc_options: []
|
103
96
|
require_paths:
|
104
97
|
- lib
|
105
98
|
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
-
none: false
|
107
99
|
requirements:
|
108
|
-
- -
|
100
|
+
- - '>='
|
109
101
|
- !ruby/object:Gem::Version
|
110
102
|
version: '0'
|
111
103
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
|
-
none: false
|
113
104
|
requirements:
|
114
|
-
- -
|
105
|
+
- - '>='
|
115
106
|
- !ruby/object:Gem::Version
|
116
107
|
version: '0'
|
117
108
|
requirements: []
|
118
109
|
rubyforge_project:
|
119
|
-
rubygems_version:
|
110
|
+
rubygems_version: 2.0.3
|
120
111
|
signing_key:
|
121
|
-
specification_version:
|
112
|
+
specification_version: 4
|
122
113
|
summary: Read xlsx data the Ruby way
|
123
114
|
test_files:
|
115
|
+
- test/performance_test.rb
|
124
116
|
- test/sesame_street_blog.xlsx
|
125
117
|
- test/shared_strings.xml
|
126
118
|
- test/simple_xlsx_reader_test.rb
|
127
119
|
- test/styles.xml
|
128
120
|
- test/test_helper.rb
|
129
|
-
has_rdoc:
|