caxlsx 3.3.0 → 4.0.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.
Files changed (151) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +25 -0
  3. data/README.md +25 -7
  4. data/Rakefile +7 -6
  5. data/lib/axlsx/content_type/abstract_content_type.rb +11 -9
  6. data/lib/axlsx/content_type/content_type.rb +7 -9
  7. data/lib/axlsx/content_type/default.rb +4 -6
  8. data/lib/axlsx/content_type/override.rb +3 -5
  9. data/lib/axlsx/doc_props/app.rb +27 -30
  10. data/lib/axlsx/doc_props/core.rb +9 -12
  11. data/lib/axlsx/drawing/area_chart.rb +13 -14
  12. data/lib/axlsx/drawing/area_series.rb +13 -14
  13. data/lib/axlsx/drawing/ax_data_source.rb +3 -6
  14. data/lib/axlsx/drawing/axes.rb +10 -9
  15. data/lib/axlsx/drawing/axis.rb +27 -30
  16. data/lib/axlsx/drawing/bar_3D_chart.rb +17 -18
  17. data/lib/axlsx/drawing/bar_chart.rb +16 -17
  18. data/lib/axlsx/drawing/bar_series.rb +9 -13
  19. data/lib/axlsx/drawing/bubble_chart.rb +8 -9
  20. data/lib/axlsx/drawing/bubble_series.rb +9 -10
  21. data/lib/axlsx/drawing/cat_axis.rb +14 -17
  22. data/lib/axlsx/drawing/chart.rb +25 -28
  23. data/lib/axlsx/drawing/d_lbls.rb +29 -26
  24. data/lib/axlsx/drawing/drawing.rb +60 -62
  25. data/lib/axlsx/drawing/graphic_frame.rb +6 -7
  26. data/lib/axlsx/drawing/hyperlink.rb +12 -13
  27. data/lib/axlsx/drawing/line_3D_chart.rb +13 -15
  28. data/lib/axlsx/drawing/line_chart.rb +13 -14
  29. data/lib/axlsx/drawing/line_series.rb +13 -14
  30. data/lib/axlsx/drawing/marker.rb +14 -16
  31. data/lib/axlsx/drawing/num_data.rb +13 -16
  32. data/lib/axlsx/drawing/num_data_source.rb +11 -13
  33. data/lib/axlsx/drawing/num_val.rb +9 -10
  34. data/lib/axlsx/drawing/one_cell_anchor.rb +10 -10
  35. data/lib/axlsx/drawing/pic.rb +57 -22
  36. data/lib/axlsx/drawing/picture_locking.rb +6 -7
  37. data/lib/axlsx/drawing/pie_3D_chart.rb +6 -9
  38. data/lib/axlsx/drawing/pie_series.rb +9 -12
  39. data/lib/axlsx/drawing/scaling.rb +9 -10
  40. data/lib/axlsx/drawing/scatter_chart.rb +9 -10
  41. data/lib/axlsx/drawing/scatter_series.rb +15 -16
  42. data/lib/axlsx/drawing/ser_axis.rb +9 -11
  43. data/lib/axlsx/drawing/series.rb +8 -8
  44. data/lib/axlsx/drawing/series_title.rb +6 -6
  45. data/lib/axlsx/drawing/str_data.rb +10 -13
  46. data/lib/axlsx/drawing/str_val.rb +8 -9
  47. data/lib/axlsx/drawing/title.rb +23 -27
  48. data/lib/axlsx/drawing/two_cell_anchor.rb +8 -8
  49. data/lib/axlsx/drawing/val_axis.rb +5 -6
  50. data/lib/axlsx/drawing/view_3D.rb +32 -30
  51. data/lib/axlsx/drawing/vml_drawing.rb +19 -20
  52. data/lib/axlsx/drawing/vml_shape.rb +25 -26
  53. data/lib/axlsx/package.rb +81 -79
  54. data/lib/axlsx/rels/relationship.rb +30 -28
  55. data/lib/axlsx/rels/relationships.rb +7 -8
  56. data/lib/axlsx/stylesheet/border.rb +7 -8
  57. data/lib/axlsx/stylesheet/border_pr.rb +8 -8
  58. data/lib/axlsx/stylesheet/cell_alignment.rb +14 -20
  59. data/lib/axlsx/stylesheet/cell_protection.rb +6 -7
  60. data/lib/axlsx/stylesheet/cell_style.rb +12 -14
  61. data/lib/axlsx/stylesheet/color.rb +15 -12
  62. data/lib/axlsx/stylesheet/dxf.rb +7 -9
  63. data/lib/axlsx/stylesheet/fill.rb +3 -5
  64. data/lib/axlsx/stylesheet/font.rb +24 -21
  65. data/lib/axlsx/stylesheet/gradient_fill.rb +9 -9
  66. data/lib/axlsx/stylesheet/gradient_stop.rb +7 -6
  67. data/lib/axlsx/stylesheet/num_fmt.rb +9 -14
  68. data/lib/axlsx/stylesheet/pattern_fill.rb +8 -8
  69. data/lib/axlsx/stylesheet/styles.rb +104 -98
  70. data/lib/axlsx/stylesheet/table_style.rb +8 -9
  71. data/lib/axlsx/stylesheet/table_style_element.rb +7 -8
  72. data/lib/axlsx/stylesheet/table_styles.rb +8 -10
  73. data/lib/axlsx/stylesheet/xf.rb +21 -22
  74. data/lib/axlsx/util/accessors.rb +6 -6
  75. data/lib/axlsx/util/buffered_zip_output_stream.rb +60 -0
  76. data/lib/axlsx/util/constants.rb +119 -108
  77. data/lib/axlsx/util/mime_type_utils.rb +11 -0
  78. data/lib/axlsx/util/options_parser.rb +4 -3
  79. data/lib/axlsx/util/serialized_attributes.rb +45 -21
  80. data/lib/axlsx/util/simple_typed_list.rb +58 -57
  81. data/lib/axlsx/util/storage.rb +38 -41
  82. data/lib/axlsx/util/validators.rb +107 -44
  83. data/lib/axlsx/util/zip_command.rb +10 -12
  84. data/lib/axlsx/version.rb +3 -2
  85. data/lib/axlsx/workbook/defined_name.rb +11 -8
  86. data/lib/axlsx/workbook/defined_names.rb +4 -3
  87. data/lib/axlsx/workbook/shared_strings_table.rb +10 -11
  88. data/lib/axlsx/workbook/workbook.rb +121 -114
  89. data/lib/axlsx/workbook/workbook_view.rb +8 -11
  90. data/lib/axlsx/workbook/workbook_views.rb +4 -4
  91. data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +72 -14
  92. data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +11 -7
  93. data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +24 -21
  94. data/lib/axlsx/workbook/worksheet/auto_filter/sort_condition.rb +51 -0
  95. data/lib/axlsx/workbook/worksheet/auto_filter/sort_state.rb +56 -0
  96. data/lib/axlsx/workbook/worksheet/border_creator.rb +30 -25
  97. data/lib/axlsx/workbook/worksheet/break.rb +4 -5
  98. data/lib/axlsx/workbook/worksheet/cell.rb +92 -65
  99. data/lib/axlsx/workbook/worksheet/cell_serializer.rb +32 -28
  100. data/lib/axlsx/workbook/worksheet/cfvo.rb +7 -5
  101. data/lib/axlsx/workbook/worksheet/cfvos.rb +5 -5
  102. data/lib/axlsx/workbook/worksheet/col.rb +9 -10
  103. data/lib/axlsx/workbook/worksheet/col_breaks.rb +8 -7
  104. data/lib/axlsx/workbook/worksheet/color_scale.rb +16 -16
  105. data/lib/axlsx/workbook/worksheet/cols.rb +9 -7
  106. data/lib/axlsx/workbook/worksheet/comment.rb +12 -11
  107. data/lib/axlsx/workbook/worksheet/comments.rb +10 -12
  108. data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +12 -8
  109. data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +19 -21
  110. data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +5 -5
  111. data/lib/axlsx/workbook/worksheet/data_bar.rb +29 -30
  112. data/lib/axlsx/workbook/worksheet/data_validation.rb +34 -33
  113. data/lib/axlsx/workbook/worksheet/data_validations.rb +5 -6
  114. data/lib/axlsx/workbook/worksheet/date_time_converter.rb +8 -8
  115. data/lib/axlsx/workbook/worksheet/dimension.rb +9 -6
  116. data/lib/axlsx/workbook/worksheet/header_footer.rb +4 -3
  117. data/lib/axlsx/workbook/worksheet/icon_set.rb +24 -8
  118. data/lib/axlsx/workbook/worksheet/merged_cells.rb +10 -10
  119. data/lib/axlsx/workbook/worksheet/outline_pr.rb +6 -3
  120. data/lib/axlsx/workbook/worksheet/page_margins.rb +17 -12
  121. data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +6 -4
  122. data/lib/axlsx/workbook/worksheet/page_setup.rb +128 -129
  123. data/lib/axlsx/workbook/worksheet/pane.rb +27 -26
  124. data/lib/axlsx/workbook/worksheet/pivot_table.rb +23 -25
  125. data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +12 -13
  126. data/lib/axlsx/workbook/worksheet/pivot_tables.rb +5 -4
  127. data/lib/axlsx/workbook/worksheet/print_options.rb +3 -2
  128. data/lib/axlsx/workbook/worksheet/protected_range.rb +6 -5
  129. data/lib/axlsx/workbook/worksheet/protected_ranges.rb +12 -10
  130. data/lib/axlsx/workbook/worksheet/rich_text.rb +6 -6
  131. data/lib/axlsx/workbook/worksheet/rich_text_run.rb +35 -17
  132. data/lib/axlsx/workbook/worksheet/row.rb +30 -22
  133. data/lib/axlsx/workbook/worksheet/row_breaks.rb +8 -7
  134. data/lib/axlsx/workbook/worksheet/selection.rb +16 -16
  135. data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +10 -7
  136. data/lib/axlsx/workbook/worksheet/sheet_data.rb +7 -7
  137. data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +23 -19
  138. data/lib/axlsx/workbook/worksheet/sheet_pr.rb +11 -7
  139. data/lib/axlsx/workbook/worksheet/sheet_protection.rb +21 -20
  140. data/lib/axlsx/workbook/worksheet/sheet_view.rb +48 -53
  141. data/lib/axlsx/workbook/worksheet/table.rb +13 -13
  142. data/lib/axlsx/workbook/worksheet/table_style_info.rb +6 -5
  143. data/lib/axlsx/workbook/worksheet/tables.rb +7 -5
  144. data/lib/axlsx/workbook/worksheet/worksheet.rb +92 -63
  145. data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +10 -8
  146. data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +11 -4
  147. data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +9 -8
  148. data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +7 -5
  149. data/lib/axlsx.rb +75 -47
  150. data/lib/caxlsx.rb +3 -2
  151. metadata +50 -44
