workbook 0.8.1 → 0.9.0
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/.codeclimate.yml +21 -0
- data/.gitignore +4 -1
- data/.ruby-version +1 -1
- data/.travis.yml +4 -4
- data/CHANGELOG.md +8 -0
- data/Gemfile +2 -2
- data/README.md +9 -7
- data/Rakefile +6 -6
- data/json_test.json +1 -0
- data/lib/workbook/book.rb +73 -62
- data/lib/workbook/cell.rb +58 -13
- data/lib/workbook/column.rb +31 -28
- data/lib/workbook/format.rb +23 -24
- data/lib/workbook/generatetypes.rb +4 -4
- data/lib/workbook/modules/cache.rb +6 -7
- data/lib/workbook/modules/cell.rb +77 -100
- data/lib/workbook/modules/diff_sort.rb +92 -83
- data/lib/workbook/modules/raw_objects_storage.rb +6 -8
- data/lib/workbook/modules/type_parser.rb +30 -22
- data/lib/workbook/nil_value.rb +4 -9
- data/lib/workbook/readers/csv_reader.rb +7 -10
- data/lib/workbook/readers/ods_reader.rb +51 -50
- data/lib/workbook/readers/txt_reader.rb +6 -8
- data/lib/workbook/readers/xls_reader.rb +21 -33
- data/lib/workbook/readers/xls_shared.rb +106 -117
- data/lib/workbook/readers/xlsx_reader.rb +45 -46
- data/lib/workbook/row.rb +99 -84
- data/lib/workbook/sheet.rb +47 -38
- data/lib/workbook/table.rb +96 -72
- data/lib/workbook/template.rb +12 -15
- data/lib/workbook/types/false.rb +0 -1
- data/lib/workbook/types/nil.rb +0 -1
- data/lib/workbook/types/nil_class.rb +1 -1
- data/lib/workbook/types/numeric.rb +1 -1
- data/lib/workbook/types/string.rb +1 -1
- data/lib/workbook/types/time.rb +1 -1
- data/lib/workbook/types/true.rb +0 -1
- data/lib/workbook/types/true_class.rb +1 -1
- data/lib/workbook/version.rb +2 -3
- data/lib/workbook/writers/csv_table_writer.rb +10 -13
- data/lib/workbook/writers/html_writer.rb +34 -38
- data/lib/workbook/writers/json_table_writer.rb +8 -11
- data/lib/workbook/writers/xls_writer.rb +30 -36
- data/lib/workbook/writers/xlsx_writer.rb +45 -29
- data/lib/workbook.rb +16 -15
- data/test/artifacts/currency_test.ods +0 -0
- data/test/helper.rb +6 -5
- data/test/test_book.rb +41 -38
- data/test/test_column.rb +26 -24
- data/test/test_format.rb +51 -55
- data/test/test_functional.rb +7 -8
- data/test/test_modules_cache.rb +18 -17
- data/test/test_modules_cell.rb +55 -46
- data/test/test_modules_table_diff_sort.rb +55 -64
- data/test/test_modules_type_parser.rb +61 -31
- data/test/test_readers_csv_reader.rb +48 -42
- data/test/test_readers_ods_reader.rb +36 -31
- data/test/test_readers_txt_reader.rb +21 -23
- data/test/test_readers_xls_reader.rb +20 -23
- data/test/test_readers_xls_shared.rb +2 -3
- data/test/test_readers_xlsx_reader.rb +44 -37
- data/test/test_row.rb +105 -109
- data/test/test_sheet.rb +35 -41
- data/test/test_table.rb +82 -60
- data/test/test_template.rb +16 -15
- data/test/test_types_date.rb +4 -6
- data/test/test_writers_csv_writer.rb +24 -0
- data/test/test_writers_html_writer.rb +42 -41
- data/test/test_writers_json_writer.rb +16 -9
- data/test/test_writers_xls_writer.rb +50 -35
- data/test/test_writers_xlsx_writer.rb +62 -34
- data/workbook.gemspec +25 -27
- metadata +96 -42
@@ -1,36 +1,34 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# -*- encoding : utf-8 -*-
|
4
2
|
# frozen_string_literal: true
|
5
|
-
|
3
|
+
|
4
|
+
require "spreadsheet"
|
6
5
|
|
7
6
|
module Workbook
|
8
7
|
module Writers
|
9
8
|
module HtmlWriter
|
10
|
-
|
11
9
|
# Generates an HTML table ()
|
12
10
|
#
|
13
11
|
# @param [Hash] options A hash with options
|
14
12
|
# @return [String] A String containing the HTML code
|
15
|
-
def to_html options={}
|
16
|
-
builder = Nokogiri::XML::Builder.new
|
13
|
+
def to_html options = {}
|
14
|
+
builder = Nokogiri::XML::Builder.new { |doc|
|
17
15
|
doc.html {
|
18
16
|
doc.body {
|
19
|
-
|
20
|
-
doc.h1
|
17
|
+
each do |sheet|
|
18
|
+
doc.h1 do
|
21
19
|
doc.text sheet.name
|
22
|
-
|
23
|
-
sheet.each
|
24
|
-
doc.h2
|
20
|
+
end
|
21
|
+
sheet.each do |table|
|
22
|
+
doc.h2 do
|
25
23
|
doc.text table.name
|
26
|
-
|
24
|
+
end
|
27
25
|
doc << table.to_html(options)
|
28
|
-
|
29
|
-
|
26
|
+
end
|
27
|
+
end
|
30
28
|
}
|
31
29
|
}
|
32
|
-
|
33
|
-
|
30
|
+
}
|
31
|
+
builder.doc.to_xhtml
|
34
32
|
end
|
35
33
|
|
36
34
|
# Write the current workbook to HTML format
|
@@ -39,9 +37,9 @@ module Workbook
|
|
39
37
|
# @param [Hash] options see #to_xls
|
40
38
|
# @return [String] filename
|
41
39
|
|
42
|
-
def write_to_html filename="#{title}.html", options={}
|
43
|
-
File.open(filename,
|
44
|
-
|
40
|
+
def write_to_html filename = "#{title}.html", options = {}
|
41
|
+
File.open(filename, "w") { |f| f.write(to_html(options)) }
|
42
|
+
filename
|
45
43
|
end
|
46
44
|
end
|
47
45
|
|
@@ -50,16 +48,16 @@ module Workbook
|
|
50
48
|
#
|
51
49
|
# @param [Hash] options A hash with options
|
52
50
|
# @return [String] A String containing the HTML code, most importantly `:style_with_inline_css` (default false)
|
53
|
-
def to_html options={}
|
54
|
-
options = {:
|
55
|
-
builder = Nokogiri::XML::Builder.new
|
51
|
+
def to_html options = {}
|
52
|
+
options = {style_with_inline_css: false}.merge(options)
|
53
|
+
builder = Nokogiri::XML::Builder.new { |doc|
|
56
54
|
doc.table do
|
57
55
|
doc.thead do
|
58
56
|
if header
|
59
57
|
doc.tr do
|
60
58
|
header.each do |cell|
|
61
59
|
th_options = build_cell_options cell, options.merge(classnames: [cell.to_sym], data: {key: cell.to_sym})
|
62
|
-
unless cell.value.
|
60
|
+
unless cell.value.instance_of?(Workbook::NilValue)
|
63
61
|
doc.th(th_options) do
|
64
62
|
doc.text cell.value
|
65
63
|
end
|
@@ -69,12 +67,12 @@ module Workbook
|
|
69
67
|
end
|
70
68
|
end
|
71
69
|
doc.tbody do
|
72
|
-
|
70
|
+
each do |row|
|
73
71
|
unless row.header?
|
74
72
|
doc.tr do
|
75
73
|
row.each do |cell|
|
76
74
|
td_options = build_cell_options cell, options
|
77
|
-
unless cell.value.
|
75
|
+
unless cell.value.instance_of?(Workbook::NilValue)
|
78
76
|
doc.td(td_options) do
|
79
77
|
doc.text cell.value
|
80
78
|
end
|
@@ -85,24 +83,22 @@ module Workbook
|
|
85
83
|
end
|
86
84
|
end
|
87
85
|
end
|
88
|
-
|
89
|
-
|
86
|
+
}
|
87
|
+
builder.doc.to_xhtml
|
90
88
|
end
|
91
89
|
|
92
|
-
def build_cell_options cell, options={}
|
90
|
+
def build_cell_options cell, options = {}
|
93
91
|
classnames = cell.format.all_names
|
94
|
-
classnames
|
92
|
+
classnames += options[:classnames] if options[:classnames]
|
95
93
|
classnames = classnames.join(" ").strip
|
96
|
-
td_options = classnames != "" ? {:
|
97
|
-
|
98
|
-
|
99
|
-
td_options = td_options.merge({("data-#{key}".to_sym) => value})
|
100
|
-
end
|
94
|
+
td_options = classnames != "" ? {class: classnames} : {}
|
95
|
+
options[:data]&.each do |key, value|
|
96
|
+
td_options = td_options.merge({"data-#{key}".to_sym => value})
|
101
97
|
end
|
102
|
-
td_options = td_options.merge({:
|
103
|
-
td_options = td_options.merge({:
|
104
|
-
td_options = td_options.merge({:
|
105
|
-
|
98
|
+
td_options = td_options.merge({style: cell.format.to_css}) if options[:style_with_inline_css] && (cell.format.to_css != "")
|
99
|
+
td_options = td_options.merge({colspan: cell.colspan}) if cell.colspan
|
100
|
+
td_options = td_options.merge({rowspan: cell.rowspan}) if cell.rowspan
|
101
|
+
td_options
|
106
102
|
end
|
107
103
|
end
|
108
104
|
end
|
@@ -1,8 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# -*- encoding : utf-8 -*-
|
4
2
|
# frozen_string_literal: true
|
5
|
-
|
3
|
+
|
4
|
+
require "json"
|
6
5
|
|
7
6
|
module Workbook
|
8
7
|
module Writers
|
@@ -11,7 +10,7 @@ module Workbook
|
|
11
10
|
#
|
12
11
|
# @param [Hash] options
|
13
12
|
# @return [String] json string
|
14
|
-
def to_json options={}
|
13
|
+
def to_json options = {}
|
15
14
|
JSON.generate(to_array_of_hashes_with_values(options))
|
16
15
|
end
|
17
16
|
|
@@ -19,9 +18,8 @@ module Workbook
|
|
19
18
|
#
|
20
19
|
# @param [Hash] options
|
21
20
|
# @return [Array<Hash>] array with hashes (comma separated values in a string)
|
22
|
-
def to_array_of_hashes_with_values options={}
|
23
|
-
|
24
|
-
return array_of_hashes
|
21
|
+
def to_array_of_hashes_with_values options = {}
|
22
|
+
collect { |a| a.to_hash_with_values unless a.header? }.compact
|
25
23
|
end
|
26
24
|
|
27
25
|
# Write the current workbook to JSON format
|
@@ -29,11 +27,10 @@ module Workbook
|
|
29
27
|
# @param [String] filename
|
30
28
|
# @param [Hash] options see #to_json
|
31
29
|
# @return [String] filename
|
32
|
-
def write_to_json filename="#{title}.json", options={}
|
33
|
-
File.open(filename,
|
34
|
-
|
30
|
+
def write_to_json filename = "#{title}.json", options = {}
|
31
|
+
File.open(filename, "w") { |f| f.write(to_json(options)) }
|
32
|
+
filename
|
35
33
|
end
|
36
|
-
|
37
34
|
end
|
38
35
|
end
|
39
36
|
end
|
@@ -1,30 +1,28 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# -*- encoding : utf-8 -*-
|
4
2
|
# frozen_string_literal: true
|
5
|
-
|
3
|
+
|
4
|
+
require "spreadsheet"
|
6
5
|
|
7
6
|
module Workbook
|
8
7
|
module Writers
|
9
8
|
module XlsWriter
|
10
|
-
|
11
9
|
# Generates an Spreadsheet (from the spreadsheet gem) in order to build an xls
|
12
10
|
#
|
13
11
|
# @param [Hash] options A hash with options (unused so far)
|
14
12
|
# @return [Spreadsheet] A Spreadsheet object, ready for writing or more lower level operations
|
15
|
-
def to_xls options={}
|
13
|
+
def to_xls options = {}
|
16
14
|
book = init_spreadsheet_template
|
17
|
-
|
15
|
+
each_with_index do |s, si|
|
18
16
|
xls_sheet = xls_sheet(si)
|
19
17
|
xls_sheet.name = s.name
|
20
18
|
|
21
19
|
s.table.each_with_index do |r, ri|
|
22
|
-
xls_sheet.row(ri).height= r.format[:height] if r.format
|
20
|
+
xls_sheet.row(ri).height = r.format[:height] if r.format
|
23
21
|
r.each_with_index do |c, ci|
|
24
22
|
if c
|
25
23
|
if r.first?
|
26
|
-
xls_sheet.columns[ci] ||= Spreadsheet::Column.new(ci,nil)
|
27
|
-
xls_sheet.columns[ci].width= c.format[:width]
|
24
|
+
xls_sheet.columns[ci] ||= Spreadsheet::Column.new(ci, nil)
|
25
|
+
xls_sheet.columns[ci].width = c.format[:width]
|
28
26
|
end
|
29
27
|
xls_sheet.row(ri)[ci] = c.value
|
30
28
|
xls_sheet.row(ri).set_format(ci, format_to_xls_format(c.format))
|
@@ -32,12 +30,11 @@ module Workbook
|
|
32
30
|
end
|
33
31
|
end
|
34
32
|
(xls_sheet.last_row_index + 1 - s.table.count).times do |time|
|
35
|
-
row_to_remove = s.table.count+time
|
36
|
-
remove_row(xls_sheet,row_to_remove)
|
33
|
+
row_to_remove = s.table.count + time
|
34
|
+
remove_row(xls_sheet, row_to_remove)
|
37
35
|
end
|
38
36
|
xls_sheet.updated_from(s.table.count)
|
39
37
|
xls_sheet.dimensions
|
40
|
-
|
41
38
|
end
|
42
39
|
# kind of a hack, deleting by popping from xls worksheet results in errors in MS Excel (not LibreOffice)
|
43
40
|
# book.worksheets.pop(book.worksheets.count - self.count) if book.worksheets and book.worksheets.count > self.count
|
@@ -46,10 +43,10 @@ module Workbook
|
|
46
43
|
xls_sheet.visibility = :visible
|
47
44
|
else
|
48
45
|
xls_sheet.visibility = :strong_hidden
|
49
|
-
#also make sure all data is removed, in case someone finds out about this 'trick'
|
46
|
+
# also make sure all data is removed, in case someone finds out about this 'trick'
|
50
47
|
xls_sheet.name = "RemovedSheet#{si}"
|
51
48
|
(xls_sheet.last_row_index + 1).times do |row_index|
|
52
|
-
remove_row(xls_sheet,row_index)
|
49
|
+
remove_row(xls_sheet, row_index)
|
53
50
|
end
|
54
51
|
end
|
55
52
|
end
|
@@ -58,20 +55,17 @@ module Workbook
|
|
58
55
|
book
|
59
56
|
end
|
60
57
|
|
61
|
-
|
62
|
-
|
63
58
|
# Generates an Spreadsheet (from the spreadsheet gem) in order to build an XlS
|
64
59
|
#
|
65
60
|
# @param [Workbook::Format, Hash] f A Workbook::Format or hash with format-options (:font_weight, :rotation, :background_color, :number_format, :text_direction, :color, :font_family)
|
66
61
|
# @return [Spreadsheet::Format] A Spreadsheet format-object, ready for writing or more lower level operations
|
67
62
|
def format_to_xls_format f
|
68
|
-
xlsfmt = nil
|
69
63
|
unless f.is_a? Workbook::Format
|
70
64
|
f = Workbook::Format.new f
|
71
65
|
end
|
72
66
|
xlsfmt = f.return_raw_for Spreadsheet::Format
|
73
67
|
unless xlsfmt
|
74
|
-
xlsfmt=Spreadsheet::Format.new :
|
68
|
+
xlsfmt = Spreadsheet::Format.new weight: f[:font_weight]
|
75
69
|
xlsfmt.rotation = f[:rotation] if f[:rotation]
|
76
70
|
xlsfmt.pattern_fg_color = html_color_to_xls_color(f[:background_color]) if html_color_to_xls_color(f[:background_color])
|
77
71
|
xlsfmt.pattern = 1 if html_color_to_xls_color(f[:background_color])
|
@@ -83,7 +77,7 @@ module Workbook
|
|
83
77
|
xlsfmt.font.color = color if color
|
84
78
|
f.add_raw xlsfmt
|
85
79
|
end
|
86
|
-
|
80
|
+
xlsfmt
|
87
81
|
end
|
88
82
|
|
89
83
|
# Parses right font-family name
|
@@ -91,20 +85,20 @@ module Workbook
|
|
91
85
|
# @param [Workbook::Format, hash] format to parse
|
92
86
|
def parse_font_family(format)
|
93
87
|
font = format[:font_family].to_s.split.last
|
94
|
-
valid_values = [:none
|
88
|
+
valid_values = [:none, :roman, :swiss, :modern, :script, :decorative]
|
95
89
|
if valid_values.include?(font)
|
96
|
-
|
90
|
+
font
|
97
91
|
elsif valid_values.include?(font.to_s.downcase.to_sym)
|
98
|
-
|
92
|
+
font.to_s.downcase.to_sym
|
99
93
|
else
|
100
94
|
font = font.to_s.downcase.strip
|
101
95
|
translation = {
|
102
|
-
"arial"
|
103
|
-
"times"
|
104
|
-
"times new roman"
|
96
|
+
"arial" => :swiss,
|
97
|
+
"times" => :roman,
|
98
|
+
"times new roman" => :roman
|
105
99
|
}
|
106
100
|
tfont = translation[font]
|
107
|
-
|
101
|
+
tfont || :none
|
108
102
|
end
|
109
103
|
end
|
110
104
|
|
@@ -112,40 +106,40 @@ module Workbook
|
|
112
106
|
#
|
113
107
|
# @param [String] filename
|
114
108
|
# @param [Hash] options see #to_xls
|
115
|
-
def write_to_xls filename="#{title}.xls", options={}
|
109
|
+
def write_to_xls filename = "#{title}.xls", options = {}
|
116
110
|
if to_xls(options).write(filename)
|
117
|
-
|
111
|
+
filename
|
118
112
|
end
|
119
113
|
end
|
120
114
|
|
121
115
|
def xls_sheet a
|
122
116
|
if xls_template.worksheet(a)
|
123
|
-
|
117
|
+
xls_template.worksheet(a)
|
124
118
|
else
|
125
119
|
xls_template.create_worksheet
|
126
|
-
|
120
|
+
xls_sheet a
|
127
121
|
end
|
128
122
|
end
|
129
123
|
|
130
124
|
def xls_template
|
131
|
-
|
125
|
+
template.raws[Spreadsheet::Excel::Workbook] || template.raws[Spreadsheet::Workbook]
|
132
126
|
end
|
133
127
|
|
134
128
|
def init_spreadsheet_template
|
135
|
-
if
|
136
|
-
|
129
|
+
if xls_template.is_a? Spreadsheet::Workbook
|
130
|
+
xls_template
|
137
131
|
else
|
138
132
|
t = Spreadsheet::Workbook.new
|
139
133
|
template.add_raw t
|
140
|
-
|
134
|
+
t
|
141
135
|
end
|
142
136
|
end
|
143
137
|
|
144
138
|
private
|
145
139
|
|
146
|
-
def remove_row(xls_sheet,row_index)
|
140
|
+
def remove_row(xls_sheet, row_index)
|
147
141
|
xls_sheet.row(row_index).each_with_index do |c, ci|
|
148
|
-
xls_sheet.row(row_index)[ci]=nil
|
142
|
+
xls_sheet.row(row_index)[ci] = nil
|
149
143
|
end
|
150
144
|
xls_sheet.delete_row(row_index)
|
151
145
|
xls_sheet.row_updated(row_index, xls_sheet.row(row_index))
|
@@ -1,37 +1,51 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
require 'axlsx'
|
6
|
-
require 'workbook/readers/xls_shared'
|
3
|
+
require "axlsx"
|
4
|
+
require "workbook/readers/xls_shared"
|
7
5
|
|
8
6
|
module Workbook
|
9
7
|
module Writers
|
10
8
|
module XlsxWriter
|
11
|
-
|
9
|
+
CELL_TYPE_MAPPING = {
|
10
|
+
decimal: :integer,
|
11
|
+
integer: :integer,
|
12
|
+
float: :float,
|
13
|
+
string: :text,
|
14
|
+
time: :time,
|
15
|
+
date: :date,
|
16
|
+
datetime: :time,
|
17
|
+
boolean: :boolean,
|
18
|
+
nil: :string
|
19
|
+
}
|
12
20
|
# Generates an axlsx doc, ready for export to XLSX
|
13
21
|
#
|
14
22
|
# @param [Hash] options A hash with options (unused so far)
|
15
23
|
# @return [Axlsx::Package] An object, ready for writing or more lower level operations
|
16
|
-
def to_xlsx options={}
|
24
|
+
def to_xlsx options = {}
|
17
25
|
formats_to_xlsx_format
|
26
|
+
|
18
27
|
book = init_xlsx_spreadsheet_template.workbook
|
19
|
-
book.worksheets.pop(book.worksheets.count -
|
20
|
-
|
28
|
+
book.worksheets.pop(book.worksheets.count - count) if book.worksheets && (book.worksheets.count > count)
|
29
|
+
each_with_index do |s, si|
|
21
30
|
xlsx_sheet = xlsx_sheet(si)
|
22
31
|
xlsx_sheet.name = s.name
|
23
32
|
s.table.each_with_index do |r, ri|
|
24
|
-
xlsx_row = xlsx_sheet[ri]
|
33
|
+
xlsx_row = xlsx_sheet[ri] || xlsx_sheet.add_row
|
25
34
|
xlsx_row.height = 16
|
26
35
|
xlsx_row_a = xlsx_row.to_ary
|
27
36
|
r.each_with_index do |c, ci|
|
28
37
|
xlsx_row.add_cell(c.value) unless xlsx_row_a[ci]
|
29
38
|
xlsx_cell = xlsx_row_a[ci]
|
39
|
+
|
40
|
+
xlsx_cell.type = CELL_TYPE_MAPPING[c.cell_type]
|
30
41
|
xlsx_cell.value = c.value
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
42
|
+
|
43
|
+
if c.format? && c.format.raws[Integer]
|
44
|
+
xlsx_cell.style = c.format.raws[Integer]
|
45
|
+
elsif c.format? && !(c.value.is_a?(Date) || !c.value.is_a?(DateTime) || !c.value.is_a?(Time))
|
46
|
+
# TODO: disable formatting
|
47
|
+
# xlsx_cell.style = format_to_xlsx_format(c.format)
|
48
|
+
end
|
35
49
|
end
|
36
50
|
xlsx_sheet.send(:update_column_info, xlsx_row.cells, [])
|
37
51
|
end
|
@@ -54,39 +68,39 @@ module Workbook
|
|
54
68
|
#
|
55
69
|
# @param [String] filename
|
56
70
|
# @param [Hash] options see #to_xlsx
|
57
|
-
def write_to_xlsx filename="#{title}.xlsx", options={}
|
71
|
+
def write_to_xlsx filename = "#{title}.xlsx", options = {}
|
58
72
|
if to_xlsx(options).serialize(filename)
|
59
|
-
|
73
|
+
filename
|
60
74
|
end
|
61
75
|
end
|
62
76
|
|
63
77
|
def xlsx_sheet a
|
64
78
|
if xlsx_template.workbook.worksheets[a]
|
65
|
-
|
79
|
+
xlsx_template.workbook.worksheets[a]
|
66
80
|
else
|
67
81
|
xlsx_template.workbook.add_worksheet
|
68
|
-
|
82
|
+
xlsx_sheet a
|
69
83
|
end
|
70
84
|
end
|
71
85
|
|
72
86
|
def xlsx_template
|
73
|
-
|
87
|
+
template.raws[Axlsx::Package]
|
74
88
|
end
|
75
89
|
|
76
90
|
def init_xlsx_spreadsheet_template
|
77
|
-
if
|
78
|
-
|
91
|
+
if xlsx_template.is_a? Axlsx::Package
|
92
|
+
xlsx_template
|
79
93
|
else
|
80
94
|
t = Axlsx::Package.new
|
81
95
|
template.add_raw t
|
82
96
|
# template.set_default_formats!
|
83
|
-
|
97
|
+
t
|
84
98
|
end
|
85
99
|
end
|
86
100
|
|
87
101
|
def formats_to_xlsx_format
|
88
|
-
template.formats.each do |n,v|
|
89
|
-
v.each do |
|
102
|
+
template.formats.each do |n, v|
|
103
|
+
v.each do |t, s|
|
90
104
|
format_to_xlsx_format(s)
|
91
105
|
end
|
92
106
|
end
|
@@ -99,20 +113,22 @@ module Workbook
|
|
99
113
|
def format_to_xlsx_format f
|
100
114
|
f = make_sure_f_is_a_workbook_format f
|
101
115
|
|
102
|
-
xlsfmt={}
|
103
|
-
xlsfmt[:fg_color] = "FF#{f[:color].to_s.upcase}".
|
104
|
-
xlsfmt[:b] = true if f[:font_weight].to_s == "bold"
|
116
|
+
xlsfmt = {}
|
117
|
+
xlsfmt[:fg_color] = "FF#{f[:color].to_s.upcase}".delete("#") if f[:color]
|
118
|
+
xlsfmt[:b] = true if (f[:font_weight].to_s == "bold") || (f[:font_weight].to_i >= 600) || f[:font_style].to_s.match("oblique")
|
105
119
|
xlsfmt[:i] = true if f[:font_style].to_s == "italic"
|
106
|
-
xlsfmt[:u] = true if f[:text_decoration].to_s.
|
120
|
+
xlsfmt[:u] = true if f[:text_decoration].to_s.include?("underline")
|
107
121
|
xlsfmt[:bg_color] = f[:background_color] if f[:background_color]
|
108
122
|
xlsfmt[:format_code] = strftime_to_ms_format(f[:number_format]) if f[:number_format]
|
109
123
|
xlsfmt[:font_name] = f[:font_family].split.first if f[:font_family]
|
110
124
|
# xlsfmt[:family] = parse_font_family(f) if f[:font_family]
|
111
125
|
|
112
|
-
|
126
|
+
style_reference = init_xlsx_spreadsheet_template.workbook.styles.add_style(xlsfmt)
|
127
|
+
|
128
|
+
f.add_raw style_reference
|
113
129
|
f.add_raw xlsfmt
|
114
130
|
|
115
|
-
|
131
|
+
style_reference
|
116
132
|
end
|
117
133
|
end
|
118
134
|
end
|
data/lib/workbook.rb
CHANGED
@@ -1,30 +1,31 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# -*- encoding : utf-8 -*-
|
4
2
|
# frozen_string_literal: true
|
5
|
-
|
6
|
-
require_relative
|
7
|
-
require_relative
|
8
|
-
require_relative
|
9
|
-
require_relative
|
10
|
-
require_relative
|
11
|
-
require_relative
|
12
|
-
require_relative
|
13
|
-
require_relative
|
14
|
-
require_relative
|
15
|
-
require_relative
|
16
|
-
require_relative
|
17
|
-
require_relative
|
3
|
+
|
4
|
+
require_relative "workbook/modules/cache"
|
5
|
+
require_relative "workbook/modules/cell"
|
6
|
+
require_relative "workbook/types/date"
|
7
|
+
require_relative "workbook/book"
|
8
|
+
require_relative "workbook/sheet"
|
9
|
+
require_relative "workbook/table"
|
10
|
+
require_relative "workbook/nil_value"
|
11
|
+
require_relative "workbook/row"
|
12
|
+
require_relative "workbook/cell"
|
13
|
+
require_relative "workbook/format"
|
14
|
+
require_relative "workbook/template"
|
15
|
+
require_relative "workbook/version"
|
16
|
+
require_relative "workbook/column"
|
18
17
|
|
19
18
|
module Workbook
|
20
19
|
class << self
|
21
20
|
def caching_enabled?
|
22
21
|
@@caching_enabled ||= true
|
23
22
|
end
|
23
|
+
|
24
24
|
# Disable caching globally (wherever applicable)
|
25
25
|
def disable_caching!
|
26
26
|
@@caching_enabled = false
|
27
27
|
end
|
28
|
+
|
28
29
|
# Enable caching globally (wherever applicable)
|
29
30
|
def enable_caching!
|
30
31
|
@@caching_enabled = true
|
Binary file
|
data/test/helper.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
require
|
7
|
-
require
|
3
|
+
require "simplecov"
|
4
|
+
SimpleCov.start
|
5
|
+
|
6
|
+
require "minitest/autorun"
|
7
|
+
require "rubygems"
|
8
|
+
require File.join(File.dirname(__FILE__), "../lib/workbook")
|