workbook 0.4.12 → 0.4.13
Sign up to get free protection for your applications and to get access to all the features.
- 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;
|