@@ -1,8 +1,8 @@
1
- module Axlsx
1
+ # frozen_string_literal: true
2
2
 
3
+ module Axlsx
3
4
  # A worksheet hyperlink object. Note that this is not the same as a drawing hyperlink object.
4
5
  class WorksheetHyperlink
5
-
6
6
  include Axlsx::OptionsParser
7
7
  include Axlsx::Accessors
8
8
  include Axlsx::SerializedAttributes
@@ -15,7 +15,7 @@ module Axlsx
15
15
  # @option [String] tooltip The tip to display when the user positions the mouse cursor over this hyperlink
16
16
  # @option [Symbol] target This is :external by default. If you set it to anything else, the location is interpreted to be the current workbook.
17
17
  # @option [String|Cell] ref The location of this hyperlink in the worksheet
18
- def initialize(worksheet, options={})
18
+ def initialize(worksheet, options = {})
19
19
  DataTypeValidator.validate "Hyperlink.worksheet", [Worksheet], worksheet
20
20
  @worksheet = worksheet
21
21
  @target = :external
@@ -27,7 +27,7 @@ module Axlsx
27
27
 
28
28
  serializable_attributes :display, :tooltip, :ref
29
29
 
30
- #Cell location of hyperlink on worksheet.
30
+ # Cell location of hyperlink on worksheet.
31
31
  # @return [String]
