workbook 0.4.12 → 0.4.13
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/.travis.yml +4 -1
- data/lib/workbook/book.rb +11 -11
- data/lib/workbook/readers/csv_reader.rb +9 -6
- data/lib/workbook/readers/ods_reader.rb +2 -2
- data/lib/workbook/readers/txt_reader.rb +3 -3
- data/lib/workbook/readers/xls_reader.rb +2 -2
- data/lib/workbook/readers/xlsx_reader.rb +3 -3
- data/lib/workbook/version.rb +1 -1
- data/lib/workbook/writers/html_writer.rb +7 -2
- data/test/artifacts/floats_problem.xls +0 -0
- data/test/test_readers_csv_reader.rb +4 -0
- data/test/test_readers_xls_reader.rb +5 -0
- data/test/test_writers_html_writer.rb +11 -5
- metadata +4 -4
- data/test/artifacts/.~lock.complex_types.xls# +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f84a8f4041814e019f83cb05d05de9f91ad003d
|
4
|
+
data.tar.gz: 385307619e4061a0c44966bf73665b612b203ae3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e3403db816bde3fa82f590081a0d29064d6d797ee8d6eea27419263e257f19c4c12af542cbfc7dbc453252138c43e29462d7cdb21f7de04d15708ee0e64ce6f
|
7
|
+
data.tar.gz: 896a09df2b1ed2e26562c70116caa0158d6e4519e034e6034581edd51dd9400523727135fd0c660089ca328d56fe2c7b1cf2c46ad33866b9504dccc52dad8994
|
data/.travis.yml
CHANGED
data/lib/workbook/book.rb
CHANGED
@@ -115,12 +115,12 @@ module Workbook
|
|
115
115
|
# @param [String] filename a string with a reference to the file to be opened
|
116
116
|
# @param [String] extension an optional string enforcing a certain parser (based on the file extension, e.g. 'txt', 'csv' or 'xls')
|
117
117
|
# @return [Workbook::Book] A new instance, based on the filename
|
118
|
-
def open filename, extension=nil
|
118
|
+
def open filename, extension=nil, options={}
|
119
119
|
extension = file_extension(filename) unless extension
|
120
120
|
if ['txt','csv','xml'].include?(extension)
|
121
|
-
open_text filename, extension
|
121
|
+
open_text filename, extension, options
|
122
122
|
else
|
123
|
-
open_binary filename, extension
|
123
|
+
open_binary filename, extension, options
|
124
124
|
end
|
125
125
|
end
|
126
126
|
|
@@ -129,22 +129,22 @@ module Workbook
|
|
129
129
|
# @param [String] filename a string with a reference to the file to be opened
|
130
130
|
# @param [String] extension an optional string enforcing a certain parser (based on the file extension, e.g. 'txt', 'csv' or 'xls')
|
131
131
|
# @return [Workbook::Book] A new instance, based on the filename
|
132
|
-
def open_binary filename, extension=nil
|
132
|
+
def open_binary filename, extension=nil, options={}
|
133
133
|
extension = file_extension(filename) unless extension
|
134
134
|
f = File.open(filename,'rb')
|
135
|
-
send("load_#{extension}".to_sym,f)
|
135
|
+
send("load_#{extension}".to_sym, f, options)
|
136
136
|
end
|
137
137
|
|
138
138
|
# Open the file in non-binary, read-only mode, read it and parse it to UTF-8
|
139
139
|
#
|
140
140
|
# @param [String] filename a string with a reference to the file to be opened
|
141
141
|
# @param [String] extension an optional string enforcing a certain parser (based on the file extension, e.g. 'txt', 'csv' or 'xls')
|
142
|
-
def open_text filename, extension=nil
|
142
|
+
def open_text filename, extension=nil, options={}
|
143
143
|
extension = file_extension(filename) unless extension
|
144
144
|
f = File.open(filename,'r')
|
145
145
|
t = f.read
|
146
146
|
t = text_to_utf8(t)
|
147
|
-
send("load_#{extension}".to_sym,t)
|
147
|
+
send("load_#{extension}".to_sym, t, options)
|
148
148
|
end
|
149
149
|
|
150
150
|
# Writes the book to a file. Filetype is based on the extension, but can be overridden
|
@@ -190,11 +190,11 @@ module Workbook
|
|
190
190
|
#
|
191
191
|
# @param [StringIO] stringio_or_string StringIO stream or String object, with data in CSV format
|
192
192
|
# @param [Symbol] filetype (currently only :csv or :txt), indicating the format of the first parameter
|
193
|
-
def read(stringio_or_string, filetype)
|
193
|
+
def read(stringio_or_string, filetype, options={})
|
194
194
|
raise ArgumentError.new("The filetype parameter should be either :csv or :txt") unless [:csv, :txt].include?(filetype)
|
195
195
|
t = stringio_or_string.respond_to?(:read) ? stringio_or_string.read : stringio_or_string.to_s
|
196
196
|
t = text_to_utf8(t)
|
197
|
-
send(:"parse_#{filetype}", t)
|
197
|
+
send(:"parse_#{filetype}", t, options)
|
198
198
|
end
|
199
199
|
|
200
200
|
# Create or open the existing sheet at an index value
|
@@ -224,9 +224,9 @@ module Workbook
|
|
224
224
|
# @param [StringIO] stringio_or_string StringIO stream or String object, with data in CSV or TXT format
|
225
225
|
# @param [Symbol] filetype (currently only :csv or :txt), indicating the format of the first parameter
|
226
226
|
# @return [Workbook::Book] A new instance
|
227
|
-
def read
|
227
|
+
def read stringio_or_string, filetype, options={}
|
228
228
|
wb = self.new
|
229
|
-
wb.read(stringio_or_string, filetype)
|
229
|
+
wb.read(stringio_or_string, filetype, options)
|
230
230
|
wb
|
231
231
|
end
|
232
232
|
|
@@ -3,9 +3,9 @@
|
|
3
3
|
module Workbook
|
4
4
|
module Readers
|
5
5
|
module CsvReader
|
6
|
-
def load_csv text
|
6
|
+
def load_csv text, options={}
|
7
7
|
csv = text
|
8
|
-
parse_csv csv
|
8
|
+
parse_csv csv, options
|
9
9
|
end
|
10
10
|
|
11
11
|
def csv_lib
|
@@ -17,19 +17,22 @@ module Workbook
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
-
def parse_csv csv_raw
|
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]
|
24
|
+
}.merge(options)
|
25
|
+
|
23
26
|
csv=nil
|
24
27
|
#begin
|
25
|
-
csv = csv_lib.parse(csv_raw,
|
28
|
+
csv = csv_lib.parse(csv_raw,options)
|
26
29
|
|
27
30
|
#rescue
|
28
31
|
# we're going to have another shot at it...
|
29
32
|
#end
|
30
33
|
|
31
34
|
if csv==nil or csv[0].count == 1
|
32
|
-
csv_excel = csv_lib.parse(csv_raw,{:
|
35
|
+
csv_excel = csv_lib.parse(csv_raw,options.merge({:col_sep=>';'}))
|
33
36
|
csv = csv_excel if csv_excel[0].count > 1
|
34
37
|
end
|
35
38
|
|
@@ -6,7 +6,7 @@ module Workbook
|
|
6
6
|
# reads self with and ods-type content.xml
|
7
7
|
# @param [String,File] file_obj a file or file reference
|
8
8
|
# @return [Workbook::Book] self
|
9
|
-
def load_ods file_obj
|
9
|
+
def load_ods file_obj, options={}
|
10
10
|
file_obj = file_obj.path if file_obj.is_a? File
|
11
11
|
content = ""
|
12
12
|
styles = ""
|
@@ -20,7 +20,7 @@ module Workbook
|
|
20
20
|
styles = Nokogiri.XML(styles)
|
21
21
|
template.add_raw content
|
22
22
|
parse_ods_style styles
|
23
|
-
parse_ods content
|
23
|
+
parse_ods content, options
|
24
24
|
return self
|
25
25
|
end
|
26
26
|
|
@@ -2,12 +2,12 @@
|
|
2
2
|
module Workbook
|
3
3
|
module Readers
|
4
4
|
module TxtReader
|
5
|
-
def load_txt text
|
5
|
+
def load_txt text, options={}
|
6
6
|
csv = text
|
7
|
-
parse_txt csv
|
7
|
+
parse_txt csv, options
|
8
8
|
end
|
9
9
|
|
10
|
-
def parse_txt csv_raw
|
10
|
+
def parse_txt csv_raw, options={}
|
11
11
|
csv = []
|
12
12
|
csv_raw.split("\n").each {|l| csv << csv_lib.parse_line(l,{:col_sep=>"\t"});nil}
|
13
13
|
self[0]=Workbook::Sheet.new(csv,self,{:parse_cells_on_batch_creation=>true, :cell_parse_options=>{:detect_date=>true}}) unless sheet.has_contents?
|
@@ -8,11 +8,11 @@ module Workbook
|
|
8
8
|
module XlsReader
|
9
9
|
include Workbook::Readers::XlsShared
|
10
10
|
|
11
|
-
def load_xls file_obj
|
11
|
+
def load_xls file_obj, options
|
12
12
|
begin
|
13
13
|
sp = Spreadsheet.open(file_obj, 'rb')
|
14
14
|
template.add_raw sp
|
15
|
-
parse_xls sp
|
15
|
+
parse_xls sp, options
|
16
16
|
rescue Ole::Storage::FormatError => e
|
17
17
|
begin
|
18
18
|
# Assuming it is a tab separated txt inside .xls
|
@@ -11,10 +11,10 @@ module Workbook
|
|
11
11
|
# Load method for .xlsm files, an office open file format, hence compatible with .xlsx (it emphasizes that it contains macros)
|
12
12
|
#
|
13
13
|
# @param [String, File] file_obj a string with a reference to the file to be written to
|
14
|
-
def load_xlsm file_obj
|
15
|
-
self.load_xlsx file_obj
|
14
|
+
def load_xlsm file_obj, options={}
|
15
|
+
self.load_xlsx file_obj, options
|
16
16
|
end
|
17
|
-
def load_xlsx file_obj
|
17
|
+
def load_xlsx file_obj, options={}
|
18
18
|
file_obj = file_obj.path if file_obj.is_a? File
|
19
19
|
# file_obj = file_obj.match(/^\/(.*)/) ? file_obj : "./#{file_obj}"
|
20
20
|
# p "opening #{file_obj}"
|
data/lib/workbook/version.rb
CHANGED
@@ -55,7 +55,7 @@ module Workbook
|
|
55
55
|
if header
|
56
56
|
doc.tr do
|
57
57
|
header.each do |cell|
|
58
|
-
th_options = build_cell_options cell, options.merge(classnames: [cell.to_sym])
|
58
|
+
th_options = build_cell_options cell, options.merge(classnames: [cell.to_sym], data: {key: cell.to_sym})
|
59
59
|
unless cell.value.class == Workbook::NilValue
|
60
60
|
doc.th(th_options) do
|
61
61
|
doc.text cell.value
|
@@ -85,12 +85,17 @@ module Workbook
|
|
85
85
|
end
|
86
86
|
return builder.doc.to_xhtml
|
87
87
|
end
|
88
|
-
|
88
|
+
|
89
89
|
def build_cell_options cell, options={}
|
90
90
|
classnames = cell.format.all_names
|
91
91
|
classnames = classnames + options[:classnames] if options[:classnames]
|
92
92
|
classnames = classnames.join(" ").strip
|
93
93
|
td_options = classnames != "" ? {:class=>classnames} : {}
|
94
|
+
if options[:data]
|
95
|
+
options[:data].each do |key, value|
|
96
|
+
td_options = td_options.merge({("data-#{key}".to_sym) => value})
|
97
|
+
end
|
98
|
+
end
|
94
99
|
td_options = td_options.merge({:style=>cell.format.to_css}) if options[:style_with_inline_css] and cell.format.to_css != ""
|
95
100
|
td_options = td_options.merge({:colspan=>cell.colspan}) if cell.colspan
|
96
101
|
td_options = td_options.merge({:rowspan=>cell.rowspan}) if cell.rowspan
|
Binary file
|
@@ -95,5 +95,9 @@ module Readers
|
|
95
95
|
assert_equal("asdf",w.sheet.table[3][:a].value)
|
96
96
|
assert_equal(Date.new(2001,2,2),w.sheet.table[3][:d].value)
|
97
97
|
end
|
98
|
+
def test_from_string
|
99
|
+
w = Workbook::Book.read("2013-03-19,JV,211,032,1,DBG A,,13,0147,\n", :csv, {converters: []})
|
100
|
+
assert_equal("2013-03-19,JV,211,032,1,DBG A,,13,0147,\n",w.sheet.table.to_csv)
|
101
|
+
end
|
98
102
|
end
|
99
103
|
end
|
@@ -65,5 +65,10 @@ module Readers
|
|
65
65
|
assert_equal(["Diff_10", "Diff_9", "Diff_8", "Diff_7", "Diff_6", "Diff_5", "Diff_4", "Diff_3", "Diff_2", "Diff_1"], b.collect{|a| a.name})
|
66
66
|
assert_equal([10, 9, 8, 7, 6, 5, 4, 3, 2, 1], b.collect{|a| a.table[1][0].value})
|
67
67
|
end
|
68
|
+
def test_float_problem
|
69
|
+
w = Workbook::Book.new
|
70
|
+
w.open File.join(File.dirname(__FILE__), 'artifacts/floats_problem.xls')
|
71
|
+
# puts w.first.first.to_csv
|
72
|
+
end
|
68
73
|
end
|
69
74
|
end
|
@@ -14,7 +14,7 @@ module Writers
|
|
14
14
|
assert_equal(false, match)
|
15
15
|
match = html.match(/<td>1<\/td>/) ? true : false
|
16
16
|
assert_equal(true, match)
|
17
|
-
match = html.match(/<th class=\"a\">a<\/th>/) ? true : false
|
17
|
+
match = html.match(/<th class=\"a\" data-key=\"a\">a<\/th>/) ? true : false
|
18
18
|
assert_equal(true, match)
|
19
19
|
end
|
20
20
|
def test_to_html_format_names
|
@@ -24,11 +24,16 @@ module Writers
|
|
24
24
|
c = b[0][0][1][0]
|
25
25
|
c.format.name="testname"
|
26
26
|
html = b.to_html
|
27
|
-
match = html.match(/<th class=\"testname a\">a<\/th>/) ? true : false
|
27
|
+
match = html.match(/<th class=\"testname a\" data-key=\"a\">a<\/th>/) ? true : false
|
28
28
|
assert_equal(true, match)
|
29
29
|
match = html.match(/<td class=\"testname\">1<\/td>/) ? true : false
|
30
30
|
assert_equal(true, match)
|
31
31
|
end
|
32
|
+
def test_build_cell_options
|
33
|
+
b = Workbook::Book.new([['a','b'],[1,2],[3,4]])
|
34
|
+
result = b.sheet.table.build_cell_options(b.sheet.table.first.first,{data: {a:"a"}})
|
35
|
+
assert("a",result["data-a"])
|
36
|
+
end
|
32
37
|
def test_to_html_css
|
33
38
|
b = Workbook::Book.new([['a','b'],[1,2],[3,4]])
|
34
39
|
c = b[0][0][0][0]
|
@@ -36,13 +41,14 @@ module Writers
|
|
36
41
|
c = b[0][0][1][0]
|
37
42
|
c.format[:background]="#ff0"
|
38
43
|
html = b.to_html
|
39
|
-
match = html.match(/<th class=\"a\">a<\/th>/) ? true : false
|
44
|
+
match = html.match(/<th class=\"a\" data-key=\"a\">a<\/th>/) ? true : false
|
45
|
+
assert_equal(true, match)
|
40
46
|
match = html.match(/<td>1<\/td>/) ? true : false
|
41
47
|
assert_equal(true, match)
|
42
48
|
html = b.to_html({:style_with_inline_css=>true})
|
43
|
-
match = html.match(/<th style
|
49
|
+
match = html.match(/<th class=\"a\" data-key=\"a\" style=\"background: #f00\">a<\/th>/) ? true : false
|
50
|
+
assert_equal(true, match)
|
44
51
|
match = html.match(/<td style="background: #ff0">1<\/td>/) ? true : false
|
45
|
-
|
46
52
|
assert_equal(true, match)
|
47
53
|
end
|
48
54
|
def test_sheet_and_table_names
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: workbook
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maarten Brouwers
|
@@ -238,7 +238,6 @@ files:
|
|
238
238
|
- lib/workbook/writers/xls_writer.rb
|
239
239
|
- lib/workbook/writers/xlsx_writer.rb
|
240
240
|
- rbeautify.rb
|
241
|
-
- test/artifacts/.~lock.complex_types.xls#
|
242
241
|
- test/artifacts/bigtable.xls
|
243
242
|
- test/artifacts/bigtable.xlsx
|
244
243
|
- test/artifacts/book_with_colspans.ods
|
@@ -253,6 +252,7 @@ files:
|
|
253
252
|
- test/artifacts/excel_different_types.xls
|
254
253
|
- test/artifacts/excel_different_types.xlsx
|
255
254
|
- test/artifacts/failing_import1.xls
|
255
|
+
- test/artifacts/floats_problem.xls
|
256
256
|
- test/artifacts/heavy.xlsx
|
257
257
|
- test/artifacts/native_xlsx.xlsx
|
258
258
|
- test/artifacts/sheet_with_combined_cells.ods
|
@@ -310,13 +310,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
310
310
|
version: '0'
|
311
311
|
requirements: []
|
312
312
|
rubyforge_project: workbook
|
313
|
-
rubygems_version: 2.
|
313
|
+
rubygems_version: 2.5.1
|
314
314
|
signing_key:
|
315
315
|
specification_version: 4
|
316
316
|
summary: Workbook is a datastructure to contain books of tables (an anlogy used in
|
317
317
|
e.g. Excel)
|
318
318
|
test_files:
|
319
|
-
- test/artifacts/.~lock.complex_types.xls#
|
320
319
|
- test/artifacts/bigtable.xls
|
321
320
|
- test/artifacts/bigtable.xlsx
|
322
321
|
- test/artifacts/book_with_colspans.ods
|
@@ -331,6 +330,7 @@ test_files:
|
|
331
330
|
- test/artifacts/excel_different_types.xls
|
332
331
|
- test/artifacts/excel_different_types.xlsx
|
333
332
|
- test/artifacts/failing_import1.xls
|
333
|
+
- test/artifacts/floats_problem.xls
|
334
334
|
- test/artifacts/heavy.xlsx
|
335
335
|
- test/artifacts/native_xlsx.xlsx
|
336
336
|
- test/artifacts/sheet_with_combined_cells.ods
|
@@ -1 +0,0 @@
|
|
1
|
-
,murb,murb-top.local,03.02.2016 16:38,file:///Users/murb/Library/Application%20Support/LibreOffice/4;
|