caxlsx 3.3.0 → 3.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (148) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -1
  3. data/README.md +26 -6
  4. data/Rakefile +0 -1
  5. data/lib/axlsx/content_type/abstract_content_type.rb +2 -5
  6. data/lib/axlsx/content_type/content_type.rb +0 -4
  7. data/lib/axlsx/content_type/default.rb +1 -5
  8. data/lib/axlsx/content_type/override.rb +0 -4
  9. data/lib/axlsx/doc_props/app.rb +1 -6
  10. data/lib/axlsx/doc_props/core.rb +1 -6
  11. data/lib/axlsx/drawing/area_chart.rb +3 -6
  12. data/lib/axlsx/drawing/area_series.rb +1 -4
  13. data/lib/axlsx/drawing/ax_data_source.rb +1 -6
  14. data/lib/axlsx/drawing/axes.rb +5 -6
  15. data/lib/axlsx/drawing/axis.rb +7 -12
  16. data/lib/axlsx/drawing/bar_3D_chart.rb +7 -10
  17. data/lib/axlsx/drawing/bar_chart.rb +6 -9
  18. data/lib/axlsx/drawing/bar_series.rb +2 -8
  19. data/lib/axlsx/drawing/bubble_chart.rb +2 -5
  20. data/lib/axlsx/drawing/bubble_series.rb +3 -6
  21. data/lib/axlsx/drawing/cat_axis.rb +2 -7
  22. data/lib/axlsx/drawing/chart.rb +7 -12
  23. data/lib/axlsx/drawing/d_lbls.rb +23 -22
  24. data/lib/axlsx/drawing/drawing.rb +4 -8
  25. data/lib/axlsx/drawing/graphic_frame.rb +0 -3
  26. data/lib/axlsx/drawing/hyperlink.rb +4 -7
  27. data/lib/axlsx/drawing/line_3D_chart.rb +10 -14
  28. data/lib/axlsx/drawing/line_chart.rb +3 -6
  29. data/lib/axlsx/drawing/line_series.rb +1 -4
  30. data/lib/axlsx/drawing/marker.rb +5 -9
  31. data/lib/axlsx/drawing/num_data.rb +4 -9
  32. data/lib/axlsx/drawing/num_data_source.rb +3 -7
  33. data/lib/axlsx/drawing/num_val.rb +2 -5
  34. data/lib/axlsx/drawing/one_cell_anchor.rb +4 -6
  35. data/lib/axlsx/drawing/pic.rb +46 -13
  36. data/lib/axlsx/drawing/picture_locking.rb +3 -6
  37. data/lib/axlsx/drawing/pie_3D_chart.rb +2 -7
  38. data/lib/axlsx/drawing/pie_series.rb +1 -6
  39. data/lib/axlsx/drawing/scaling.rb +2 -5
  40. data/lib/axlsx/drawing/scatter_chart.rb +2 -5
  41. data/lib/axlsx/drawing/scatter_series.rb +2 -5
  42. data/lib/axlsx/drawing/ser_axis.rb +2 -6
  43. data/lib/axlsx/drawing/series.rb +3 -5
  44. data/lib/axlsx/drawing/series_title.rb +0 -2
  45. data/lib/axlsx/drawing/str_data.rb +3 -8
  46. data/lib/axlsx/drawing/str_val.rb +2 -5
  47. data/lib/axlsx/drawing/title.rb +12 -15
  48. data/lib/axlsx/drawing/two_cell_anchor.rb +5 -7
  49. data/lib/axlsx/drawing/val_axis.rb +1 -4
  50. data/lib/axlsx/drawing/view_3D.rb +24 -24
  51. data/lib/axlsx/drawing/vml_drawing.rb +2 -5
  52. data/lib/axlsx/drawing/vml_shape.rb +4 -7
  53. data/lib/axlsx/package.rb +35 -36
  54. data/lib/axlsx/rels/relationship.rb +21 -24
  55. data/lib/axlsx/rels/relationships.rb +3 -6
  56. data/lib/axlsx/stylesheet/border.rb +1 -4
  57. data/lib/axlsx/stylesheet/border_pr.rb +3 -5
  58. data/lib/axlsx/stylesheet/cell_alignment.rb +2 -10
  59. data/lib/axlsx/stylesheet/cell_protection.rb +1 -4
  60. data/lib/axlsx/stylesheet/cell_style.rb +3 -7
  61. data/lib/axlsx/stylesheet/color.rb +6 -5
  62. data/lib/axlsx/stylesheet/dxf.rb +2 -6
  63. data/lib/axlsx/stylesheet/fill.rb +0 -4
  64. data/lib/axlsx/stylesheet/font.rb +7 -6
  65. data/lib/axlsx/stylesheet/gradient_fill.rb +4 -6
  66. data/lib/axlsx/stylesheet/gradient_stop.rb +2 -3
  67. data/lib/axlsx/stylesheet/num_fmt.rb +1 -4
  68. data/lib/axlsx/stylesheet/pattern_fill.rb +3 -5
  69. data/lib/axlsx/stylesheet/styles.rb +53 -45
  70. data/lib/axlsx/stylesheet/table_style.rb +5 -8
  71. data/lib/axlsx/stylesheet/table_style_element.rb +1 -4
  72. data/lib/axlsx/stylesheet/table_styles.rb +3 -7
  73. data/lib/axlsx/stylesheet/xf.rb +3 -6
  74. data/lib/axlsx/util/accessors.rb +2 -4
  75. data/lib/axlsx/util/constants.rb +3 -5
  76. data/lib/axlsx/util/mime_type_utils.rb +13 -0
  77. data/lib/axlsx/util/options_parser.rb +1 -2
  78. data/lib/axlsx/util/serialized_attributes.rb +4 -5
  79. data/lib/axlsx/util/simple_typed_list.rb +18 -17
  80. data/lib/axlsx/util/storage.rb +32 -36
  81. data/lib/axlsx/util/validators.rb +7 -4
  82. data/lib/axlsx/util/zip_command.rb +0 -2
  83. data/lib/axlsx/version.rb +1 -2
  84. data/lib/axlsx/workbook/defined_name.rb +6 -5
  85. data/lib/axlsx/workbook/defined_names.rb +1 -2
  86. data/lib/axlsx/workbook/shared_strings_table.rb +3 -6
  87. data/lib/axlsx/workbook/workbook.rb +96 -91
  88. data/lib/axlsx/workbook/workbook_view.rb +5 -10
  89. data/lib/axlsx/workbook/workbook_views.rb +1 -3
  90. data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +9 -8
  91. data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +6 -6
  92. data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +13 -14
  93. data/lib/axlsx/workbook/worksheet/border_creator.rb +29 -26
  94. data/lib/axlsx/workbook/worksheet/break.rb +2 -5
  95. data/lib/axlsx/workbook/worksheet/cell.rb +55 -27
  96. data/lib/axlsx/workbook/worksheet/cell_serializer.rb +11 -11
  97. data/lib/axlsx/workbook/worksheet/cfvo.rb +2 -2
  98. data/lib/axlsx/workbook/worksheet/cfvos.rb +3 -5
  99. data/lib/axlsx/workbook/worksheet/col.rb +4 -7
  100. data/lib/axlsx/workbook/worksheet/col_breaks.rb +4 -5
  101. data/lib/axlsx/workbook/worksheet/color_scale.rb +10 -12
  102. data/lib/axlsx/workbook/worksheet/cols.rb +6 -6
  103. data/lib/axlsx/workbook/worksheet/comment.rb +4 -5
  104. data/lib/axlsx/workbook/worksheet/comments.rb +6 -10
  105. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +4 -5
  106. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +2 -6
  107. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +2 -4
  108. data/lib/axlsx/workbook/worksheet/data_bar.rb +20 -22
  109. data/lib/axlsx/workbook/worksheet/data_validation.rb +4 -5
  110. data/lib/axlsx/workbook/worksheet/data_validations.rb +2 -5
  111. data/lib/axlsx/workbook/worksheet/date_time_converter.rb +1 -3
  112. data/lib/axlsx/workbook/worksheet/dimension.rb +5 -4
  113. data/lib/axlsx/workbook/worksheet/header_footer.rb +0 -1
  114. data/lib/axlsx/workbook/worksheet/icon_set.rb +2 -3
  115. data/lib/axlsx/workbook/worksheet/merged_cells.rb +8 -8
  116. data/lib/axlsx/workbook/worksheet/outline_pr.rb +0 -1
  117. data/lib/axlsx/workbook/worksheet/page_margins.rb +2 -2
  118. data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +1 -3
  119. data/lib/axlsx/workbook/worksheet/page_setup.rb +117 -120
  120. data/lib/axlsx/workbook/worksheet/pane.rb +16 -17
  121. data/lib/axlsx/workbook/worksheet/pivot_table.rb +8 -11
  122. data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +8 -11
  123. data/lib/axlsx/workbook/worksheet/pivot_tables.rb +3 -4
  124. data/lib/axlsx/workbook/worksheet/print_options.rb +0 -1
  125. data/lib/axlsx/workbook/worksheet/protected_range.rb +4 -5
  126. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +9 -9
  127. data/lib/axlsx/workbook/worksheet/rich_text.rb +4 -6
  128. data/lib/axlsx/workbook/worksheet/rich_text_run.rb +21 -5
  129. data/lib/axlsx/workbook/worksheet/row.rb +24 -15
  130. data/lib/axlsx/workbook/worksheet/row_breaks.rb +3 -4
  131. data/lib/axlsx/workbook/worksheet/selection.rb +7 -9
  132. data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +5 -6
  133. data/lib/axlsx/workbook/worksheet/sheet_data.rb +4 -6
  134. data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +18 -18
  135. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +4 -4
  136. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +12 -13
  137. data/lib/axlsx/workbook/worksheet/sheet_view.rb +35 -42
  138. data/lib/axlsx/workbook/worksheet/table.rb +7 -9
  139. data/lib/axlsx/workbook/worksheet/table_style_info.rb +2 -3
  140. data/lib/axlsx/workbook/worksheet/tables.rb +4 -4
  141. data/lib/axlsx/workbook/worksheet/worksheet.rb +63 -35
  142. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +6 -6
  143. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +3 -2
  144. data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +5 -6
  145. data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +4 -4
  146. data/lib/axlsx.rb +23 -9
  147. data/lib/caxlsx.rb +0 -1
  148. metadata +3 -3