32
32
  attr_reader :ref
33
33
 
@@ -41,7 +41,7 @@ module Axlsx
41
41
  # @param [String|Cell] cell_reference The string reference or cell that defines where this hyperlink shows in the worksheet.
42
42
  def ref=(cell_reference)
43
43
  cell_reference = cell_reference.r if cell_reference.is_a?(Cell)
44
- Axlsx::validate_string cell_reference
44
+ Axlsx.validate_string cell_reference
45
45
  @ref = cell_reference
46
46
  end
47
47
 
@@ -51,13 +51,14 @@ module Axlsx
51
51
  # @return [Relationship]
52
52
  def relationship
53
53
  return unless @target == :external
54
- Relationship.new(self, HYPERLINK_R, location, :target_mode => :External)
54
+
55
+ Relationship.new(self, HYPERLINK_R, location, target_mode: :External)
55
56
  end
56
57
 
57
58
  # Seralize the object
58
59
  # @param [String] str
59
60
  # @return [String]
60
- def to_xml_string(str='')
61
+ def to_xml_string(str = +'')
61
62
  str << '<hyperlink '
62
63
  serialized_attributes str, location_or_id
63
64
  str << '/>'
@@ -68,7 +69,7 @@ module Axlsx
68
69
  # r:id should only be specified for external targets.
