workbook 0.6 → 0.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ca12f4d088bcc71159ed61caae720bdc19457bc0
4
- data.tar.gz: 95109a2df0f6c2c6759486fe94d3c61d28e4cf7d
3
+ metadata.gz: e6be5061a431a70bb33a5f09f77260bc6b43c806
4
+ data.tar.gz: c29da70505ab5d7e16820ec96c28600388ed56d3
5
5
  SHA512:
6
- metadata.gz: e7b4eef2a1fcb1d4600379b17c7a08584387ca188c8a13bb2bffc4fadbf0315585d8ed7e2d057b2e664970bbdd5e3ac38dff8d032f77b924dca9f0d1d2f1911a
7
- data.tar.gz: 89b85aeca814d7fe4f3dc5b6fcab22452d8a496dd45d125f9ad2fb6582a3bfc88144573db7bd5964a68a1201792cd37094cae90f5c1c0d099e1cf208e1d11d1f
6
+ metadata.gz: 6880c1ea1b7bc8bd49c27a7e19a08ffa74f7e62e628a9dfe4fb81c1a0cac65bc83099d428ec2973d9fc2ea7742a9faa6eb677866050efdbd2c4d2e8616431c3d
7
+ data.tar.gz: 54a41200b7ec799da9920120426fc2e883d208a1afd1dfdb135c5639316ec499316142b756e2265edf1134bcfb5bb55343d44d82667e04c52f81c63b9e77c0e7
data/README.md CHANGED
@@ -59,7 +59,7 @@ Alternatively (more spreadsheet like) you can read cells like this (writing to b
59
59
  If you want to use an existing file as a template (which you can create in Excel to create nice looking templates),
60
60
  simply clone the row, and add it back:
61
61
 
62
- b = Workbook::Book.import("template.xls")
62
+ b = Workbook::Book.open("template.xls")
63
63
  table = b.sheet.table
64
64
  template_row = table[1] # can be any, but I typically have a well
65
65
  # formatted header row + an example template
@@ -78,7 +78,7 @@ simply clone the row, and add it back:
78
78
  Another typical use case is exporting a list of ActiveRecord-objects to xls (it is assumed that the headers of the excel-table correspond
79
79
  (like "Total order price" and `total_order_price` match) to the headers of the database-table ):
80
80
 
81
- b = Workbook::Book.import("template.xls")
81
+ b = Workbook::Book.open("template.xls")
82
82
  table = b.sheet.table
83
83
  template_row = table[1] # see above
84
84
  Order.where("created_at > ?", Time.now - 1.week).each do |order|
@@ -76,6 +76,18 @@ module Workbook
76
76
  @default = Cell.new(value)
77
77
  end
78
78
 
79
-
79
+ class << self
80
+ # Helps to convert from e.g. "AA" to 26
81
+ # @param [String] string that typically identifies a column
82
+ # @return [Integer]
83
+ def alpha_index_to_number_index string
84
+ string.upcase!
85
+ sum = 0
86
+ string.chars.each_with_index do | char, char_index|
87
+ sum = sum * 26 + char.unpack('U')[0]-64
88
+ end
89
+ return sum-1
90
+ end
91
+ end
80
92
  end
81
93
  end
@@ -99,7 +99,7 @@ module Workbook
99
99
  if self[:numberformat]
100
100
  if self[:numberformat].to_s.match("h")
101
101
  :time
102
- elsif self[:numberformat].to_s.match("y")
102
+ elsif self[:numberformat].to_s.match(/y/i)
103
103
  :date
104
104
  end
105
105
  end
@@ -52,21 +52,24 @@ module Workbook
52
52
  # create an overview of the differences between itself with another 'previous' table, returns a book with a single sheet and table (containing the diffs)
53
53
  #
54
54
  # @return [Workbook::Table] the return result
55
- def diff other, options={:sort=>true,:ignore_headers=>false}
55
+ def diff other, options={}
56
+ options = {:sort=>true,:ignore_headers=>false}.merge(options)
56
57
 
57
58
  aligned = align(other, options)
58
59
  aself = aligned[:self]
59
60
  aother = aligned[:other]
61
+
60
62
  iteration_cols = []
61
63
  if options[:ignore_headers]
62
64
  iteration_cols = [aother.first.count,aself.first.count].max.times.collect
63
65
  else
64
66
  iteration_cols = (aother.header.to_symbols+aother.header.to_symbols).uniq
65
67
  end
68
+
66
69
  diff_table = diff_template
67
70
  maxri = (aself.count-1)
71
+
68
72
  for ri in 0..maxri do
69
- row = diff_table[ri]
70
73
  row = diff_table[ri] = Workbook::Row.new(nil, diff_table)
71
74
  srow = aself[ri]
72
75
  orow = aother[ri]
@@ -74,24 +77,7 @@ module Workbook
74
77
  iteration_cols.each_with_index do |ch, ci|
75
78
  scell = srow[ch]
76
79
  ocell = orow[ch]
77
- dcell = scell.nil? ? Workbook::Cell.new(nil) : scell
78
- if (scell == ocell)
79
- dcell.format = scell.format if scell
80
- elsif scell.nil?
81
- dcell = Workbook::Cell.new "(was: #{ocell.to_s})"
82
- dcell.format = diff_template.template.create_or_find_format_by 'destroyed'
83
- elsif ocell.nil?
84
- dcell = scell.clone
85
- fmt = scell.nil? ? :default : scell.format[:number_format]
86
- f = diff_template.template.create_or_find_format_by 'created', fmt
87
- f[:number_format] = scell.format[:number_format]
88
- dcell.format = f
89
- elsif scell != ocell
90
- dcell = Workbook::Cell.new "#{scell.to_s} (was: #{ocell.to_s})"
91
- f = diff_template.template.create_or_find_format_by 'updated'
92
- dcell.format = f
93
- end
94
- row[ci]=dcell
80
+ row[ci] = create_diff_cell(scell, ocell)
95
81
  end
96
82
  end
97
83
  if !options[:ignore_headers]
@@ -101,6 +87,31 @@ module Workbook
101
87
  diff_table
102
88
  end
103
89
 
90
+ # creates a new cell describing the difference between two cells
91
+ #
92
+ # @return [Workbook::Cell] the diff cell
93
+ def create_diff_cell(scell, ocell)
94
+ dcell = scell.nil? ? Workbook::Cell.new(nil) : scell
95
+ if (scell == ocell)
96
+ dcell.format = scell.format if scell
97
+ elsif scell.nil?
98
+ dcell = Workbook::Cell.new "(was: #{ocell.to_s})"
99
+ dcell.format = diff_template.template.create_or_find_format_by 'destroyed'
100
+ elsif ocell.nil?
101
+ dcell = scell.clone
102
+ fmt = scell.nil? ? :default : scell.format[:number_format]
103
+ f = diff_template.template.create_or_find_format_by 'created', fmt
104
+ f[:number_format] = scell.format[:number_format]
105
+ dcell.format = f
106
+ elsif scell != ocell
107
+ dcell = Workbook::Cell.new "#{scell.to_s} (was: #{ocell.to_s})"
108
+ f = diff_template.template.create_or_find_format_by 'updated'
109
+ dcell.format = f
110
+ end
111
+
112
+ dcell
113
+ end
114
+
104
115
  # Return template table to write the diff result in; in case non exists a default is generated.
105
116
  #
106
117
  # @return [Workbook::Table] the empty table, linked to a book
@@ -20,16 +20,18 @@ module Workbook
20
20
  def parse_csv csv_raw, options={}
21
21
  custom_date_converter = Workbook::Cell.new.string_optimistic_date_converter
22
22
  options = {
23
- converters: [:float,:integer,:date,:date_time,custom_date_converter]
23
+ converters: [:all,custom_date_converter]
24
24
  }.merge(options)
25
25
 
26
26
  csv=nil
27
- #begin
28
- csv = csv_lib.parse(csv_raw,options)
27
+ begin
28
+ csv = csv_lib.parse(csv_raw,options)
29
29
 
30
- #rescue
31
- # we're going to have another shot at it...
32
- #end
30
+ rescue CSV::MalformedCSVError
31
+ csv_excel = csv_lib.parse(csv_raw,options.merge({:col_sep=>';'}))
32
+ csv = csv_excel if csv_excel[0].count > 1
33
+
34
+ end
33
35
 
34
36
  if csv==nil or csv[0].count == 1
35
37
  csv_excel = csv_lib.parse(csv_raw,options.merge({:col_sep=>';'}))
@@ -12,7 +12,7 @@ module Workbook
12
12
  sp = Spreadsheet.open(file_obj, 'rb')
13
13
  template.add_raw sp
14
14
  parse_xls sp, options
15
- rescue Ole::Storage::FormatError => e
15
+ rescue Ole::Storage::FormatError
16
16
  begin
17
17
  # Assuming it is a tab separated txt inside .xls
18
18
  import(file_obj.path, 'txt')
@@ -146,29 +146,53 @@ module Workbook
146
146
  col
147
147
  end
148
148
  def parse_xlsx_row row
149
- cells = row.css('c').collect{|a| parse_xlsx_cell(a)}
150
- row = Workbook::Row.new(cells)
149
+ cells_with_pos = row.css('c').collect{|a| parse_xlsx_cell(a)}
150
+ row = Workbook::Row.new
151
+ cells_with_pos.each do |cell_with_pos|
152
+ position = cell_with_pos[:position]
153
+ col = position.match(/^[A-Z]*/).to_s
154
+ row[col] = cell_with_pos[:cell]
155
+ end
156
+ row = pad_xlsx_row(row)
157
+ row
158
+ end
159
+
160
+ def pad_xlsx_row(row)
161
+ row.each_with_index do |cell, index|
162
+ row[index]=Workbook::Cell.new(nil) if cell.nil? and !cell.is_a?(Workbook::Cell)
163
+ end
164
+ row
151
165
  end
166
+
152
167
  def parse_xlsx_cell cell
153
168
  # style_id = cell.attr('s')
154
169
  # p cell
155
170
  type = cell.attr('t')
156
171
  formatIndex = cell.attr('s').to_i
172
+ position = cell.attr('r')
173
+ formula = cell.css('f').text()
157
174
  value = cell.text
158
175
  fmt = template.formats[formatIndex]
176
+
159
177
  # puts type
160
178
  if type == "n" or type == nil
161
179
  if fmt.derived_type == :date
162
180
  value = xls_number_to_date(value)
163
181
  elsif fmt.derived_type == :time
164
182
  value = xls_number_to_time(value)
183
+ elsif formula == "TRUE()"
184
+ value = true
185
+ elsif formula == "FALSE()"
186
+ value = false
165
187
  elsif type == "n"
166
188
  value = value.match(/\./) ? value.to_f : value.to_i
167
189
  end
168
190
  elsif type == "s"
169
191
  value = @shared_strings[value.to_i]
170
192
  end
171
- Workbook::Cell.new(value, format: fmt)
193
+ cell = Workbook::Cell.new(value, format: fmt)
194
+ cell.formula = formula
195
+ {cell: cell, position: position}
172
196
  end
173
197
  def parse_xlsx
174
198
  end
data/lib/workbook/row.rb CHANGED
@@ -18,8 +18,9 @@ module Workbook
18
18
  cells = [] if cells==nil
19
19
  self.table= table
20
20
  cells.each do |c|
21
- c = c.clone if options[:clone_cells]
22
- unless c.is_a? Workbook::Cell
21
+ if c.is_a? Workbook::Cell
22
+ c = c.clone if options[:clone_cells]
23
+ else
23
24
  c = Workbook::Cell.new(c, {row:self})
24
25
  c.parse!(options[:cell_parse_options]) if options[:parse_cells_on_batch_creation]
25
26
  end
@@ -91,10 +92,11 @@ module Workbook
91
92
  end
92
93
 
93
94
 
94
- # Overrides normal Array's []-function with support for symbols that identify a column based on the header-values
95
+ # Overrides normal Array's []-function with support for symbols that identify a column based on the header-values and / or
95
96
  #
96
97
  # @example Lookup using fixnum or header value encoded as symbol
97
98
  # row[1] #=> <Cell value="a">
99
+ # row["A"] #=> <Cell value="a">
98
100
  # row[:a] #=> <Cell value="a">
99
101
  #
100
102
  # @param [Fixnum, Symbol, String] index_or_hash that identifies the column (strings are converted to symbols)
@@ -107,6 +109,9 @@ module Workbook
107
109
  rescue NoMethodError
108
110
  end
109
111
  return rv
112
+ elsif index_or_hash.is_a? String and index_or_hash.match(/^[A-Z]*$/)
113
+ # it looks like a column indicator
114
+ return to_a[Workbook::Column.alpha_index_to_number_index(index_or_hash)]
110
115
  elsif index_or_hash.is_a? String
111
116
  symbolized = Workbook::Cell.new(index_or_hash, {row:self}).to_sym
112
117
  self[symbolized]
@@ -130,6 +135,9 @@ module Workbook
130
135
  index = index_or_hash
131
136
  if index_or_hash.is_a? Symbol
132
137
  index = table_header_keys.index(index_or_hash)
138
+ elsif index_or_hash.is_a? String and index_or_hash.match(/^[A-Z]*$/)
139
+ # it looks like a column indicator
140
+ index = Workbook::Column.alpha_index_to_number_index(index_or_hash)
133
141
  elsif index_or_hash.is_a? String
134
142
  symbolized = Workbook::Cell.new(index_or_hash, {row:self}).to_sym
135
143
  index = table_header_keys.index(symbolized)
@@ -177,7 +177,7 @@ module Workbook
177
177
  def [](index_or_string)
178
178
  if index_or_string.is_a? String
179
179
  match = index_or_string.match(/([A-Z]+)([0-9]*)/i)
180
- col_index = alpha_index_to_number_index(match[1])
180
+ col_index = Workbook::Column.alpha_index_to_number_index(match[1])
181
181
  row_index = match[2].to_i - 1
182
182
  return self[row_index][col_index]
183
183
  elsif index_or_string.is_a? Range
@@ -201,7 +201,7 @@ module Workbook
201
201
  def []= (index_or_string, new_value)
202
202
  if index_or_string.is_a? String
203
203
  match = index_or_string.upcase.match(/([A-Z]*)([0-9]*)/)
204
- cell_index = alpha_index_to_number_index(match[1])
204
+ cell_index = Workbook::Column.alpha_index_to_number_index(match[1])
205
205
  row_index = match[2].to_i - 1
206
206
  self[row_index][cell_index].value = new_value
207
207
  else
@@ -212,18 +212,6 @@ module Workbook
212
212
  end
213
213
  end
214
214
 
215
- # Helps to convert from e.g. "AA" to 26
216
- # @param [String] string that typically identifies a column
217
- # @return [Integer]
218
- def alpha_index_to_number_index string
219
- string.upcase!
220
- sum = 0
221
- string.chars.each_with_index do | char, char_index|
222
- sum = sum * 26 + char.unpack('U')[0]-64
223
- end
224
- return sum-1
225
- end
226
-
227
215
  # remove all the trailing empty-rows (returning a trimmed clone)
228
216
  #
229
217
  # @param [Integer] desired_row_length of the rows
@@ -1,4 +1,4 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  module Workbook
3
- VERSION = '0.6'
3
+ VERSION = '0.7'
4
4
  end
@@ -0,0 +1,3 @@
1
+ artikel;aantal;bedrag;reservering;aanmaaktijd_reservering;gastnummer;titel;voorletters;tussenvoegsels;naam;straat;huisnummer;postcode;woonplaats;email;tel_land;tel_net;tel_abon
2
+ "Vriend - € 50";1;50.00;123;2016-10-27;7891;asdf;A.;;asdf;"asdf ";55;"1234 LM";AMSTERDAM;a@example.com;053;;123123
3
+ "Vriend - € 35";1;35.00;123;2016-11-02;5676;"Dasdfr";B.;;asdf;"asdf asdf";12;"1234 NN";UTRECHT;b@example.com;+31;074;123123
data/test/test_column.rb CHANGED
@@ -51,4 +51,15 @@ class TestColumn < Minitest::Test
51
51
  t[2].delete_at(3)
52
52
  assert_equal([:boolean, :float, :string, :integer], t.columns.collect{|a| a.column_type})
53
53
  end
54
+
55
+ def test_alpha_index_to_number_index
56
+ assert_equal(0,Workbook::Column.alpha_index_to_number_index("A"))
57
+ assert_equal(2,Workbook::Column.alpha_index_to_number_index("C"))
58
+ assert_equal(25,Workbook::Column.alpha_index_to_number_index("Z"))
59
+ assert_equal(26,Workbook::Column.alpha_index_to_number_index("AA"))
60
+ assert_equal(27,Workbook::Column.alpha_index_to_number_index("AB"))
61
+ assert_equal(51,Workbook::Column.alpha_index_to_number_index("AZ"))
62
+ assert_equal(52,Workbook::Column.alpha_index_to_number_index("BA"))
63
+ assert_equal((27*26)-1,Workbook::Column.alpha_index_to_number_index("ZZ"))
64
+ end
54
65
  end
@@ -99,5 +99,9 @@ module Readers
99
99
  w = Workbook::Book.read("2013-03-19,JV,211,032,1,DBG A,,13,0147,\n", :csv, {converters: []})
100
100
  assert_equal("2013-03-19,JV,211,032,1,DBG A,,13,0147,\n",w.sheet.table.to_csv)
101
101
  end
102
+ def test_semi_colon_separated_csv
103
+ w = Workbook::Book.open(File.join(File.dirname(__FILE__), 'artifacts/semicolonseparated_in_csv.csv'))
104
+ assert_equal("artikel,aantal,bedrag,reservering,aanmaaktijd_reservering,gastnummer,titel,voorletters,tussenvoegsels,naam,straat,huisnummer,postcode,woonplaats,email,tel_land,tel_net,tel_abon\nVriend - € 50,1,50.0,123,2016-10-27,7891,asdf,A.,,asdf,asdf ,55,1234 LM,AMSTERDAM,a@example.com,43,,123123\nVriend - € 35,1,35.0,123,2016-11-02,5676,Dasdfr,B.,,asdf,asdf asdf,12,1234 NN,UTRECHT,b@example.com,31,60,123123\n", w.sheet.table.to_csv)
105
+ end
102
106
  end
103
107
  end
@@ -39,7 +39,7 @@ module Readers
39
39
  assert_equal(Date.new(2012,2,22),w.sheet.table[1][:a].value)
40
40
  assert_equal("c",w.sheet.table[2][:a].value)
41
41
  assert_equal(DateTime.new(2012,1,22,11),w.sheet.table[3][:a].value)
42
- assert_equal(42000,w.sheet.table[3][:b].value)
42
+ assert_equal("42000",w.sheet.table[3][:b].value.to_s)
43
43
  assert_nil(w.sheet.table[2][:c].value)
44
44
  end
45
45
 
@@ -33,9 +33,30 @@ module Readers
33
33
  assert_equal("2",w.sheet.table[1][1].value.to_s)
34
34
  assert_equal(2,w.sheet.table[1][1].value)
35
35
  end
36
+ def test_different_types_xlsx
37
+ w = Workbook::Book.open File.join(File.dirname(__FILE__), 'artifacts/excel_different_types.xlsx')
38
+ t = w.sheet.table
39
+ assert_equal("ls",t["D4"].value)
40
+ assert_equal(true,t["C3"].value)
41
+ assert_equal("c",t["C1"].value)
42
+ assert_equal(222,t["B3"].value)
43
+ assert_equal(4.23,t["C2"].value)
44
+ assert(t["A4"].value.is_a?(Date))
45
+ assert((DateTime.new(2012,1,22,11)-t["A4"].value) < 0.00001)
46
+ assert_equal(42000,t["B4"].value)
47
+ assert_equal(42000.22323,t["D2"].value)
48
+ assert(t["A2"].value.is_a?(Date))
49
+ assert((Date.new(2012,2,22)-t["A2"].value) < 0.00001)
50
+ assert((Date.new(2014,12,27)-t["B2"].value) < 0.00001)
51
+ end
36
52
  def test_bit_table_xlsx
37
53
  b = Workbook::Book.open File.join(File.dirname(__FILE__), 'artifacts/bigtable.xlsx')
38
54
  assert_equal(553, b.sheet.table.count)
39
55
  end
56
+ def test_xlsx_with_empty_start
57
+ b = Workbook::Book.open File.join(File.dirname(__FILE__), 'artifacts/xlsx_with_empty_start.xlsx')
58
+ t = b.sheet.table
59
+ assert_nil(t["A3"].value)
60
+ end
40
61
  end
41
62
  end
data/test/test_row.rb CHANGED
@@ -244,13 +244,22 @@ class TestRow < Minitest::Test
244
244
  row[1]= 12
245
245
  assert_equal(12, table.last["b"])
246
246
  assert_nil(table.last["a"])
247
+ end
247
248
 
249
+ def test_find_by_column_string
250
+ b = Workbook::Book.new
251
+ table = b.sheet.table
252
+ table << Workbook::Row.new(["b","a"])
253
+ row = Workbook::Row.new([],table)
254
+ row[1]= 12
255
+ assert_equal(12, table.last["B"])
256
+ assert_nil(table.last["A"])
248
257
  end
249
258
 
250
259
  def test_row_hash_index_string_assignment
251
260
  b = Workbook::Book.new
252
261
  table = b.sheet.table
253
- table << Workbook::Row.new(["a","b"])
262
+ table << Workbook::Row.new(["a","b","d"])
254
263
  row = Workbook::Row.new([],table)
255
264
  row[1]= 12
256
265
  assert_equal(12, table.last.last.value)
@@ -258,6 +267,8 @@ class TestRow < Minitest::Test
258
267
  assert_equal(15, table.last.last.value)
259
268
  row["b"]= 18
260
269
  assert_equal(18, table.last.last.value)
270
+ row["C"]= 2
271
+ assert_equal(2, table.last[2].value)
261
272
  end
262
273
 
263
274
  def test_trim!
data/test/test_table.rb CHANGED
@@ -111,19 +111,6 @@ class TestTable< Minitest::Test
111
111
  assert_equal(4,t["B4"].value)
112
112
  end
113
113
 
114
- def test_alpha_index_to_number_index
115
- w = Workbook::Book.new
116
- t = w.sheet.table
117
- assert_equal(0,t.alpha_index_to_number_index("A"))
118
- assert_equal(2,t.alpha_index_to_number_index("C"))
119
- assert_equal(25,t.alpha_index_to_number_index("Z"))
120
- assert_equal(26,t.alpha_index_to_number_index("AA"))
121
- assert_equal(27,t.alpha_index_to_number_index("AB"))
122
- assert_equal(51,t.alpha_index_to_number_index("AZ"))
123
- assert_equal(52,t.alpha_index_to_number_index("BA"))
124
- assert_equal((27*26)-1,t.alpha_index_to_number_index("ZZ"))
125
- end
126
-
127
114
  def test_multirowselect_through_collections
128
115
  w = Workbook::Book.new [["a","b"],[1,2],[3,4]]
129
116
  t = w.sheet.table
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: workbook
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.6'
4
+ version: '0.7'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Maarten Brouwers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-03-06 00:00:00.000000000 Z
11
+ date: 2017-03-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruby-prof
@@ -199,6 +199,7 @@ files:
199
199
  - test/artifacts/heavy.xlsx
200
200
  - test/artifacts/integer_test.xlsx
201
201
  - test/artifacts/native_xlsx.xlsx
202
+ - test/artifacts/semicolonseparated_in_csv.csv
202
203
  - test/artifacts/sheet_with_combined_cells.ods
203
204
  - test/artifacts/sheetduplication.xls
204
205
  - test/artifacts/simple_csv.csv
@@ -209,6 +210,7 @@ files:
209
210
  - test/artifacts/simple_sheet_many_sheets.xls
210
211
  - test/artifacts/txt_in_xls.xls
211
212
  - test/artifacts/xls_with_txt_extension.txt
213
+ - test/artifacts/xlsx_with_empty_start.xlsx
212
214
  - test/artifacts/zip_in_xls.xls
213
215
  - test/helper.rb
214
216
  - test/test_book.rb
@@ -278,6 +280,7 @@ test_files:
278
280
  - test/artifacts/heavy.xlsx
279
281
  - test/artifacts/integer_test.xlsx
280
282
  - test/artifacts/native_xlsx.xlsx
283
+ - test/artifacts/semicolonseparated_in_csv.csv
281
284
  - test/artifacts/sheet_with_combined_cells.ods
282
285
  - test/artifacts/sheetduplication.xls
283
286
  - test/artifacts/simple_csv.csv
@@ -288,6 +291,7 @@ test_files:
288
291
  - test/artifacts/simple_sheet_many_sheets.xls
289
292
  - test/artifacts/txt_in_xls.xls
290
293
  - test/artifacts/xls_with_txt_extension.txt
294
+ - test/artifacts/xlsx_with_empty_start.xlsx
291
295
  - test/artifacts/zip_in_xls.xls
292
296
  - test/helper.rb
293
297
  - test/test_book.rb