@@ -1,39 +1,43 @@
1
- # encoding: UTF-8
2
-
3
1
  module Axlsx
4
2
  class BorderCreator
5
- attr_reader :worksheet, :cells, :edges, :width, :color
6
-
7
- def initialize(worksheet, cells, args)
3
+ def initialize(worksheet:, cells:, edges: nil, style: nil, color: nil)
8
4
  @worksheet = worksheet
9
- @cells = cells
10
- if args.is_a?(Hash)
11
- @edges = args[:edges] || Axlsx::Border::EDGES
12
- @width = args[:style] || :thin
13
- @color = args[:color] || '000000'
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 @edges.is_a?(Array)
23
- @edges = (@edges.map(&:to_sym).uniq & Axlsx::Border::EDGES)
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
- @edges.each do |edge|
31
- worksheet.add_style(
32
- border_cells[edge],
25
+ if @cells.size == 1
26
+ @worksheet.add_style(
27
+ first_cell,
33
28
  {
34
- border: {style: @width, color: @color, edges: [edge]}
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 - Whether to treat a value starting with an equal
34
- # sign as formula (default) or as simple string.
35
- # Allowing user generated data to be interpreted as formulas can be dangerous
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,16 @@ 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 = ['='.freeze].freeze
76
+
77
+ # Leading characters that indicate an array formula.
78
+ ARRAY_FORMULA_PREFIXES = ['{='.freeze].freeze
79
+
80
+ # Trailing character that indicates an array formula.
81
+ ARRAY_FORMULA_SUFFIX = '}'.freeze
82
+
78
83
  # The index of the cellXfs item to be applied to this cell.
79
84
  # @return [Integer]
80
85
  # @see Axlsx::Styles
@@ -104,7 +109,7 @@ module Axlsx
104
109
  self.raw_style = new_style
105
110
 
106
111
  wb = row.worksheet.workbook
107
-
112
+
108
113
  wb.styled_cells << self
109
114
  end
110
115
 
@@ -134,16 +139,17 @@ module Axlsx
134
139
  self.value = @value unless !defined?(@value) || @value.nil?
135
140
  end
136
141
 
137
- # Whether to treat a value starting with an equal
138
- # sign as formula (default) or as simple string.
139
- # Allowing user generated data to be interpreted as formulas can be dangerous
140
- # (see https://www.owasp.org/index.php/CSV_Injection for details).
142
+ # Whether to treat values starting with an equals sign as formulas or as literal strings.
143
+ # Allowing user-generated data to be interpreted as formulas is a security risk.
144
+ # See https://www.owasp.org/index.php/CSV_Injection for details.
141
145
  # @return [Boolean]
142
146
  attr_reader :escape_formulas
143
147
 
144
- def escape_formulas=(v)
145
- Axlsx.validate_boolean(v)
146
- @escape_formulas = v
148
+ # Sets whether to treat values starting with an equals sign as formulas or as literal strings.
149
+ # @param [Boolean] value The value to set.
150
+ def escape_formulas=(value)
151
+ Axlsx.validate_boolean(value)
152
+ @escape_formulas = value
147
153
  end
148
154
 
149
155
  # The value of this cell.
@@ -152,7 +158,7 @@ module Axlsx
152
158
 
153
159
  # @see value
154
160
  def value=(v)
155
- #TODO: consider doing value based type determination first?
161
+ # TODO: consider doing value based type determination first?
156
162
  @value = cast_value(v)
157
163
  end
158
164
 
@@ -172,12 +178,14 @@ module Axlsx
172
178
  !is_text_run? && # No inline styles
173
179
  !@value.nil? && # Not nil
174
180
  !@value.empty? && # Not empty
175
- !@value.start_with?(?=) # Not a formula
181
+ !is_formula? && # Not a formula
182
+ !is_array_formula? # Not an array formula
176
183
  end
177
184
 
178
185
  # The inline font_name property for the cell
179
186
  # @return [String]
180
187
  attr_reader :font_name
188
+
181
189
  # @see font_name
182
190
  def font_name=(v) set_run_style :validate_string, :font_name, v; end
183
191
 
@@ -204,6 +212,7 @@ module Axlsx
204
212
  # 255  OEM_CHARSET
205
213
  # @return [String]
206
214
  attr_reader :charset
215
+
207
216
  # @see charset
208
217
  def charset=(v) set_run_style :validate_unsigned_int, :charset, v; end
209
218
 
@@ -215,6 +224,7 @@ module Axlsx
215
224
  # 4 Script
216
225
  # 5 Decorative
217
226
  attr_reader :family
227
+
218
228
  # @see family
219
229
  def family=(v)
220
230
  set_run_style :validate_family, :family, v.to_i
@@ -223,42 +233,49 @@ module Axlsx
223
233
  # The inline bold property for the cell
224
234
  # @return [Boolean]
225
235
  attr_reader :b
236
+
226
237
  # @see b
227
238
  def b=(v) set_run_style :validate_boolean, :b, v; end
228
239
 
229
240
  # The inline italic property for the cell
230
241
  # @return [Boolean]
231
242
  attr_reader :i
243
+
232
244
  # @see i
233
245
  def i=(v) set_run_style :validate_boolean, :i, v; end
234
246
 
235
247
  # The inline strike property for the cell
236
248
  # @return [Boolean]
237
249
  attr_reader :strike
250
+
238
251
  # @see strike
239
252
  def strike=(v) set_run_style :validate_boolean, :strike, v; end
240
253
 
241
254
  # The inline outline property for the cell
242
255
  # @return [Boolean]
243
256
  attr_reader :outline
257
+
244
258
  # @see outline
245
259
  def outline=(v) set_run_style :validate_boolean, :outline, v; end
246
260
 
247
261
  # The inline shadow property for the cell
248
262
  # @return [Boolean]
249
263
  attr_reader :shadow
264
+
250
265
  # @see shadow
251
266
  def shadow=(v) set_run_style :validate_boolean, :shadow, v; end
252
267
 
253
268
  # The inline condense property for the cell
254
269
  # @return [Boolean]
255
270
  attr_reader :condense
271
+
256
272
  # @see condense
257
273
  def condense=(v) set_run_style :validate_boolean, :condense, v; end
258
274
 
259
275
  # The inline extend property for the cell
260
276
  # @return [Boolean]
261
277
  attr_reader :extend
278
+
262
279
  # @see extend
263
280
  def extend=(v) set_run_style :validate_boolean, :extend, v; end
264
281
 
@@ -268,6 +285,7 @@ module Axlsx
268
285
  # @return [String]
269
286
  # @note true is for backwards compatability and is reassigned to :single
270
287
  attr_reader :u
288
+
271
289
  # @see u
272
290
  def u=(v)
273
291
  v = :single if (v == true || v == 1 || v == :true || v == 'true')
@@ -277,15 +295,17 @@ module Axlsx
277
295
  # The inline color property for the cell
278
296
  # @return [Color]
279
297
  attr_reader :color
298
+
280
299
  # @param [String] v The 8 character representation for an rgb color #FFFFFFFF"
281
300
  def color=(v)
282
- @color = v.is_a?(Color) ? v : Color.new(:rgb=>v)
301
+ @color = v.is_a?(Color) ? v : Color.new(:rgb => v)
283
302
  @is_text_run = true
284
303
  end
285
304
 
286
305
  # The inline sz property for the cell
287
306
  # @return [Inteter]
288
307
  attr_reader :sz
308
+
289
309
  # @see sz
290
310
  def sz=(v) set_run_style :validate_unsigned_int, :sz, v; end
291
311
 
@@ -293,6 +313,7 @@ module Axlsx
293
313
  # this must be one of [:baseline, :subscript, :superscript]
294
314
  # @return [Symbol]
295
315
  attr_reader :vertAlign
316
+
296
317
  # @see vertAlign
297
318
  def vertAlign=(v)
298
319
  RestrictionValidator.validate :cell_vertAlign, [:baseline, :subscript, :superscript], v
@@ -303,6 +324,7 @@ module Axlsx
303
324
  # this must be one of [:none, major, minor]
304
325
  # @return [Symbol]
305
326
  attr_reader :scheme
327
+
306
328
  # @see scheme
307
329
  def scheme=(v)
308
330
  RestrictionValidator.validate :cell_scheme, [:none, :major, :minor], v
@@ -329,7 +351,7 @@ module Axlsx
329
351
  # @example Absolute Cell Reference
330
352
  # ws.rows.first.cells.first.r #=> "$A$1"
331
353
  def r_abs
332
- "$#{r.match(%r{([A-Z]+)([0-9]+)})[1,2].join('$')}"
354
+ "$#{r.match(%r{([A-Z]+)([0-9]+)})[1, 2].join('$')}"
333
355
  end
334
356
 
335
357
  # @return [Integer] The cellXfs item index applied to this cell.
@@ -338,6 +360,7 @@ module Axlsx
338
360
  Axlsx::validate_unsigned_int(v)
339
361
  count = styles.cellXfs.size
340
362
  raise ArgumentError, "Invalid cellXfs id" unless v < count
363
+
341
364
  @style = v
342
365
  end
343
366
 
@@ -352,7 +375,7 @@ module Axlsx
352
375
  def merge(target)
353
376
  start, stop = if target.is_a?(String)
354
377
  [self.r, target]
355
- elsif(target.is_a?(Cell))
378
+ elsif target.is_a?(Cell)
356
379
  Axlsx.sort_cells([self, target]).map { |c| c.r }
357
380
  end
358
381
  self.row.worksheet.merge_cells "#{start}:#{stop}" unless stop.nil?
@@ -370,11 +393,15 @@ module Axlsx
370
393
  def is_formula?
371
394
  return false if escape_formulas
372
395
 
373
- type == :string && @value.to_s.start_with?(?=)
396
+ type == :string && @value.to_s.start_with?(*FORMULA_PREFIXES)
374
397
  end
375
398
 
376
399
  def is_array_formula?
377
- type == :string && @value.to_s.start_with?('{=') && @value.to_s.end_with?('}')
400
+ return false if escape_formulas
401
+
402
+ type == :string &&
403
+ @value.to_s.start_with?(*ARRAY_FORMULA_PREFIXES) &&
404
+ @value.to_s.end_with?(ARRAY_FORMULA_SUFFIX)
378
405
  end
379
406
 
380
407
  # returns the absolute or relative string style reference for
@@ -382,7 +409,7 @@ module Axlsx
382
409
  # @param [Boolean] absolute -when false a relative reference will be
383
410
  # returned.
384
411
  # @return [String]
385
- def reference(absolute=true)
412
+ def reference(absolute = true)
386
413
  absolute ? r_abs : r
387
414
  end
388
415
 
@@ -452,6 +479,7 @@ module Axlsx
452
479
  # Utility method for setting inline style attributes
453
480
  def set_run_style(validator, attr, value)
454
481
  return unless INLINE_STYLES.include?(attr.to_sym)
482
+
455
483
  Axlsx.send(validator, value) unless validator.nil?
456
484
  self.instance_variable_set :"@#{attr.to_s}", value
457
485
  @is_text_run = true
@@ -499,6 +527,7 @@ module Axlsx
499
527
  # @see Axlsx#date1904
500
528
  def cast_value(v)
501
529
  return v if v.is_a?(RichText) || v.nil?
530
+
502
531
  case type
503
532
  when :date
504
533
  self.style = STYLE_DATE if self.style == 0
@@ -521,12 +550,11 @@ module Axlsx
521
550
  when :boolean
522
551
  v ? 1 : 0
523
552
  when :iso_8601
524
- #consumer is responsible for ensuring the iso_8601 format when specifying this type
553
+ # consumer is responsible for ensuring the iso_8601 format when specifying this type
525
554
  v
526
555
  else
527
556
  v.to_s
528
557
  end
529
558
  end
530
-
531
559
  end
532
560
  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
- #A collection of Cfvo objects that initializes with the required
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
- # @see Col#width
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>'