69
70
  # @return [Hash]
70
71
  def location_or_id
71
- @target == :external ? { :"r:id" => relationship.Id } : { :location => Axlsx::coder.encode(location) }
72
+ @target == :external ? { "r:id": relationship.Id } : { location: Axlsx.coder.encode(location) }
72
73
  end
73
74
  end
74
75
  end
@@ -1,8 +1,8 @@
1
- module Axlsx
1
+ # frozen_string_literal: true
2
2
 
3
- #A collection of hyperlink objects for a worksheet
3
+ module Axlsx
4
+ # A collection of hyperlink objects for a worksheet
4
5
  class WorksheetHyperlinks < SimpleTypedList
5
-
6
6
  # Creates a new Hyperlinks collection
7
7
  # @param [Worksheet] worksheet the worksheet that owns these hyperlinks
8
8
  def initialize(worksheet)
@@ -23,13 +23,15 @@ module Axlsx
23
23
  # @return Array
24
24
  def relationships
25
25
  return [] if empty?
26
- map { |hyperlink| hyperlink.relationship }
26
+
27
+ map(&:relationship)
27
28
  end
28
29
 
29
30
  # seralize the collection of hyperlinks
30
31
  # @return [String]
31
- def to_xml_string(str='')
32
+ def to_xml_string(str = +'')
32
33
  return if empty?
34
+
33
35
  str << '<hyperlinks>'
34
36
  each { |hyperlink| hyperlink.to_xml_string(str) }
35
37
  str << '</hyperlinks>'
data/lib/axlsx.rb CHANGED
@@ -1,42 +1,41 @@
1
- # encoding: UTF-8
1
+ # frozen_string_literal: true
2
+
2
3
  require 'htmlentities'
3
- require 'axlsx/version.rb'
4
+ require 'axlsx/version'
4
5
  require 'marcel'
5
6
 
6
- require 'axlsx/util/simple_typed_list.rb'
7
- require 'axlsx/util/constants.rb'
8
- require 'axlsx/util/validators.rb'
9
- require 'axlsx/util/accessors.rb'
7
+ require 'axlsx/util/simple_typed_list'
8
+ require 'axlsx/util/constants'
9
+ require 'axlsx/util/validators'
10
+ require 'axlsx/util/accessors'
10
11
  require 'axlsx/util/serialized_attributes'
11
12
  require 'axlsx/util/options_parser'
12
13
  require 'axlsx/util/mime_type_utils'
14
+ require 'axlsx/util/buffered_zip_output_stream'
13
15
  require 'axlsx/util/zip_command'
14
16
 
15
- require 'axlsx/stylesheet/styles.rb'
17
+ require 'axlsx/stylesheet/styles'
16
18
 
17
- require 'axlsx/doc_props/app.rb'
18
- require 'axlsx/doc_props/core.rb'
19
- require 'axlsx/content_type/content_type.rb'
20
- require 'axlsx/rels/relationships.rb'
19
+ require 'axlsx/doc_props/app'
20
+ require 'axlsx/doc_props/core'
21
+ require 'axlsx/content_type/content_type'
22
+ require 'axlsx/rels/relationships'
21
23
 
