caxlsx 3.3.0 → 3.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/README.md +24 -5
- data/Rakefile +0 -1
- data/lib/axlsx/content_type/abstract_content_type.rb +2 -5
- data/lib/axlsx/content_type/content_type.rb +0 -4
- data/lib/axlsx/content_type/default.rb +1 -5
- data/lib/axlsx/content_type/override.rb +0 -4
- data/lib/axlsx/doc_props/app.rb +1 -6
- data/lib/axlsx/doc_props/core.rb +1 -6
- data/lib/axlsx/drawing/area_chart.rb +3 -6
- data/lib/axlsx/drawing/area_series.rb +1 -4
- data/lib/axlsx/drawing/ax_data_source.rb +1 -6
- data/lib/axlsx/drawing/axes.rb +5 -6
- data/lib/axlsx/drawing/axis.rb +7 -12
- data/lib/axlsx/drawing/bar_3D_chart.rb +7 -10
- data/lib/axlsx/drawing/bar_chart.rb +6 -9
- data/lib/axlsx/drawing/bar_series.rb +2 -8
- data/lib/axlsx/drawing/bubble_chart.rb +2 -5
- data/lib/axlsx/drawing/bubble_series.rb +3 -6
- data/lib/axlsx/drawing/cat_axis.rb +2 -7
- data/lib/axlsx/drawing/chart.rb +7 -12
- data/lib/axlsx/drawing/d_lbls.rb +23 -22
- data/lib/axlsx/drawing/drawing.rb +4 -8
- data/lib/axlsx/drawing/graphic_frame.rb +0 -3
- data/lib/axlsx/drawing/hyperlink.rb +4 -7
- data/lib/axlsx/drawing/line_3D_chart.rb +10 -14
- data/lib/axlsx/drawing/line_chart.rb +3 -6
- data/lib/axlsx/drawing/line_series.rb +1 -4
- data/lib/axlsx/drawing/marker.rb +5 -9
- data/lib/axlsx/drawing/num_data.rb +4 -9
- data/lib/axlsx/drawing/num_data_source.rb +3 -7
- data/lib/axlsx/drawing/num_val.rb +2 -5
- data/lib/axlsx/drawing/one_cell_anchor.rb +4 -6
- data/lib/axlsx/drawing/pic.rb +46 -13
- data/lib/axlsx/drawing/picture_locking.rb +3 -6
- data/lib/axlsx/drawing/pie_3D_chart.rb +2 -7
- data/lib/axlsx/drawing/pie_series.rb +1 -6
- data/lib/axlsx/drawing/scaling.rb +2 -5
- data/lib/axlsx/drawing/scatter_chart.rb +2 -5
- data/lib/axlsx/drawing/scatter_series.rb +2 -5
- data/lib/axlsx/drawing/ser_axis.rb +2 -6
- data/lib/axlsx/drawing/series.rb +3 -5
- data/lib/axlsx/drawing/series_title.rb +0 -2
- data/lib/axlsx/drawing/str_data.rb +3 -8
- data/lib/axlsx/drawing/str_val.rb +2 -5
- data/lib/axlsx/drawing/title.rb +12 -15
- data/lib/axlsx/drawing/two_cell_anchor.rb +5 -7
- data/lib/axlsx/drawing/val_axis.rb +1 -4
- data/lib/axlsx/drawing/view_3D.rb +24 -24
- data/lib/axlsx/drawing/vml_drawing.rb +2 -5
- data/lib/axlsx/drawing/vml_shape.rb +4 -7
- data/lib/axlsx/package.rb +35 -36
- data/lib/axlsx/rels/relationship.rb +21 -24
- data/lib/axlsx/rels/relationships.rb +3 -6
- data/lib/axlsx/stylesheet/border.rb +1 -4
- data/lib/axlsx/stylesheet/border_pr.rb +3 -5
- data/lib/axlsx/stylesheet/cell_alignment.rb +2 -10
- data/lib/axlsx/stylesheet/cell_protection.rb +1 -4
- data/lib/axlsx/stylesheet/cell_style.rb +3 -7
- data/lib/axlsx/stylesheet/color.rb +6 -5
- data/lib/axlsx/stylesheet/dxf.rb +2 -6
- data/lib/axlsx/stylesheet/fill.rb +0 -4
- data/lib/axlsx/stylesheet/font.rb +7 -6
- data/lib/axlsx/stylesheet/gradient_fill.rb +4 -6
- data/lib/axlsx/stylesheet/gradient_stop.rb +2 -3
- data/lib/axlsx/stylesheet/num_fmt.rb +1 -4
- data/lib/axlsx/stylesheet/pattern_fill.rb +3 -5
- data/lib/axlsx/stylesheet/styles.rb +53 -45
- data/lib/axlsx/stylesheet/table_style.rb +5 -8
- data/lib/axlsx/stylesheet/table_style_element.rb +1 -4
- data/lib/axlsx/stylesheet/table_styles.rb +3 -7
- data/lib/axlsx/stylesheet/xf.rb +3 -6
- data/lib/axlsx/util/accessors.rb +2 -4
- data/lib/axlsx/util/constants.rb +3 -5
- data/lib/axlsx/util/mime_type_utils.rb +13 -0
- data/lib/axlsx/util/options_parser.rb +1 -2
- data/lib/axlsx/util/serialized_attributes.rb +4 -5
- data/lib/axlsx/util/simple_typed_list.rb +18 -17
- data/lib/axlsx/util/storage.rb +32 -36
- data/lib/axlsx/util/validators.rb +7 -4
- data/lib/axlsx/util/zip_command.rb +0 -2
- data/lib/axlsx/version.rb +1 -2
- data/lib/axlsx/workbook/defined_name.rb +6 -5
- data/lib/axlsx/workbook/defined_names.rb +1 -2
- data/lib/axlsx/workbook/shared_strings_table.rb +3 -6
- data/lib/axlsx/workbook/workbook.rb +96 -91
- data/lib/axlsx/workbook/workbook_view.rb +5 -10
- data/lib/axlsx/workbook/workbook_views.rb +1 -3
- data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +9 -8
- data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +6 -6
- data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +13 -14
- data/lib/axlsx/workbook/worksheet/border_creator.rb +29 -26
- data/lib/axlsx/workbook/worksheet/break.rb +2 -5
- data/lib/axlsx/workbook/worksheet/cell.rb +46 -26
- data/lib/axlsx/workbook/worksheet/cell_serializer.rb +11 -11
- data/lib/axlsx/workbook/worksheet/cfvo.rb +2 -2
- data/lib/axlsx/workbook/worksheet/cfvos.rb +3 -5
- data/lib/axlsx/workbook/worksheet/col.rb +4 -7
- data/lib/axlsx/workbook/worksheet/col_breaks.rb +4 -5
- data/lib/axlsx/workbook/worksheet/color_scale.rb +10 -12
- data/lib/axlsx/workbook/worksheet/cols.rb +6 -6
- data/lib/axlsx/workbook/worksheet/comment.rb +4 -5
- data/lib/axlsx/workbook/worksheet/comments.rb +6 -10
- data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +4 -5
- data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +2 -6
- data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +2 -4
- data/lib/axlsx/workbook/worksheet/data_bar.rb +20 -22
- data/lib/axlsx/workbook/worksheet/data_validation.rb +4 -5
- data/lib/axlsx/workbook/worksheet/data_validations.rb +2 -5
- data/lib/axlsx/workbook/worksheet/date_time_converter.rb +1 -3
- data/lib/axlsx/workbook/worksheet/dimension.rb +5 -4
- data/lib/axlsx/workbook/worksheet/header_footer.rb +0 -1
- data/lib/axlsx/workbook/worksheet/icon_set.rb +2 -3
- data/lib/axlsx/workbook/worksheet/merged_cells.rb +8 -8
- data/lib/axlsx/workbook/worksheet/outline_pr.rb +0 -1
- data/lib/axlsx/workbook/worksheet/page_margins.rb +2 -2
- data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +1 -3
- data/lib/axlsx/workbook/worksheet/page_setup.rb +117 -120
- data/lib/axlsx/workbook/worksheet/pane.rb +16 -17
- data/lib/axlsx/workbook/worksheet/pivot_table.rb +8 -11
- data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +8 -11
- data/lib/axlsx/workbook/worksheet/pivot_tables.rb +3 -4
- data/lib/axlsx/workbook/worksheet/print_options.rb +0 -1
- data/lib/axlsx/workbook/worksheet/protected_range.rb +4 -5
- data/lib/axlsx/workbook/worksheet/protected_ranges.rb +9 -9
- data/lib/axlsx/workbook/worksheet/rich_text.rb +4 -6
- data/lib/axlsx/workbook/worksheet/rich_text_run.rb +21 -5
- data/lib/axlsx/workbook/worksheet/row.rb +24 -15
- data/lib/axlsx/workbook/worksheet/row_breaks.rb +3 -4
- data/lib/axlsx/workbook/worksheet/selection.rb +7 -9
- data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +5 -6
- data/lib/axlsx/workbook/worksheet/sheet_data.rb +4 -6
- data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +18 -18
- data/lib/axlsx/workbook/worksheet/sheet_pr.rb +4 -4
- data/lib/axlsx/workbook/worksheet/sheet_protection.rb +12 -13
- data/lib/axlsx/workbook/worksheet/sheet_view.rb +35 -42
- data/lib/axlsx/workbook/worksheet/table.rb +7 -9
- data/lib/axlsx/workbook/worksheet/table_style_info.rb +2 -3
- data/lib/axlsx/workbook/worksheet/tables.rb +4 -4
- data/lib/axlsx/workbook/worksheet/worksheet.rb +63 -35
- data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +6 -6
- data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +3 -2
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +5 -6
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +4 -4
- data/lib/axlsx.rb +23 -9
- data/lib/caxlsx.rb +0 -1
- metadata +3 -3
@@ -1,39 +1,43 @@
|
|
1
|
-
# encoding: UTF-8
|
2
|
-
|
3
1
|
module Axlsx
|
4
2
|
class BorderCreator
|
5
|
-
|
6
|
-
|
7
|
-
def initialize(worksheet, cells, args)
|
3
|
+
def initialize(worksheet:, cells:, edges: nil, style: nil, color: nil)
|
8
4
|
@worksheet = worksheet
|
9
|
-
@cells
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
else
|
15
|
-
@edges = args || Axlsx::Border::Edges
|
16
|
-
@width = :thin
|
17
|
-
@color = '000000'
|
18
|
-
end
|
5
|
+
@cells = cells
|
6
|
+
|
7
|
+
@edges = edges || :all
|
8
|
+
@style = style || :thin
|
9
|
+
@color = color || "000000"
|
19
10
|
|
20
11
|
if @edges == :all
|
21
12
|
@edges = Axlsx::Border::EDGES
|
22
|
-
elsif
|
23
|
-
|
13
|
+
elsif !@edges.is_a?(Array)
|
14
|
+
raise ArgumentError.new("Invalid edges provided, #{@edges}")
|
24
15
|
else
|
25
|
-
@edges =
|
16
|
+
@edges = @edges.map { |x| x&.to_sym }.uniq
|
17
|
+
|
18
|
+
if !(@edges - Axlsx::Border::EDGES).empty?
|
19
|
+
raise ArgumentError.new("Invalid edges provided, #{edges}")
|
20
|
+
end
|
26
21
|
end
|
27
22
|
end
|
28
23
|
|
29
24
|
def draw
|
30
|
-
@
|
31
|
-
worksheet.add_style(
|
32
|
-
|
25
|
+
if @cells.size == 1
|
26
|
+
@worksheet.add_style(
|
27
|
+
first_cell,
|
33
28
|
{
|
34
|
-
border: {style: @
|
29
|
+
border: { style: @style, color: @color, edges: @edges }
|
35
30
|
}
|
36
31
|
)
|
32
|
+
else
|
33
|
+
@edges.each do |edge|
|
34
|
+
@worksheet.add_style(
|
35
|
+
border_cells[edge],
|
36
|
+
{
|
37
|
+
border: { style: @style, color: @color, edges: [edge] }
|
38
|
+
}
|
39
|
+
)
|
40
|
+
end
|
37
41
|
end
|
38
42
|
end
|
39
43
|
|
@@ -44,16 +48,16 @@ module Axlsx
|
|
44
48
|
top: "#{first_cell}:#{last_col}#{first_row}",
|
45
49
|
right: "#{last_col}#{first_row}:#{last_cell}",
|
46
50
|
bottom: "#{first_col}#{last_row}:#{last_cell}",
|
47
|
-
left: "#{first_cell}:#{first_col}#{last_row}"
|
51
|
+
left: "#{first_cell}:#{first_col}#{last_row}"
|
48
52
|
}
|
49
53
|
end
|
50
54
|
|
51
55
|
def first_cell
|
52
|
-
@first_cell ||= cells.first.r
|
56
|
+
@first_cell ||= @cells.first.r
|
53
57
|
end
|
54
58
|
|
55
59
|
def last_cell
|
56
|
-
@last_cell ||= cells.last.r
|
60
|
+
@last_cell ||= @cells.last.r
|
57
61
|
end
|
58
62
|
|
59
63
|
def first_row
|
@@ -71,6 +75,5 @@ module Axlsx
|
|
71
75
|
def last_col
|
72
76
|
@last_col ||= last_cell.scan(/\D+/).first
|
73
77
|
end
|
74
|
-
|
75
78
|
end
|
76
79
|
end
|
@@ -1,9 +1,7 @@
|
|
1
1
|
module Axlsx
|
2
|
-
|
3
2
|
# The Break class stores the details for row and column page breaks.
|
4
3
|
# @see RowBreaks, ColBreaks
|
5
4
|
class Break
|
6
|
-
|
7
5
|
include Axlsx::OptionsParser
|
8
6
|
include Axlsx::Accessors
|
9
7
|
include Axlsx::SerializedAttributes
|
@@ -15,7 +13,7 @@ module Axlsx
|
|
15
13
|
# @option options [Integer] max Zero-based index of end row or column of the break. For row breaks, specifies column index; for column breaks, specifies row index.
|
16
14
|
# @option options [Boolean] man Manual Break flag. 1 means the break is a manually inserted break.
|
17
15
|
# @option option [Boolean] pt Flag indicating that a PivotTable created this break.
|
18
|
-
def initialize(options={})
|
16
|
+
def initialize(options = {})
|
19
17
|
parse_options options
|
20
18
|
yield self if block_given?
|
21
19
|
end
|
@@ -27,9 +25,8 @@ module Axlsx
|
|
27
25
|
serializable_attributes :id, :min, :max, :man, :pt
|
28
26
|
|
29
27
|
# serializes the break to xml
|
30
|
-
def to_xml_string(str='')
|
28
|
+
def to_xml_string(str = '')
|
31
29
|
serialized_tag('brk', str)
|
32
30
|
end
|
33
31
|
end
|
34
32
|
end
|
35
|
-
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# encoding: UTF-8
|
2
1
|
require 'cgi'
|
3
2
|
module Axlsx
|
4
3
|
# A cell in a worksheet.
|
@@ -7,7 +6,6 @@ module Axlsx
|
|
7
6
|
#
|
8
7
|
# @see Worksheet#add_row
|
9
8
|
class Cell
|
10
|
-
|
11
9
|
include Axlsx::OptionsParser
|
12
10
|
|
13
11
|
# @param [Row] row The row this cell belongs to.
|
@@ -30,10 +28,9 @@ module Axlsx
|
|
30
28
|
# @option options [String] color an 8 letter rgb specification
|
31
29
|
# @option options [Number] formula_value The value to cache for a formula cell.
|
32
30
|
# @option options [Symbol] scheme must be one of :none, major, :minor
|
33
|
-
# @option options [Boolean] escape_formulas
|
34
|
-
#
|
35
|
-
#
|
36
|
-
# (see https://www.owasp.org/index.php/CSV_Injection for details).
|
31
|
+
# @option options [Boolean] escape_formulas Whether to treat values starting with an equals
|
32
|
+
# sign as formulas or as literal strings. Allowing user-generated data to be interpreted as
|
33
|
+
# formulas is a security risk. See https://www.owasp.org/index.php/CSV_Injection for details.
|
37
34
|
def initialize(row, value = nil, options = {})
|
38
35
|
@row = row
|
39
36
|
# Do not use instance vars if not needed to use less RAM
|
@@ -42,15 +39,13 @@ module Axlsx
|
|
42
39
|
type = options.delete(:type) || cell_type_from_value(value)
|
43
40
|
self.type = type unless type == :string
|
44
41
|
|
45
|
-
escape_formulas = options[:escape_formulas]
|
46
|
-
self.escape_formulas = escape_formulas unless escape_formulas.nil?
|
47
|
-
|
48
42
|
val = options.delete(:style)
|
49
43
|
self.style = val unless val.nil? || val == 0
|
50
44
|
val = options.delete(:formula_value)
|
51
45
|
self.formula_value = val unless val.nil?
|
52
46
|
|
53
47
|
parse_options(options)
|
48
|
+
self.escape_formulas = row.worksheet.escape_formulas if escape_formulas.nil?
|
54
49
|
|
55
50
|
self.value = value
|
56
51
|
value.cell = self if contains_rich_text?
|
@@ -75,6 +70,10 @@ module Axlsx
|
|
75
70
|
CELL_TYPES = [:date, :time, :float, :integer, :richtext,
|
76
71
|
:string, :boolean, :iso_8601, :text].freeze
|
77
72
|
|
73
|
+
# Leading characters that indicate a formula.
|
74
|
+
# See: https://owasp.org/www-community/attacks/CSV_Injection
|
75
|
+
FORMULA_PREFIXES = ['-', '=', '+', '@', '%', '|', "\r", "\t"].freeze
|
76
|
+
|
78
77
|
# The index of the cellXfs item to be applied to this cell.
|
79
78
|
# @return [Integer]
|
80
79
|
# @see Axlsx::Styles
|
@@ -104,7 +103,7 @@ module Axlsx
|
|
104
103
|
self.raw_style = new_style
|
105
104
|
|
106
105
|
wb = row.worksheet.workbook
|
107
|
-
|
106
|
+
|
108
107
|
wb.styled_cells << self
|
109
108
|
end
|
110
109
|
|
@@ -134,16 +133,17 @@ module Axlsx
|
|
134
133
|
self.value = @value unless !defined?(@value) || @value.nil?
|
135
134
|
end
|
136
135
|
|
137
|
-
# Whether to treat
|
138
|
-
#
|
139
|
-
#
|
140
|
-
# (see https://www.owasp.org/index.php/CSV_Injection for details).
|
136
|
+
# Whether to treat values starting with an equals sign as formulas or as literal strings.
|
137
|
+
# Allowing user-generated data to be interpreted as formulas is a security risk.
|
138
|
+
# See https://www.owasp.org/index.php/CSV_Injection for details.
|
141
139
|
# @return [Boolean]
|
142
140
|
attr_reader :escape_formulas
|
143
141
|
|
144
|
-
|
145
|
-
|
146
|
-
|
142
|
+
# Sets whether to treat values starting with an equals sign as formulas or as literal strings.
|
143
|
+
# @param [Boolean] value The value to set.
|
144
|
+
def escape_formulas=(value)
|
145
|
+
Axlsx.validate_boolean(value)
|
146
|
+
@escape_formulas = value
|
147
147
|
end
|
148
148
|
|
149
149
|
# The value of this cell.
|
@@ -152,7 +152,7 @@ module Axlsx
|
|
152
152
|
|
153
153
|
# @see value
|
154
154
|
def value=(v)
|
155
|
-
#TODO: consider doing value based type determination first?
|
155
|
+
# TODO: consider doing value based type determination first?
|
156
156
|
@value = cast_value(v)
|
157
157
|
end
|
158
158
|
|
@@ -172,12 +172,14 @@ module Axlsx
|
|
172
172
|
!is_text_run? && # No inline styles
|
173
173
|
!@value.nil? && # Not nil
|
174
174
|
!@value.empty? && # Not empty
|
175
|
-
|
175
|
+
!is_formula? && # Not a formula
|
176
|
+
!is_array_formula? # Not an array formula
|
176
177
|
end
|
177
178
|
|
178
179
|
# The inline font_name property for the cell
|
179
180
|
# @return [String]
|
180
181
|
attr_reader :font_name
|
182
|
+
|
181
183
|
# @see font_name
|
182
184
|
def font_name=(v) set_run_style :validate_string, :font_name, v; end
|
183
185
|
|
@@ -204,6 +206,7 @@ module Axlsx
|
|
204
206
|
# 255  OEM_CHARSET
|
205
207
|
# @return [String]
|
206
208
|
attr_reader :charset
|
209
|
+
|
207
210
|
# @see charset
|
208
211
|
def charset=(v) set_run_style :validate_unsigned_int, :charset, v; end
|
209
212
|
|
@@ -215,6 +218,7 @@ module Axlsx
|
|
215
218
|
# 4 Script
|
216
219
|
# 5 Decorative
|
217
220
|
attr_reader :family
|
221
|
+
|
218
222
|
# @see family
|
219
223
|
def family=(v)
|
220
224
|
set_run_style :validate_family, :family, v.to_i
|
@@ -223,42 +227,49 @@ module Axlsx
|
|
223
227
|
# The inline bold property for the cell
|
224
228
|
# @return [Boolean]
|
225
229
|
attr_reader :b
|
230
|
+
|
226
231
|
# @see b
|
227
232
|
def b=(v) set_run_style :validate_boolean, :b, v; end
|
228
233
|
|
229
234
|
# The inline italic property for the cell
|
230
235
|
# @return [Boolean]
|
231
236
|
attr_reader :i
|
237
|
+
|
232
238
|
# @see i
|
233
239
|
def i=(v) set_run_style :validate_boolean, :i, v; end
|
234
240
|
|
235
241
|
# The inline strike property for the cell
|
236
242
|
# @return [Boolean]
|
237
243
|
attr_reader :strike
|
244
|
+
|
238
245
|
# @see strike
|
239
246
|
def strike=(v) set_run_style :validate_boolean, :strike, v; end
|
240
247
|
|
241
248
|
# The inline outline property for the cell
|
242
249
|
# @return [Boolean]
|
243
250
|
attr_reader :outline
|
251
|
+
|
244
252
|
# @see outline
|
245
253
|
def outline=(v) set_run_style :validate_boolean, :outline, v; end
|
246
254
|
|
247
255
|
# The inline shadow property for the cell
|
248
256
|
# @return [Boolean]
|
249
257
|
attr_reader :shadow
|
258
|
+
|
250
259
|
# @see shadow
|
251
260
|
def shadow=(v) set_run_style :validate_boolean, :shadow, v; end
|
252
261
|
|
253
262
|
# The inline condense property for the cell
|
254
263
|
# @return [Boolean]
|
255
264
|
attr_reader :condense
|
265
|
+
|
256
266
|
# @see condense
|
257
267
|
def condense=(v) set_run_style :validate_boolean, :condense, v; end
|
258
268
|
|
259
269
|
# The inline extend property for the cell
|
260
270
|
# @return [Boolean]
|
261
271
|
attr_reader :extend
|
272
|
+
|
262
273
|
# @see extend
|
263
274
|
def extend=(v) set_run_style :validate_boolean, :extend, v; end
|
264
275
|
|
@@ -268,6 +279,7 @@ module Axlsx
|
|
268
279
|
# @return [String]
|
269
280
|
# @note true is for backwards compatability and is reassigned to :single
|
270
281
|
attr_reader :u
|
282
|
+
|
271
283
|
# @see u
|
272
284
|
def u=(v)
|
273
285
|
v = :single if (v == true || v == 1 || v == :true || v == 'true')
|
@@ -277,15 +289,17 @@ module Axlsx
|
|
277
289
|
# The inline color property for the cell
|
278
290
|
# @return [Color]
|
279
291
|
attr_reader :color
|
292
|
+
|
280
293
|
# @param [String] v The 8 character representation for an rgb color #FFFFFFFF"
|
281
294
|
def color=(v)
|
282
|
-
@color = v.is_a?(Color) ? v : Color.new(:rgb=>v)
|
295
|
+
@color = v.is_a?(Color) ? v : Color.new(:rgb => v)
|
283
296
|
@is_text_run = true
|
284
297
|
end
|
285
298
|
|
286
299
|
# The inline sz property for the cell
|
287
300
|
# @return [Inteter]
|
288
301
|
attr_reader :sz
|
302
|
+
|
289
303
|
# @see sz
|
290
304
|
def sz=(v) set_run_style :validate_unsigned_int, :sz, v; end
|
291
305
|
|
@@ -293,6 +307,7 @@ module Axlsx
|
|
293
307
|
# this must be one of [:baseline, :subscript, :superscript]
|
294
308
|
# @return [Symbol]
|
295
309
|
attr_reader :vertAlign
|
310
|
+
|
296
311
|
# @see vertAlign
|
297
312
|
def vertAlign=(v)
|
298
313
|
RestrictionValidator.validate :cell_vertAlign, [:baseline, :subscript, :superscript], v
|
@@ -303,6 +318,7 @@ module Axlsx
|
|
303
318
|
# this must be one of [:none, major, minor]
|
304
319
|
# @return [Symbol]
|
305
320
|
attr_reader :scheme
|
321
|
+
|
306
322
|
# @see scheme
|
307
323
|
def scheme=(v)
|
308
324
|
RestrictionValidator.validate :cell_scheme, [:none, :major, :minor], v
|
@@ -329,7 +345,7 @@ module Axlsx
|
|
329
345
|
# @example Absolute Cell Reference
|
330
346
|
# ws.rows.first.cells.first.r #=> "$A$1"
|
331
347
|
def r_abs
|
332
|
-
"$#{r.match(%r{([A-Z]+)([0-9]+)})[1,2].join('$')}"
|
348
|
+
"$#{r.match(%r{([A-Z]+)([0-9]+)})[1, 2].join('$')}"
|
333
349
|
end
|
334
350
|
|
335
351
|
# @return [Integer] The cellXfs item index applied to this cell.
|
@@ -338,6 +354,7 @@ module Axlsx
|
|
338
354
|
Axlsx::validate_unsigned_int(v)
|
339
355
|
count = styles.cellXfs.size
|
340
356
|
raise ArgumentError, "Invalid cellXfs id" unless v < count
|
357
|
+
|
341
358
|
@style = v
|
342
359
|
end
|
343
360
|
|
@@ -352,7 +369,7 @@ module Axlsx
|
|
352
369
|
def merge(target)
|
353
370
|
start, stop = if target.is_a?(String)
|
354
371
|
[self.r, target]
|
355
|
-
elsif
|
372
|
+
elsif target.is_a?(Cell)
|
356
373
|
Axlsx.sort_cells([self, target]).map { |c| c.r }
|
357
374
|
end
|
358
375
|
self.row.worksheet.merge_cells "#{start}:#{stop}" unless stop.nil?
|
@@ -370,10 +387,12 @@ module Axlsx
|
|
370
387
|
def is_formula?
|
371
388
|
return false if escape_formulas
|
372
389
|
|
373
|
-
type == :string && @value.to_s.start_with?(
|
390
|
+
type == :string && @value.to_s.start_with?(*FORMULA_PREFIXES)
|
374
391
|
end
|
375
392
|
|
376
393
|
def is_array_formula?
|
394
|
+
return false if escape_formulas
|
395
|
+
|
377
396
|
type == :string && @value.to_s.start_with?('{=') && @value.to_s.end_with?('}')
|
378
397
|
end
|
379
398
|
|
@@ -382,7 +401,7 @@ module Axlsx
|
|
382
401
|
# @param [Boolean] absolute -when false a relative reference will be
|
383
402
|
# returned.
|
384
403
|
# @return [String]
|
385
|
-
def reference(absolute=true)
|
404
|
+
def reference(absolute = true)
|
386
405
|
absolute ? r_abs : r
|
387
406
|
end
|
388
407
|
|
@@ -452,6 +471,7 @@ module Axlsx
|
|
452
471
|
# Utility method for setting inline style attributes
|
453
472
|
def set_run_style(validator, attr, value)
|
454
473
|
return unless INLINE_STYLES.include?(attr.to_sym)
|
474
|
+
|
455
475
|
Axlsx.send(validator, value) unless validator.nil?
|
456
476
|
self.instance_variable_set :"@#{attr.to_s}", value
|
457
477
|
@is_text_run = true
|
@@ -499,6 +519,7 @@ module Axlsx
|
|
499
519
|
# @see Axlsx#date1904
|
500
520
|
def cast_value(v)
|
501
521
|
return v if v.is_a?(RichText) || v.nil?
|
522
|
+
|
502
523
|
case type
|
503
524
|
when :date
|
504
525
|
self.style = STYLE_DATE if self.style == 0
|
@@ -521,12 +542,11 @@ module Axlsx
|
|
521
542
|
when :boolean
|
522
543
|
v ? 1 : 0
|
523
544
|
when :iso_8601
|
524
|
-
#consumer is responsible for ensuring the iso_8601 format when specifying this type
|
545
|
+
# consumer is responsible for ensuring the iso_8601 format when specifying this type
|
525
546
|
v
|
526
547
|
else
|
527
548
|
v.to_s
|
528
549
|
end
|
529
550
|
end
|
530
|
-
|
531
551
|
end
|
532
552
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
module Axlsx
|
2
|
-
|
3
2
|
# The Cell Serializer class contains the logic for serializing cells based on their type.
|
4
3
|
class CellSerializer
|
5
4
|
class << self
|
@@ -8,9 +7,10 @@ module Axlsx
|
|
8
7
|
# @param [Integer] column_index The index of the cell's column
|
9
8
|
# @param [String] str The string to apend serialization to.
|
10
9
|
# @return [String]
|
11
|
-
def to_xml_string(row_index, column_index, cell, str='')
|
10
|
+
def to_xml_string(row_index, column_index, cell, str = '')
|
12
11
|
str << ('<c r="' << Axlsx::cell_r(column_index, row_index) << '" s="' << cell.style.to_s << '" ')
|
13
12
|
return str << '/>' if cell.value.nil?
|
13
|
+
|
14
14
|
method = cell.type
|
15
15
|
self.send(method, cell, str)
|
16
16
|
str << '</c>'
|
@@ -22,7 +22,7 @@ module Axlsx
|
|
22
22
|
def run_xml_string(cell, str = '')
|
23
23
|
if cell.is_text_run?
|
24
24
|
valid = RichTextRun::INLINE_STYLES - [:value, :type]
|
25
|
-
data = Hash[Axlsx.instance_values_for(cell).map{ |k, v| [k.to_sym, v] }]
|
25
|
+
data = Hash[Axlsx.instance_values_for(cell).map { |k, v| [k.to_sym, v] }]
|
26
26
|
data = data.select { |key, value| valid.include?(key) && !value.nil? }
|
27
27
|
RichText.new(cell.value.to_s, data).to_xml_string(str)
|
28
28
|
elsif cell.contains_rich_text?
|
@@ -37,7 +37,7 @@ module Axlsx
|
|
37
37
|
# @param [Cell] cell The cell that is being serialized
|
38
38
|
# @param [String] str The string the serialized content will be appended to.
|
39
39
|
# @return [String]
|
40
|
-
def iso_8601(cell, str='')
|
40
|
+
def iso_8601(cell, str = '')
|
41
41
|
value_serialization 'd', cell.value, str
|
42
42
|
end
|
43
43
|
|
@@ -45,7 +45,7 @@ module Axlsx
|
|
45
45
|
# @param [Cell] cell The cell that is being serialized
|
46
46
|
# @param [String] str The string the serialized content will be appended to.
|
47
47
|
# @return [String]
|
48
|
-
def date(cell, str='')
|
48
|
+
def date(cell, str = '')
|
49
49
|
value_serialization false, DateTimeConverter::date_to_serial(cell.value).to_s, str
|
50
50
|
end
|
51
51
|
|
@@ -53,7 +53,7 @@ module Axlsx
|
|
53
53
|
# @param [Cell] cell The cell that is being serialized
|
54
54
|
# @param [String] str The string the serialized content will be appended to.
|
55
55
|
# @return [String]
|
56
|
-
def time(cell, str='')
|
56
|
+
def time(cell, str = '')
|
57
57
|
value_serialization false, DateTimeConverter::time_to_serial(cell.value).to_s, str
|
58
58
|
end
|
59
59
|
|
@@ -61,7 +61,7 @@ module Axlsx
|
|
61
61
|
# @param [Cell] cell The cell that is being serialized
|
62
62
|
# @param [String] str The string the serialized content will be appended to.
|
63
63
|
# @return [String]
|
64
|
-
def boolean(cell, str='')
|
64
|
+
def boolean(cell, str = '')
|
65
65
|
value_serialization 'b', cell.value.to_s, str
|
66
66
|
end
|
67
67
|
|
@@ -69,7 +69,7 @@ module Axlsx
|
|
69
69
|
# @param [Cell] cell The cell that is being serialized
|
70
70
|
# @param [String] str The string the serialized content will be appended to.
|
71
71
|
# @return [String]
|
72
|
-
def float(cell, str='')
|
72
|
+
def float(cell, str = '')
|
73
73
|
numeric cell, str
|
74
74
|
end
|
75
75
|
|
@@ -85,7 +85,7 @@ module Axlsx
|
|
85
85
|
# @param [Cell] cell The cell that is being serialized
|
86
86
|
# @param [String] str The string the serialized content will be appended to.
|
87
87
|
# @return [String]
|
88
|
-
def formula_serialization(cell, str='')
|
88
|
+
def formula_serialization(cell, str = '')
|
89
89
|
str << ('t="str"><f>' << cell.clean_value.to_s.sub('=', '') << '</f>')
|
90
90
|
str << ('<v>' << cell.formula_value.to_s << '</v>') unless cell.formula_value.nil?
|
91
91
|
end
|
@@ -94,7 +94,7 @@ module Axlsx
|
|
94
94
|
# @param [Cell] cell The cell that is being serialized
|
95
95
|
# @param [String] str The string the serialized content will be appended to.
|
96
96
|
# @return [String]
|
97
|
-
def array_formula_serialization(cell, str='')
|
97
|
+
def array_formula_serialization(cell, str = '')
|
98
98
|
str << ('t="str">' << '<f t="array" ref="' << cell.r << '">' << cell.clean_value.to_s.sub('{=', '').sub(/}$/, '') << '</f>')
|
99
99
|
str << ('<v>' << cell.formula_value.to_s << '</v>') unless cell.formula_value.nil?
|
100
100
|
end
|
@@ -113,7 +113,7 @@ module Axlsx
|
|
113
113
|
# @param [Cell] cell The cell that is being serialized
|
114
114
|
# @param [String] str The string the serialized content will be appended to.
|
115
115
|
# @return [String]
|
116
|
-
def string(cell, str='')
|
116
|
+
def string(cell, str = '')
|
117
117
|
if cell.is_array_formula?
|
118
118
|
array_formula_serialization cell, str
|
119
119
|
elsif cell.is_formula?
|
@@ -7,7 +7,6 @@ module Axlsx
|
|
7
7
|
# @see ConditionalFormattingRule#initialize
|
8
8
|
#
|
9
9
|
class Cfvo
|
10
|
-
|
11
10
|
include Axlsx::OptionsParser
|
12
11
|
include Axlsx::SerializedAttributes
|
13
12
|
|
@@ -15,7 +14,7 @@ module Axlsx
|
|
15
14
|
# @option options [Symbol] type The type of conditional formatting value object
|
16
15
|
# @option options [Boolean] gte threshold value usage indicator
|
17
16
|
# @option options [String] val The value of the conditional formatting object
|
18
|
-
def initialize(options={})
|
17
|
+
def initialize(options = {})
|
19
18
|
@gte = true
|
20
19
|
parse_options options
|
21
20
|
end
|
@@ -47,6 +46,7 @@ module Axlsx
|
|
47
46
|
# @see val
|
48
47
|
def val=(v)
|
49
48
|
raise ArgumentError, "#{v.inspect} must respond to to_s" unless v.respond_to?(:to_s)
|
49
|
+
|
50
50
|
@val = v.to_s
|
51
51
|
end
|
52
52
|
|
@@ -1,9 +1,7 @@
|
|
1
1
|
module Axlsx
|
2
|
-
|
3
|
-
#
|
4
|
-
#first two items
|
2
|
+
# A collection of Cfvo objects that initializes with the required
|
3
|
+
# first two items
|
5
4
|
class Cfvos < SimpleTypedList
|
6
|
-
|
7
5
|
def initialize
|
8
6
|
super(Cfvo)
|
9
7
|
end
|
@@ -11,7 +9,7 @@ module Axlsx
|
|
11
9
|
# Serialize the Cfvo object
|
12
10
|
# @param [String] str
|
13
11
|
# @return [String]
|
14
|
-
def to_xml_string(str='')
|
12
|
+
def to_xml_string(str = '')
|
15
13
|
each { |cfvo| cfvo.to_xml_string(str) }
|
16
14
|
end
|
17
15
|
end
|
@@ -1,9 +1,6 @@
|
|
1
|
-
# encoding: UTF-8
|
2
1
|
module Axlsx
|
3
|
-
|
4
2
|
# The Col class defines column attributes for columns in sheets.
|
5
3
|
class Col
|
6
|
-
|
7
4
|
# Maximum column width limit in MS Excel is 255 characters
|
8
5
|
# https://support.microsoft.com/en-us/office/excel-specifications-and-limits-1672b34d-7043-467e-8e27-269d656771c3
|
9
6
|
MAX_WIDTH = 255
|
@@ -19,7 +16,7 @@ module Axlsx
|
|
19
16
|
# @option options [Boolean] phonetic see Col#phonetic
|
20
17
|
# @option options [Integer] style see Col#style
|
21
18
|
# @option options [Numeric] width see Col#width
|
22
|
-
def initialize(min, max, options={})
|
19
|
+
def initialize(min, max, options = {})
|
23
20
|
Axlsx.validate_unsigned_int(max)
|
24
21
|
Axlsx.validate_unsigned_int(min)
|
25
22
|
@min = min
|
@@ -90,6 +87,7 @@ module Axlsx
|
|
90
87
|
def outline_level=(v)
|
91
88
|
Axlsx.validate_unsigned_numeric(v)
|
92
89
|
raise ArgumentError, 'outlineLevel must be between 0 and 7' unless 0 <= v && v <= 7
|
90
|
+
|
93
91
|
@outline_level = v
|
94
92
|
end
|
95
93
|
alias :outlineLevel= :outline_level=
|
@@ -106,14 +104,14 @@ module Axlsx
|
|
106
104
|
@style = v
|
107
105
|
end
|
108
106
|
|
109
|
-
|
107
|
+
# @see Col#width
|
110
108
|
def width=(v)
|
111
109
|
# Removing this validation make a 10% difference in performance
|
112
110
|
# as it is called EVERY TIME A CELL IS ADDED - the proper solution
|
113
111
|
# is to only set this if a calculated value is greated than the
|
114
112
|
# current @width value.
|
115
113
|
# TODO!!!
|
116
|
-
#Axlsx.validate_unsigned_numeric(v) unless v == nil
|
114
|
+
# Axlsx.validate_unsigned_numeric(v) unless v == nil
|
117
115
|
@custom_width = @best_fit = v != nil
|
118
116
|
@width = v.nil? ? v : [v, MAX_WIDTH].min
|
119
117
|
end
|
@@ -140,6 +138,5 @@ module Axlsx
|
|
140
138
|
def to_xml_string(str = '')
|
141
139
|
serialized_tag('col', str)
|
142
140
|
end
|
143
|
-
|
144
141
|
end
|
145
142
|
end
|
@@ -1,10 +1,8 @@
|
|
1
1
|
module Axlsx
|
2
|
-
|
3
2
|
# A collection of Brake objects.
|
4
|
-
# Please do not use this class directly. Instead use
|
3
|
+
# Please do not use this class directly. Instead use
|
5
4
|
# Worksheet#add_break
|
6
5
|
class ColBreaks < SimpleTypedList
|
7
|
-
|
8
6
|
# Instantiates a new list restricted to Break types
|
9
7
|
def initialize
|
10
8
|
super Break
|
@@ -12,7 +10,7 @@ module Axlsx
|
|
12
10
|
|
13
11
|
# A column break specific helper for adding a break.
|
14
12
|
# @param [Hash] options A list of options to pass into the Break object
|
15
|
-
# The max and man options are fixed, however any other valid option for
|
13
|
+
# The max and man options are fixed, however any other valid option for
|
16
14
|
# Break will be passed to the created break object.
|
17
15
|
# @see Break
|
18
16
|
def add_break(options)
|
@@ -25,8 +23,9 @@ module Axlsx
|
|
25
23
|
# <colBreaks count="1" manualBreakCount="1">
|
26
24
|
# <brk id="3" max="1048575" man="1"/>
|
27
25
|
# </colBreaks>
|
28
|
-
def to_xml_string(str='')
|
26
|
+
def to_xml_string(str = '')
|
29
27
|
return if empty?
|
28
|
+
|
30
29
|
str << ('<colBreaks count="' << size.to_s << '" manualBreakCount="' << size.to_s << '">')
|
31
30
|
each { |brk| brk.to_xml_string(str) }
|
32
31
|
str << '</colBreaks>'
|