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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +25 -0
- data/README.md +25 -7
- data/Rakefile +7 -6
- data/lib/axlsx/content_type/abstract_content_type.rb +11 -9
- data/lib/axlsx/content_type/content_type.rb +7 -9
- data/lib/axlsx/content_type/default.rb +4 -6
- data/lib/axlsx/content_type/override.rb +3 -5
- data/lib/axlsx/doc_props/app.rb +27 -30
- data/lib/axlsx/doc_props/core.rb +9 -12
- data/lib/axlsx/drawing/area_chart.rb +13 -14
- data/lib/axlsx/drawing/area_series.rb +13 -14
- data/lib/axlsx/drawing/ax_data_source.rb +3 -6
- data/lib/axlsx/drawing/axes.rb +10 -9
- data/lib/axlsx/drawing/axis.rb +27 -30
- data/lib/axlsx/drawing/bar_3D_chart.rb +17 -18
- data/lib/axlsx/drawing/bar_chart.rb +16 -17
- data/lib/axlsx/drawing/bar_series.rb +9 -13
- data/lib/axlsx/drawing/bubble_chart.rb +8 -9
- data/lib/axlsx/drawing/bubble_series.rb +9 -10
- data/lib/axlsx/drawing/cat_axis.rb +14 -17
- data/lib/axlsx/drawing/chart.rb +25 -28
- data/lib/axlsx/drawing/d_lbls.rb +29 -26
- data/lib/axlsx/drawing/drawing.rb +60 -62
- data/lib/axlsx/drawing/graphic_frame.rb +6 -7
- data/lib/axlsx/drawing/hyperlink.rb +12 -13
- data/lib/axlsx/drawing/line_3D_chart.rb +13 -15
- data/lib/axlsx/drawing/line_chart.rb +13 -14
- data/lib/axlsx/drawing/line_series.rb +13 -14
- data/lib/axlsx/drawing/marker.rb +14 -16
- data/lib/axlsx/drawing/num_data.rb +13 -16
- data/lib/axlsx/drawing/num_data_source.rb +11 -13
- data/lib/axlsx/drawing/num_val.rb +9 -10
- data/lib/axlsx/drawing/one_cell_anchor.rb +10 -10
- data/lib/axlsx/drawing/pic.rb +57 -22
- data/lib/axlsx/drawing/picture_locking.rb +6 -7
- data/lib/axlsx/drawing/pie_3D_chart.rb +6 -9
- data/lib/axlsx/drawing/pie_series.rb +9 -12
- data/lib/axlsx/drawing/scaling.rb +9 -10
- data/lib/axlsx/drawing/scatter_chart.rb +9 -10
- data/lib/axlsx/drawing/scatter_series.rb +15 -16
- data/lib/axlsx/drawing/ser_axis.rb +9 -11
- data/lib/axlsx/drawing/series.rb +8 -8
- data/lib/axlsx/drawing/series_title.rb +6 -6
- data/lib/axlsx/drawing/str_data.rb +10 -13
- data/lib/axlsx/drawing/str_val.rb +8 -9
- data/lib/axlsx/drawing/title.rb +23 -27
- data/lib/axlsx/drawing/two_cell_anchor.rb +8 -8
- data/lib/axlsx/drawing/val_axis.rb +5 -6
- data/lib/axlsx/drawing/view_3D.rb +32 -30
- data/lib/axlsx/drawing/vml_drawing.rb +19 -20
- data/lib/axlsx/drawing/vml_shape.rb +25 -26
- data/lib/axlsx/package.rb +81 -79
- data/lib/axlsx/rels/relationship.rb +30 -28
- data/lib/axlsx/rels/relationships.rb +7 -8
- data/lib/axlsx/stylesheet/border.rb +7 -8
- data/lib/axlsx/stylesheet/border_pr.rb +8 -8
- data/lib/axlsx/stylesheet/cell_alignment.rb +14 -20
- data/lib/axlsx/stylesheet/cell_protection.rb +6 -7
- data/lib/axlsx/stylesheet/cell_style.rb +12 -14
- data/lib/axlsx/stylesheet/color.rb +15 -12
- data/lib/axlsx/stylesheet/dxf.rb +7 -9
- data/lib/axlsx/stylesheet/fill.rb +3 -5
- data/lib/axlsx/stylesheet/font.rb +24 -21
- data/lib/axlsx/stylesheet/gradient_fill.rb +9 -9
- data/lib/axlsx/stylesheet/gradient_stop.rb +7 -6
- data/lib/axlsx/stylesheet/num_fmt.rb +9 -14
- data/lib/axlsx/stylesheet/pattern_fill.rb +8 -8
- data/lib/axlsx/stylesheet/styles.rb +104 -98
- data/lib/axlsx/stylesheet/table_style.rb +8 -9
- data/lib/axlsx/stylesheet/table_style_element.rb +7 -8
- data/lib/axlsx/stylesheet/table_styles.rb +8 -10
- data/lib/axlsx/stylesheet/xf.rb +21 -22
- data/lib/axlsx/util/accessors.rb +6 -6
- data/lib/axlsx/util/buffered_zip_output_stream.rb +60 -0
- data/lib/axlsx/util/constants.rb +119 -108
- data/lib/axlsx/util/mime_type_utils.rb +11 -0
- data/lib/axlsx/util/options_parser.rb +4 -3
- data/lib/axlsx/util/serialized_attributes.rb +45 -21
- data/lib/axlsx/util/simple_typed_list.rb +58 -57
- data/lib/axlsx/util/storage.rb +38 -41
- data/lib/axlsx/util/validators.rb +107 -44
- data/lib/axlsx/util/zip_command.rb +10 -12
- data/lib/axlsx/version.rb +3 -2
- data/lib/axlsx/workbook/defined_name.rb +11 -8
- data/lib/axlsx/workbook/defined_names.rb +4 -3
- data/lib/axlsx/workbook/shared_strings_table.rb +10 -11
- data/lib/axlsx/workbook/workbook.rb +121 -114
- data/lib/axlsx/workbook/workbook_view.rb +8 -11
- data/lib/axlsx/workbook/workbook_views.rb +4 -4
- data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +72 -14
- data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +11 -7
- data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +24 -21
- data/lib/axlsx/workbook/worksheet/auto_filter/sort_condition.rb +51 -0
- data/lib/axlsx/workbook/worksheet/auto_filter/sort_state.rb +56 -0
- data/lib/axlsx/workbook/worksheet/border_creator.rb +30 -25
- data/lib/axlsx/workbook/worksheet/break.rb +4 -5
- data/lib/axlsx/workbook/worksheet/cell.rb +92 -65
- data/lib/axlsx/workbook/worksheet/cell_serializer.rb +32 -28
- data/lib/axlsx/workbook/worksheet/cfvo.rb +7 -5
- data/lib/axlsx/workbook/worksheet/cfvos.rb +5 -5
- data/lib/axlsx/workbook/worksheet/col.rb +9 -10
- data/lib/axlsx/workbook/worksheet/col_breaks.rb +8 -7
- data/lib/axlsx/workbook/worksheet/color_scale.rb +16 -16
- data/lib/axlsx/workbook/worksheet/cols.rb +9 -7
- data/lib/axlsx/workbook/worksheet/comment.rb +12 -11
- data/lib/axlsx/workbook/worksheet/comments.rb +10 -12
- data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +12 -8
- data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +19 -21
- data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +5 -5
- data/lib/axlsx/workbook/worksheet/data_bar.rb +29 -30
- data/lib/axlsx/workbook/worksheet/data_validation.rb +34 -33
- data/lib/axlsx/workbook/worksheet/data_validations.rb +5 -6
- data/lib/axlsx/workbook/worksheet/date_time_converter.rb +8 -8
- data/lib/axlsx/workbook/worksheet/dimension.rb +9 -6
- data/lib/axlsx/workbook/worksheet/header_footer.rb +4 -3
- data/lib/axlsx/workbook/worksheet/icon_set.rb +24 -8
- data/lib/axlsx/workbook/worksheet/merged_cells.rb +10 -10
- data/lib/axlsx/workbook/worksheet/outline_pr.rb +6 -3
- data/lib/axlsx/workbook/worksheet/page_margins.rb +17 -12
- data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +6 -4
- data/lib/axlsx/workbook/worksheet/page_setup.rb +128 -129
- data/lib/axlsx/workbook/worksheet/pane.rb +27 -26
- data/lib/axlsx/workbook/worksheet/pivot_table.rb +23 -25
- data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +12 -13
- data/lib/axlsx/workbook/worksheet/pivot_tables.rb +5 -4
- data/lib/axlsx/workbook/worksheet/print_options.rb +3 -2
- data/lib/axlsx/workbook/worksheet/protected_range.rb +6 -5
- data/lib/axlsx/workbook/worksheet/protected_ranges.rb +12 -10
- data/lib/axlsx/workbook/worksheet/rich_text.rb +6 -6
- data/lib/axlsx/workbook/worksheet/rich_text_run.rb +35 -17
- data/lib/axlsx/workbook/worksheet/row.rb +30 -22
- data/lib/axlsx/workbook/worksheet/row_breaks.rb +8 -7
- data/lib/axlsx/workbook/worksheet/selection.rb +16 -16
- data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +10 -7
- data/lib/axlsx/workbook/worksheet/sheet_data.rb +7 -7
- data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +23 -19
- data/lib/axlsx/workbook/worksheet/sheet_pr.rb +11 -7
- data/lib/axlsx/workbook/worksheet/sheet_protection.rb +21 -20
- data/lib/axlsx/workbook/worksheet/sheet_view.rb +48 -53
- data/lib/axlsx/workbook/worksheet/table.rb +13 -13
- data/lib/axlsx/workbook/worksheet/table_style_info.rb +6 -5
- data/lib/axlsx/workbook/worksheet/tables.rb +7 -5
- data/lib/axlsx/workbook/worksheet/worksheet.rb +92 -63
- data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +10 -8
- data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +11 -4
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +9 -8
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +7 -5
- data/lib/axlsx.rb +75 -47
- data/lib/caxlsx.rb +3 -2
- metadata +50 -44
@@ -1,8 +1,8 @@
|
|
1
|
-
|
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
|
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
|
-
|
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 ?
|
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
|
-
|
1
|
+
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
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
|
-
|
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
|
-
#
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'htmlentities'
|
3
|
-
require 'axlsx/version
|
4
|
+
require 'axlsx/version'
|
4
5
|
require 'marcel'
|
5
6
|
|
6
|
-
require 'axlsx/util/simple_typed_list
|
7
|
-
require 'axlsx/util/constants
|
8
|
-
require 'axlsx/util/validators
|
9
|
-
require 'axlsx/util/accessors
|
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
|
17
|
+
require 'axlsx/stylesheet/styles'
|
16
18
|
|
17
|
-
require 'axlsx/doc_props/app
|
18
|
-
require 'axlsx/doc_props/core
|
19
|
-
require 'axlsx/content_type/content_type
|
20
|
-
require 'axlsx/rels/relationships
|
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
|
23
|
-
require 'axlsx/workbook/workbook
|
24
|
-
require 'axlsx/package
|
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
|
-
|
35
|
-
|
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
|
-
|
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({:
|
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
|
-
|
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
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
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
|
-
|
120
|
-
|
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)
|
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
|
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
|
135
|
-
start_col, start_row = name_to_indices(
|
136
|
-
end_col, end_row = name_to_indices(
|
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(/_(.)/){
|
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
|
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 |
|
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
|
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
|
-
#
|
2
|
-
|
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:
|
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:
|
12
|
+
date: 2023-10-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
15
|
+
name: htmlentities
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
18
|
- - "~>"
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: '
|
20
|
+
version: '4.3'
|
21
21
|
- - ">="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version:
|
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: '
|
30
|
+
version: '4.3'
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
33
|
+
version: 4.3.4
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
|
-
name:
|
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: '
|
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: '
|
47
|
+
version: '1.0'
|
54
48
|
- !ruby/object:Gem::Dependency
|
55
|
-
name:
|
49
|
+
name: nokogiri
|
56
50
|
requirement: !ruby/object:Gem::Requirement
|
57
51
|
requirements:
|
58
52
|
- - "~>"
|
59
53
|
- !ruby/object:Gem::Version
|
60
|
-
version: '
|
54
|
+
version: '1.10'
|
61
55
|
- - ">="
|
62
56
|
- !ruby/object:Gem::Version
|
63
|
-
version:
|
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: '
|
64
|
+
version: '1.10'
|
71
65
|
- - ">="
|
72
66
|
- !ruby/object:Gem::Version
|
73
|
-
version:
|
67
|
+
version: 1.10.4
|
74
68
|
- !ruby/object:Gem::Dependency
|
75
|
-
name:
|
69
|
+
name: rubyzip
|
76
70
|
requirement: !ruby/object:Gem::Requirement
|
77
71
|
requirements:
|
78
|
-
- - "
|
72
|
+
- - ">="
|
79
73
|
- !ruby/object:Gem::Version
|
80
|
-
version:
|
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:
|
84
|
+
version: 1.3.0
|
85
|
+
- - "<"
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '3'
|
88
88
|
- !ruby/object:Gem::Dependency
|
89
|
-
name:
|
89
|
+
name: kramdown
|
90
90
|
requirement: !ruby/object:Gem::Requirement
|
91
91
|
requirements:
|
92
92
|
- - "~>"
|
93
93
|
- !ruby/object:Gem::Version
|
94
|
-
version:
|
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:
|
101
|
+
version: '2.3'
|
102
102
|
- !ruby/object:Gem::Dependency
|
103
|
-
name:
|
103
|
+
name: timecop
|
104
104
|
requirement: !ruby/object:Gem::Requirement
|
105
105
|
requirements:
|
106
106
|
- - "~>"
|
107
107
|
- !ruby/object:Gem::Version
|
108
|
-
version:
|
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:
|
115
|
+
version: 0.9.0
|
116
116
|
- !ruby/object:Gem::Dependency
|
117
|
-
name:
|
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.
|
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.
|
130
|
-
description:
|
131
|
-
|
132
|
-
Office Open XML Spreadsheet documents (
|
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
|
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.
|
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.
|
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.
|