22
- require 'axlsx/drawing/drawing.rb'
23
- require 'axlsx/workbook/workbook.rb'
24
- require 'axlsx/package.rb'
25
- #required gems
24
+ require 'axlsx/drawing/drawing'
25
+ require 'axlsx/workbook/workbook'
26
+ require 'axlsx/package'
27
+ # required gems
26
28
  require 'nokogiri'
27
29
  require 'zip'
28
30
 
29
- #core dependencies
31
+ # core dependencies
30
32
  require 'bigdecimal'
33
+ require 'cgi'
31
34
  require 'set'
32
35
  require 'time'
33
36
 
34
- begin
35
- if Gem.loaded_specs.has_key?("axlsx_styler")
36
- raise StandardError.new("Please remove `axlsx_styler` from your Gemfile, the associated functionality is now built-in to `caxlsx` directly.")
37
- end
38
- rescue
39
- # Do nothing
37
+ if Gem.loaded_specs.key?("axlsx_styler")
38
+ raise StandardError, "Please remove `axlsx_styler` from your Gemfile, the associated functionality is now built-in to `caxlsx` directly."
40
39
  end
41
40
 
42
41
  # xlsx generation with charts, images, automated column width, customizable styles
@@ -51,11 +50,11 @@ module Axlsx
51
50
  #
52
51
  # Defining as a class method on Axlsx to refrain from monkeypatching Object for all users of this gem.
53
52
  def self.instance_values_for(object)
54
- Hash[object.instance_variables.map { |name| [name.to_s[1..-1], object.instance_variable_get(name)] }]
53
+ object.instance_variables.to_h { |name| [name.to_s[1..], object.instance_variable_get(name)] }
55
54
  end
56
55
 
57
56
  # determines the cell range for the items provided
58
- def self.cell_range(cells, absolute=true)
57
+ def self.cell_range(cells, absolute = true)
59
58
  return "" unless cells.first.is_a? Cell
60
59
 
61
60
  first_cell, last_cell = cells.minmax_by(&:pos)
@@ -76,7 +75,7 @@ module Axlsx
76
75
  cells.sort_by(&:pos)
77
76
  end
78
77
 
79
- #global reference html entity encoding
78
+ # global reference html entity encoding
80
79
  # @return [HtmlEntities]
81
80
  def self.coder
82
81
  @@coder ||= ::HTMLEntities.new
@@ -89,7 +88,7 @@ module Axlsx
89
88
  letters_str = name[/[A-Z]+/]
90
89
 
91
90
  # capitalization?!?
92
- v = letters_str.reverse.chars.reduce({:base=>1, :i=>0}) do |val, c|
91
+ v = letters_str.reverse.chars.reduce({ base: 1, i: 0 }) do |val, c|
93
92
  val[:i] += ((c.bytes.first - 64) * val[:base])
94
93
 
95
94
  val[:base] *= 26
@@ -103,37 +102,51 @@ module Axlsx
103
102
 
104
103
  row_index = (numbers_str.to_i - 1)
105
104
 
106
- return [col_index, row_index]
105
+ [col_index, row_index]
107
106
  end
108
107
 
109
108
  # converts the column index into alphabetical values.
110
109
  # @note This follows the standard spreadsheet convention of naming columns A to Z, followed by AA to AZ etc.
111
110
  # @return [String]
112
111
  def self.col_ref(index)
113
- chars = ''
114
- while index >= 26 do
115
- index, char = index.divmod(26)
116
- chars.prepend((char + 65).chr)
117
- index -= 1
112
+ # Every row will call this for each column / cell and so we can cache result and avoid lots of small object
113
+ # allocations.
114
+ @col_ref ||= {}
115
+ @col_ref[index] ||= begin
116
+ i = index
117
+ chars = +''
118
+ while i >= 26
119
+ i, char = i.divmod(26)
120
+ chars.prepend((char + 65).chr)
121
+ i -= 1
122
+ end
123
+ chars.prepend((i + 65).chr)
124
+ chars.freeze
118
125
  end
119
- chars.prepend((index + 65).chr)
120
- chars
126
+ end
127
+
128
+ # converts the row index into string values.
129
+ # @note The spreadsheet rows are 1-based and the passed in index is 0-based, so we add 1.
130
+ # @return [String]
131
+ def self.row_ref(index)
132
+ @row_ref ||= {}
133
+ @row_ref[index] ||= (index + 1).to_s.freeze
121
134
  end
