write_xlsx 1.09.5 → 1.10.1
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/.rubocop.yml +6 -1
- data/Changes +8 -0
- data/LICENSE.txt +1 -1
- data/README.md +1 -1
- data/examples/autofilter.rb +39 -10
- data/examples/chart_area.rb +12 -12
- data/examples/chart_bar.rb +12 -12
- data/examples/chart_clustered.rb +12 -12
- data/examples/chart_column.rb +12 -12
- data/examples/chart_combined.rb +25 -25
- data/examples/chart_data_labels.rb +99 -99
- data/examples/chart_data_table.rb +25 -25
- data/examples/chart_data_tools.rb +50 -50
- data/examples/chart_doughnut.rb +29 -29
- data/examples/chart_gauge.rb +18 -18
- data/examples/chart_line.rb +32 -32
- data/examples/chart_pareto.rb +16 -16
- data/examples/chart_pie.rb +17 -17
- data/examples/chart_radar.rb +38 -38
- data/examples/chart_scatter.rb +12 -12
- data/examples/chart_secondary_axis.rb +13 -13
- data/examples/chart_stock.rb +12 -12
- data/examples/chart_styles.rb +5 -5
- data/examples/colors.rb +11 -11
- data/examples/comments2.rb +15 -15
- data/examples/conditional_format.rb +74 -74
- data/examples/data_validate.rb +64 -64
- data/examples/date_time.rb +3 -3
- data/examples/demo.rb +14 -14
- data/examples/diag_border.rb +6 -6
- data/examples/dynamic_arrays.rb +247 -0
- data/examples/formats.rb +10 -10
- data/examples/hyperlink1.rb +4 -4
- data/examples/ignore_errors.rb +2 -2
- data/examples/indent.rb +2 -2
- data/examples/lambda.rb +43 -0
- data/examples/macros.rb +4 -4
- data/examples/merge1.rb +1 -1
- data/examples/merge2.rb +9 -9
- data/examples/merge3.rb +5 -5
- data/examples/merge4.rb +20 -20
- data/examples/merge5.rb +18 -18
- data/examples/merge6.rb +7 -7
- data/examples/outline.rb +1 -1
- data/examples/outline_collapsed.rb +1 -1
- data/examples/panes.rb +4 -4
- data/examples/properties.rb +9 -9
- data/examples/protection.rb +2 -2
- data/examples/rich_strings.rb +6 -6
- data/examples/shape1.rb +7 -7
- data/examples/shape2.rb +16 -16
- data/examples/shape3.rb +5 -5
- data/examples/shape4.rb +7 -7
- data/examples/shape5.rb +7 -7
- data/examples/shape6.rb +7 -7
- data/examples/shape7.rb +10 -10
- data/examples/shape8.rb +10 -10
- data/examples/shape_all.rb +4 -4
- data/examples/sparklines1.rb +11 -11
- data/examples/sparklines2.rb +76 -76
- data/examples/tables.rb +87 -87
- data/examples/watermark.png +0 -0
- data/examples/watermark.rb +26 -0
- data/lib/write_xlsx/chart/bar.rb +4 -4
- data/lib/write_xlsx/chart/line.rb +1 -1
- data/lib/write_xlsx/chart/radar.rb +2 -2
- data/lib/write_xlsx/chart/scatter.rb +4 -4
- data/lib/write_xlsx/chart/series.rb +27 -27
- data/lib/write_xlsx/chart/stock.rb +5 -5
- data/lib/write_xlsx/chart.rb +31 -30
- data/lib/write_xlsx/chartsheet.rb +1 -0
- data/lib/write_xlsx/col_name.rb +1 -0
- data/lib/write_xlsx/colors.rb +20 -19
- data/lib/write_xlsx/compatibility.rb +1 -0
- data/lib/write_xlsx/drawing.rb +20 -10
- data/lib/write_xlsx/format.rb +5 -0
- data/lib/write_xlsx/formats.rb +1 -0
- data/lib/write_xlsx/gradient.rb +2 -0
- data/lib/write_xlsx/package/app.rb +1 -0
- data/lib/write_xlsx/package/button.rb +6 -2
- data/lib/write_xlsx/package/comments.rb +3 -1
- data/lib/write_xlsx/package/conditional_format.rb +4 -3
- data/lib/write_xlsx/package/content_types.rb +1 -0
- data/lib/write_xlsx/package/core.rb +1 -0
- data/lib/write_xlsx/package/custom.rb +1 -0
- data/lib/write_xlsx/package/metadata.rb +1 -0
- data/lib/write_xlsx/package/packager.rb +1 -0
- data/lib/write_xlsx/package/relationships.rb +1 -0
- data/lib/write_xlsx/package/shared_strings.rb +1 -1
- data/lib/write_xlsx/package/styles.rb +1 -0
- data/lib/write_xlsx/package/table.rb +9 -8
- data/lib/write_xlsx/package/theme.rb +1 -0
- data/lib/write_xlsx/package/vml.rb +1 -0
- data/lib/write_xlsx/package/xml_writer_simple.rb +21 -2
- data/lib/write_xlsx/shape.rb +6 -5
- data/lib/write_xlsx/sheets.rb +2 -1
- data/lib/write_xlsx/sparkline.rb +287 -286
- data/lib/write_xlsx/utility.rb +25 -26
- data/lib/write_xlsx/version.rb +3 -1
- data/lib/write_xlsx/workbook.rb +20 -20
- data/lib/write_xlsx/worksheet/cell_data.rb +53 -63
- data/lib/write_xlsx/worksheet/data_validation.rb +1 -0
- data/lib/write_xlsx/worksheet/hyperlink.rb +3 -2
- data/lib/write_xlsx/worksheet/page_setup.rb +1 -0
- data/lib/write_xlsx/worksheet.rb +287 -74
- data/lib/write_xlsx/zip_file_utils.rb +1 -0
- data/lib/write_xlsx.rb +1 -0
- data/write_xlsx.gemspec +1 -0
- metadata +8 -4
data/lib/write_xlsx/utility.rb
CHANGED
@@ -458,11 +458,10 @@ module Writexlsx
|
|
458
458
|
[left, top, width, height]
|
459
459
|
end
|
460
460
|
|
461
|
-
def v_shape_attributes_base(id
|
461
|
+
def v_shape_attributes_base(id)
|
462
462
|
[
|
463
463
|
['id', "_x0000_s#{id}"],
|
464
|
-
['type', type]
|
465
|
-
['style', (v_shape_style_base(z_index, vertices) + style_addition).join]
|
464
|
+
['type', type]
|
466
465
|
]
|
467
466
|
end
|
468
467
|
|
@@ -684,7 +683,7 @@ module Writexlsx
|
|
684
683
|
end
|
685
684
|
|
686
685
|
def line_fill_properties(params)
|
687
|
-
return { :
|
686
|
+
return { _defined: 0 } unless params
|
688
687
|
|
689
688
|
ret = params.dup
|
690
689
|
ret[:dash_type] = yield if block_given? && ret[:dash_type]
|
@@ -694,17 +693,17 @@ module Writexlsx
|
|
694
693
|
|
695
694
|
def dash_types
|
696
695
|
{
|
697
|
-
:
|
698
|
-
:
|
699
|
-
:
|
700
|
-
:
|
701
|
-
:
|
702
|
-
:
|
703
|
-
:
|
704
|
-
:
|
705
|
-
:
|
706
|
-
:
|
707
|
-
:
|
696
|
+
solid: 'solid',
|
697
|
+
round_dot: 'sysDot',
|
698
|
+
square_dot: 'sysDash',
|
699
|
+
dash: 'dash',
|
700
|
+
dash_dot: 'dashDot',
|
701
|
+
long_dash: 'lgDash',
|
702
|
+
long_dash_dot: 'lgDashDot',
|
703
|
+
long_dash_dot_dot: 'lgDashDotDot',
|
704
|
+
dot: 'dot',
|
705
|
+
system_dash_dot: 'sysDashDot',
|
706
|
+
system_dash_dot_dot: 'sysDashDotDot'
|
708
707
|
}
|
709
708
|
end
|
710
709
|
|
@@ -767,16 +766,16 @@ module Writexlsx
|
|
767
766
|
|
768
767
|
def params_to_font(params)
|
769
768
|
{
|
770
|
-
:
|
771
|
-
:
|
772
|
-
:
|
773
|
-
:
|
774
|
-
:
|
775
|
-
:
|
776
|
-
:
|
777
|
-
:
|
778
|
-
:
|
779
|
-
:
|
769
|
+
_name: params[:name],
|
770
|
+
_color: params[:color],
|
771
|
+
_size: params[:size],
|
772
|
+
_bold: params[:bold],
|
773
|
+
_italic: params[:italic],
|
774
|
+
_underline: params[:underline],
|
775
|
+
_pitch_family: params[:pitch_family],
|
776
|
+
_charset: params[:charset],
|
777
|
+
_baseline: params[:baseline] || 0,
|
778
|
+
_rotation: params[:rotation]
|
780
779
|
}
|
781
780
|
end
|
782
781
|
|
@@ -863,7 +862,7 @@ module Writexlsx
|
|
863
862
|
|
864
863
|
if !latin_attributes.empty? || has_color
|
865
864
|
@writer.tag_elements(tag, style_attributes) do
|
866
|
-
write_a_solid_fill(:
|
865
|
+
write_a_solid_fill(color: font[:_color]) if has_color
|
867
866
|
write_a_latin(latin_attributes) unless latin_attributes.empty?
|
868
867
|
end
|
869
868
|
else
|
data/lib/write_xlsx/version.rb
CHANGED
data/lib/write_xlsx/workbook.rb
CHANGED
@@ -95,18 +95,18 @@ module Writexlsx
|
|
95
95
|
|
96
96
|
if @excel2003_style
|
97
97
|
add_format(default_formats.merge(
|
98
|
-
:
|
99
|
-
:
|
100
|
-
:
|
101
|
-
:
|
102
|
-
:
|
98
|
+
xf_index: 0,
|
99
|
+
font_family: 0,
|
100
|
+
font: 'Arial',
|
101
|
+
size: 10,
|
102
|
+
theme: -1
|
103
103
|
))
|
104
104
|
else
|
105
|
-
add_format(default_formats.merge(:
|
105
|
+
add_format(default_formats.merge(xf_index: 0))
|
106
106
|
end
|
107
107
|
|
108
108
|
# Add a default URL format.
|
109
|
-
@default_url_format = add_format(:
|
109
|
+
@default_url_format = add_format(hyperlink: 1)
|
110
110
|
|
111
111
|
set_color_palette
|
112
112
|
end
|
@@ -273,7 +273,7 @@ module Writexlsx
|
|
273
273
|
#
|
274
274
|
def add_format(property_hash = {})
|
275
275
|
properties = {}
|
276
|
-
properties.update(:
|
276
|
+
properties.update(font: 'Arial', size: 10, theme: -1) if @excel2003_style
|
277
277
|
properties.update(property_hash)
|
278
278
|
|
279
279
|
format = Format.new(@formats, properties)
|
@@ -376,18 +376,18 @@ module Writexlsx
|
|
376
376
|
|
377
377
|
# List of valid input parameters.
|
378
378
|
valid = {
|
379
|
-
:
|
380
|
-
:
|
381
|
-
:
|
382
|
-
:
|
383
|
-
:
|
384
|
-
:
|
385
|
-
:
|
386
|
-
:
|
387
|
-
:
|
388
|
-
:
|
389
|
-
:
|
390
|
-
:
|
379
|
+
title: 1,
|
380
|
+
subject: 1,
|
381
|
+
author: 1,
|
382
|
+
keywords: 1,
|
383
|
+
comments: 1,
|
384
|
+
last_author: 1,
|
385
|
+
created: 1,
|
386
|
+
category: 1,
|
387
|
+
manager: 1,
|
388
|
+
company: 1,
|
389
|
+
status: 1,
|
390
|
+
hyperlink_base: 1
|
391
391
|
}
|
392
392
|
|
393
393
|
# Check for valid input parameters.
|
@@ -6,14 +6,13 @@ module Writexlsx
|
|
6
6
|
class CellData # :nodoc:
|
7
7
|
include Writexlsx::Utility
|
8
8
|
|
9
|
-
attr_reader :
|
10
|
-
attr_reader :result, :range, :link_type, :url, :tip
|
9
|
+
attr_reader :xf
|
11
10
|
|
12
11
|
#
|
13
12
|
# attributes for the <cell> element. This is the innermost loop so efficiency is
|
14
13
|
# important where possible.
|
15
14
|
#
|
16
|
-
def cell_attributes # :nodoc:
|
15
|
+
def cell_attributes(worksheet, row, col) # :nodoc:
|
17
16
|
xf_index = xf ? xf.get_xf_index : 0
|
18
17
|
attributes = [
|
19
18
|
['r', xl_rowcol_to_cell(row, col)]
|
@@ -22,11 +21,11 @@ module Writexlsx
|
|
22
21
|
# Add the cell format index.
|
23
22
|
if xf_index != 0
|
24
23
|
attributes << ['s', xf_index]
|
25
|
-
elsif
|
26
|
-
row_xf =
|
24
|
+
elsif worksheet.set_rows[row] && worksheet.set_rows[row][1]
|
25
|
+
row_xf = worksheet.set_rows[row][1]
|
27
26
|
attributes << ['s', row_xf.get_xf_index]
|
28
|
-
elsif
|
29
|
-
col_xf =
|
27
|
+
elsif worksheet.col_formats[col]
|
28
|
+
col_xf = worksheet.col_formats[col]
|
30
29
|
attributes << ['s', col_xf.get_xf_index]
|
31
30
|
end
|
32
31
|
attributes
|
@@ -38,10 +37,9 @@ module Writexlsx
|
|
38
37
|
end
|
39
38
|
|
40
39
|
class NumberCellData < CellData # :nodoc:
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
@col = col
|
40
|
+
attr_reader :token
|
41
|
+
|
42
|
+
def initialize(num, xf)
|
45
43
|
@token = num
|
46
44
|
@xf = xf
|
47
45
|
end
|
@@ -50,32 +48,31 @@ module Writexlsx
|
|
50
48
|
@token
|
51
49
|
end
|
52
50
|
|
53
|
-
def write_cell
|
54
|
-
|
55
|
-
|
51
|
+
def write_cell(worksheet, row, col)
|
52
|
+
worksheet.writer.tag_elements('c', cell_attributes(worksheet, row, col)) do
|
53
|
+
worksheet.write_cell_value(token)
|
56
54
|
end
|
57
55
|
end
|
58
56
|
end
|
59
57
|
|
60
58
|
class StringCellData < CellData # :nodoc:
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
@col = col
|
59
|
+
attr_reader :token
|
60
|
+
|
61
|
+
def initialize(index, xf)
|
65
62
|
@token = index
|
66
63
|
@xf = xf
|
67
64
|
end
|
68
65
|
|
69
66
|
def data
|
70
|
-
{ :
|
67
|
+
{ sst_id: token }
|
71
68
|
end
|
72
69
|
|
73
70
|
TYPE_STR_ATTRS = %w[t s].freeze
|
74
|
-
def write_cell
|
75
|
-
attributes = cell_attributes
|
71
|
+
def write_cell(worksheet, row, col)
|
72
|
+
attributes = cell_attributes(worksheet, row, col)
|
76
73
|
attributes << TYPE_STR_ATTRS
|
77
|
-
|
78
|
-
|
74
|
+
worksheet.writer.tag_elements('c', attributes) do
|
75
|
+
worksheet.write_cell_value(token)
|
79
76
|
end
|
80
77
|
end
|
81
78
|
|
@@ -85,10 +82,9 @@ module Writexlsx
|
|
85
82
|
end
|
86
83
|
|
87
84
|
class FormulaCellData < CellData # :nodoc:
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
@col = col
|
85
|
+
attr_reader :token, :result, :range, :link_type, :url
|
86
|
+
|
87
|
+
def initialize(formula, xf, result)
|
92
88
|
@token = formula
|
93
89
|
@xf = xf
|
94
90
|
@result = result
|
@@ -98,11 +94,11 @@ module Writexlsx
|
|
98
94
|
@result || 0
|
99
95
|
end
|
100
96
|
|
101
|
-
def write_cell
|
97
|
+
def write_cell(worksheet, row, col)
|
102
98
|
truefalse = { 'TRUE' => 1, 'FALSE' => 0 }
|
103
99
|
error_code = ['#DIV/0!', '#N/A', '#NAME?', '#NULL!', '#NUM!', '#REF!', '#VALUE!']
|
104
100
|
|
105
|
-
attributes = cell_attributes
|
101
|
+
attributes = cell_attributes(worksheet, row, col)
|
106
102
|
if @result && !(@result.to_s =~ /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/)
|
107
103
|
if truefalse[@result]
|
108
104
|
attributes << %w[t b]
|
@@ -113,18 +109,17 @@ module Writexlsx
|
|
113
109
|
attributes << %w[t str]
|
114
110
|
end
|
115
111
|
end
|
116
|
-
|
117
|
-
|
118
|
-
|
112
|
+
worksheet.writer.tag_elements('c', attributes) do
|
113
|
+
worksheet.write_cell_formula(token)
|
114
|
+
worksheet.write_cell_value(result || 0)
|
119
115
|
end
|
120
116
|
end
|
121
117
|
end
|
122
118
|
|
123
119
|
class FormulaArrayCellData < CellData # :nodoc:
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
@col = col
|
120
|
+
attr_reader :token, :result, :range, :link_type, :url
|
121
|
+
|
122
|
+
def initialize(formula, xf, range, result)
|
128
123
|
@token = formula
|
129
124
|
@xf = xf
|
130
125
|
@range = range
|
@@ -135,19 +130,18 @@ module Writexlsx
|
|
135
130
|
@result || 0
|
136
131
|
end
|
137
132
|
|
138
|
-
def write_cell
|
139
|
-
|
140
|
-
|
141
|
-
|
133
|
+
def write_cell(worksheet, row, col)
|
134
|
+
worksheet.writer.tag_elements('c', cell_attributes(worksheet, row, col)) do
|
135
|
+
worksheet.write_cell_array_formula(token, range)
|
136
|
+
worksheet.write_cell_value(result)
|
142
137
|
end
|
143
138
|
end
|
144
139
|
end
|
145
140
|
|
146
141
|
class DynamicFormulaArrayCellData < CellData # :nodoc:
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
@col = col
|
142
|
+
attr_reader :token, :result, :range, :link_type, :url
|
143
|
+
|
144
|
+
def initialize(formula, xf, range, result)
|
151
145
|
@token = formula
|
152
146
|
@xf = xf
|
153
147
|
@range = range
|
@@ -158,23 +152,22 @@ module Writexlsx
|
|
158
152
|
@result || 0
|
159
153
|
end
|
160
154
|
|
161
|
-
def write_cell
|
155
|
+
def write_cell(worksheet, row, col)
|
162
156
|
# Add metadata linkage for dynamic array formulas.
|
163
|
-
attributes = cell_attributes
|
157
|
+
attributes = cell_attributes(worksheet, row, col)
|
164
158
|
attributes << %w[cm 1]
|
165
159
|
|
166
|
-
|
167
|
-
|
168
|
-
|
160
|
+
worksheet.writer.tag_elements('c', attributes) do
|
161
|
+
worksheet.write_cell_array_formula(token, range)
|
162
|
+
worksheet.write_cell_value(result)
|
169
163
|
end
|
170
164
|
end
|
171
165
|
end
|
172
166
|
|
173
167
|
class BooleanCellData < CellData # :nodoc:
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
@col = col
|
168
|
+
attr_reader :token
|
169
|
+
|
170
|
+
def initialize(val, xf)
|
178
171
|
@token = val
|
179
172
|
@xf = xf
|
180
173
|
end
|
@@ -183,21 +176,18 @@ module Writexlsx
|
|
183
176
|
@token
|
184
177
|
end
|
185
178
|
|
186
|
-
def write_cell
|
187
|
-
attributes = cell_attributes
|
179
|
+
def write_cell(worksheet, row, col)
|
180
|
+
attributes = cell_attributes(worksheet, row, col)
|
188
181
|
|
189
182
|
attributes << %w[t b]
|
190
|
-
|
191
|
-
|
183
|
+
worksheet.writer.tag_elements('c', attributes) do
|
184
|
+
worksheet.write_cell_value(token)
|
192
185
|
end
|
193
186
|
end
|
194
187
|
end
|
195
188
|
|
196
189
|
class BlankCellData < CellData # :nodoc:
|
197
|
-
def initialize(
|
198
|
-
@worksheet = worksheet
|
199
|
-
@row = row
|
200
|
-
@col = col
|
190
|
+
def initialize(xf)
|
201
191
|
@xf = xf
|
202
192
|
end
|
203
193
|
|
@@ -205,8 +195,8 @@ module Writexlsx
|
|
205
195
|
''
|
206
196
|
end
|
207
197
|
|
208
|
-
def write_cell
|
209
|
-
|
198
|
+
def write_cell(worksheet, row, col)
|
199
|
+
worksheet.writer.empty_tag('c', cell_attributes(worksheet, row, col))
|
210
200
|
end
|
211
201
|
end
|
212
202
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
module Writexlsx
|
4
5
|
class Worksheet
|
@@ -99,10 +100,10 @@ module Writexlsx
|
|
99
100
|
|
100
101
|
# For external links change the directory separator from Unix to Dos.
|
101
102
|
url = url.gsub(%r{/}, '\\')
|
102
|
-
str.gsub
|
103
|
+
str = str.gsub(%r{/}, '\\')
|
103
104
|
|
104
105
|
# Strip the mailto header.
|
105
|
-
str.sub
|
106
|
+
str = str.sub(/^mailto:/, '')
|
106
107
|
|
107
108
|
# Split url into the link and optional anchor/location.
|
108
109
|
url, url_str = url.split(/#/, 2)
|