122
135
 
123
136
  # @return [String] The alpha(column)numeric(row) reference for this sell.
124
137
  # @example Relative Cell Reference
125
138
  # ws.rows.first.cells.first.r #=> "A1"
126
139
  def self.cell_r(c_index, r_index)
127
- col_ref(c_index) << (r_index+1).to_s
140
+ col_ref(c_index) + row_ref(r_index)
128
141
  end
129
142
 
130
- # Creates an array of individual cell references based on an excel reference range.
143
+ # Creates an array of individual cell references based on an Excel reference range.
131
144
  # @param [String] range A cell range, for example A1:D5
132
145
  # @return [Array]
133
146
  def self.range_to_a(range)
134
- range.match(/^(\w+?\d+)\:(\w+?\d+)$/)
135
- start_col, start_row = name_to_indices($1)
136
- end_col, end_row = name_to_indices($2)
147
+ range =~ /^(\w+?\d+):(\w+?\d+)$/
148
+ start_col, start_row = name_to_indices(::Regexp.last_match(1))
149
+ end_col, end_row = name_to_indices(::Regexp.last_match(2))
137
150
  (start_row..end_row).to_a.map do |row_num|
138
151
  (start_col..end_col).to_a.map do |col_num|
139
152
  cell_r(col_num, row_num)
@@ -144,10 +157,10 @@ module Axlsx
144
157
  # performs the increadible feat of changing snake_case to CamelCase
145
158
  # @param [String] s The snake case string to camelize
146
159
  # @return [String]
147
- def self.camel(s="", all_caps = true)
160
+ def self.camel(s = "", all_caps = true)
148
161
  s = s.to_s
149
162
  s = s.capitalize if all_caps
150
- s.gsub(/_(.)/){ $1.upcase }
163
+ s.gsub(/_(.)/) { ::Regexp.last_match(1).upcase }
151
164
  end
152
165
 
153
166
  # returns the provided string with all invalid control charaters
@@ -168,18 +181,18 @@ module Axlsx
168
181
  # @param [Object] value The value to process
169
182
  # @return [Object]
170
183
  def self.booleanize(value)
171
- if value == true || value == false
172
- value ? 1 : 0
184
+ if BOOLEAN_VALUES.include?(value)
185
+ value ? '1' : '0'
173
186
  else
174
187
  value
175
188
  end
176
189
  end
177
190
 
178
191
  # utility method for performing a deep merge on a Hash
179
- # @param [Hash] Hash to merge into
180
- # @param [Hash] Hash to be added
192
+ # @param [Hash] first_hash Hash to merge into
193
+ # @param [Hash] second_hash Hash to be added
181
194
  def self.hash_deep_merge(first_hash, second_hash)
182
- first_hash.merge(second_hash) do |key, this_val, other_val|
195
+ first_hash.merge(second_hash) do |_key, this_val, other_val|
183
196
  if this_val.is_a?(Hash) && other_val.is_a?(Hash)
184
197
  Axlsx.hash_deep_merge(this_val, other_val)
185
198
  else
@@ -190,7 +203,7 @@ module Axlsx
190
203
 
191
204
  # Instructs the serializer to not try to escape cell value input.
192
205
  # This will give you a huge speed bonus, but if you content has <, > or other xml character data
193
- # the workbook will be invalid and excel will complain.
206
+ # the workbook will be invalid and Excel will complain.
194
207
  def self.trust_input
195
208
  @trust_input ||= false
196
209
  end
@@ -201,4 +214,19 @@ module Axlsx
201
214
  def self.trust_input=(trust_me)
202
215
  @trust_input = trust_me
203
216
  end
217
+
218
+ # Whether to treat values starting with an equals sign as formulas or as literal strings.
219
+ # Allowing user-generated data to be interpreted as formulas is a security risk.
220
+ # See https://www.owasp.org/index.php/CSV_Injection for details.
221
+ # @return [Boolean]
222
+ def self.escape_formulas
223
+ !defined?(@escape_formulas) || @escape_formulas.nil? ? true : @escape_formulas
224
+ end
225
+
226
+ # Sets whether to treat values starting with an equals sign as formulas or as literal strings.
227
+ # @param [Boolean] value The value to set.
228
+ def self.escape_formulas=(value)
229
+ Axlsx.validate_boolean(value)
230
+ @escape_formulas = value
231
+ end
204
232
  end
data/lib/caxlsx.rb CHANGED
@@ -1,2 +1,3 @@
1
- # encoding: UTF-8
2
- require 'axlsx.rb'
1
+ # frozen_string_literal: true
2
+
3
+ require 'axlsx'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: caxlsx
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Randy Morgan
@@ -9,131 +9,133 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-10-21 00:00:00.000000000 Z
12
+ date: 2023-10-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- name: nokogiri
15
+ name: htmlentities
16
16
  requirement: !ruby/object:Gem::Requirement
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: '1.10'
20
+ version: '4.3'
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: 1.10.4
23
+ version: 4.3.4
24
24
  type: :runtime
25
25
  prerelease: false
26
26
  version_requirements: !ruby/object:Gem::Requirement
27
27
  requirements:
28
28
  - - "~>"
29
29
  - !ruby/object:Gem::Version
30
- version: '1.10'
30
+ version: '4.3'
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 1.10.4
33
+ version: 4.3.4
34
34
  - !ruby/object:Gem::Dependency
35
- name: rubyzip
35
+ name: marcel
36
36
  requirement: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: 1.3.0
41
- - - "<"
38
+ - - "~>"
42
39
  - !ruby/object:Gem::Version
43
- version: '3'
40
+ version: '1.0'
44
41
  type: :runtime
45
42
  prerelease: false
46
43
  version_requirements: !ruby/object:Gem::Requirement
47
44
  requirements:
48
- - - ">="
49
- - !ruby/object:Gem::Version
50
- version: 1.3.0
51
- - - "<"
45
+ - - "~>"
52
46
  - !ruby/object:Gem::Version
53
- version: '3'
47
+ version: '1.0'
54
48
  - !ruby/object:Gem::Dependency
55
- name: htmlentities
49
+ name: nokogiri
56
50
  requirement: !ruby/object:Gem::Requirement
57
51
  requirements:
58
52
  - - "~>"
59
53
  - !ruby/object:Gem::Version
60
- version: '4.3'
54
+ version: '1.10'
61
55
  - - ">="
62
56
  - !ruby/object:Gem::Version
63
- version: 4.3.4
57
+ version: 1.10.4
64
58
  type: :runtime
65
59
  prerelease: false
66
60
  version_requirements: !ruby/object:Gem::Requirement
67
61
  requirements:
68
62
  - - "~>"
69
63
  - !ruby/object:Gem::Version
70
- version: '4.3'
64
+ version: '1.10'
71
65
  - - ">="
72
66
  - !ruby/object:Gem::Version
73
- version: 4.3.4
67
+ version: 1.10.4
74
68
  - !ruby/object:Gem::Dependency
75
- name: marcel
69
+ name: rubyzip
76
70
  requirement: !ruby/object:Gem::Requirement
77
71
  requirements:
78
- - - "~>"
72
+ - - ">="
79
73
  - !ruby/object:Gem::Version
80
- version: '1.0'
74
+ version: 1.3.0
75
+ - - "<"
76
+ - !ruby/object:Gem::Version
77
+ version: '3'
81
78
  type: :runtime
82
79
  prerelease: false
83
80
  version_requirements: !ruby/object:Gem::Requirement
84
81
  requirements:
85
- - - "~>"
82
+ - - ">="
86
83
  - !ruby/object:Gem::Version
87
- version: '1.0'
84
+ version: 1.3.0
85
+ - - "<"
86
+ - !ruby/object:Gem::Version
87
+ version: '3'
88
88
  - !ruby/object:Gem::Dependency
89
- name: yard
89
+ name: kramdown
90
90
  requirement: !ruby/object:Gem::Requirement
91
91
  requirements:
92
92
  - - "~>"
93
93
  - !ruby/object:Gem::Version
94
- version: 0.9.8
94
+ version: '2.3'
95
95
  type: :development
96
96
  prerelease: false
97
97
  version_requirements: !ruby/object:Gem::Requirement
98
98
  requirements:
99
99
  - - "~>"
100
100
  - !ruby/object:Gem::Version
101
- version: 0.9.8
101
+ version: '2.3'
102
102
  - !ruby/object:Gem::Dependency
103
- name: kramdown
103
+ name: timecop
104
104
  requirement: !ruby/object:Gem::Requirement
105
105
  requirements:
106
106
  - - "~>"
107
107
  - !ruby/object:Gem::Version
108
- version: '2.3'
108
+ version: 0.9.0
109
109
  type: :development
110
110
  prerelease: false
111
111
  version_requirements: !ruby/object:Gem::Requirement
112
112
  requirements:
113
113
  - - "~>"
114
114
  - !ruby/object:Gem::Version
115
- version: '2.3'
115
+ version: 0.9.0
116
116
  - !ruby/object:Gem::Dependency
117
- name: timecop
117
+ name: yard
118
118
  requirement: !ruby/object:Gem::Requirement
119
119
  requirements:
120
120
  - - "~>"
121
121
  - !ruby/object:Gem::Version
122
- version: 0.9.0
122
+ version: 0.9.8
123
123
  type: :development
124
124
  prerelease: false
125
125
  version_requirements: !ruby/object:Gem::Requirement
126
126
  requirements:
127
127
  - - "~>"
128
128
  - !ruby/object:Gem::Version
129
- version: 0.9.0
130
- description: " xlsx spreadsheet generation with charts, images, automated column
131
- width, customizable styles and full schema validation. Axlsx helps you create beautiful
132
- Office Open XML Spreadsheet documents ( Excel, Google Spreadsheets, Numbers, LibreOffice)
129
+ version: 0.9.8
130
+ description: 'xlsx spreadsheet generation with charts, images, automated column width,
131
+ customizable styles and full schema validation. Axlsx helps you create beautiful
132
+ Office Open XML Spreadsheet documents (Excel, Google Spreadsheets, Numbers, LibreOffice)
133
133
  without having to understand the entire ECMA specification. Check out the README
134
134
  for some examples of how easy it is. Best of all, you can validate your xlsx file
135
135
  before serialization so you know for sure that anything generated is going to load
136
- on your client's machine.\n"
136
+ on your client''s machine.
137
+
138
+ '
137
139
  email: noel@peden.biz
138
140
  executables: []
139
141
  extensions: []
@@ -218,6 +220,7 @@ files:
218
220
  - lib/axlsx/stylesheet/table_styles.rb
219
221
  - lib/axlsx/stylesheet/xf.rb
220
222
  - lib/axlsx/util/accessors.rb
223
+ - lib/axlsx/util/buffered_zip_output_stream.rb
221
224
  - lib/axlsx/util/constants.rb
222
225
  - lib/axlsx/util/mime_type_utils.rb
223
226
  - lib/axlsx/util/options_parser.rb
@@ -236,6 +239,8 @@ files:
236
239
  - lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb
237
240
  - lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb
238
241
  - lib/axlsx/workbook/worksheet/auto_filter/filters.rb
242
+ - lib/axlsx/workbook/worksheet/auto_filter/sort_condition.rb
243
+ - lib/axlsx/workbook/worksheet/auto_filter/sort_state.rb
239
244
  - lib/axlsx/workbook/worksheet/border_creator.rb
240
245
  - lib/axlsx/workbook/worksheet/break.rb
241
246
  - lib/axlsx/workbook/worksheet/cell.rb
@@ -328,7 +333,8 @@ files:
328
333
  homepage: https://github.com/caxlsx/caxlsx
329
334
  licenses:
330
335
  - MIT
331
- metadata: {}
336
+ metadata:
337
+ rubygems_mfa_required: 'true'
332
338
  post_install_message:
333
339
  rdoc_options: []
334
340
  require_paths:
@@ -337,14 +343,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
337
343
  requirements:
338
344
  - - ">="
339
345
  - !ruby/object:Gem::Version
340
- version: '2.3'
346
+ version: '2.6'
341
347
  required_rubygems_version: !ruby/object:Gem::Requirement
342
348
  requirements:
343
349
  - - ">="
344
350
  - !ruby/object:Gem::Version
345
351
  version: '0'
346
352
  requirements: []
347
- rubygems_version: 3.0.9
353
+ rubygems_version: 3.2.3
348
354
  signing_key:
349
355
  specification_version: 4
350
356
  summary: Excel OOXML (xlsx) with charts, styles, images and autowidth columns.