caxlsx 3.4.1 → 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 +16 -1
- data/README.md +9 -11
- data/Rakefile +7 -5
- data/lib/axlsx/content_type/abstract_content_type.rb +9 -4
- data/lib/axlsx/content_type/content_type.rb +7 -5
- data/lib/axlsx/content_type/default.rb +4 -2
- data/lib/axlsx/content_type/override.rb +4 -2
- data/lib/axlsx/doc_props/app.rb +26 -24
- data/lib/axlsx/doc_props/core.rb +8 -6
- data/lib/axlsx/drawing/area_chart.rb +10 -8
- data/lib/axlsx/drawing/area_series.rb +12 -10
- data/lib/axlsx/drawing/ax_data_source.rb +2 -0
- data/lib/axlsx/drawing/axes.rb +6 -4
- data/lib/axlsx/drawing/axis.rb +21 -19
- data/lib/axlsx/drawing/bar_3D_chart.rb +14 -12
- data/lib/axlsx/drawing/bar_chart.rb +13 -11
- data/lib/axlsx/drawing/bar_series.rb +8 -6
- data/lib/axlsx/drawing/bubble_chart.rb +6 -4
- data/lib/axlsx/drawing/bubble_series.rb +8 -6
- data/lib/axlsx/drawing/cat_axis.rb +12 -10
- data/lib/axlsx/drawing/chart.rb +20 -18
- data/lib/axlsx/drawing/d_lbls.rb +7 -5
- data/lib/axlsx/drawing/drawing.rb +58 -56
- data/lib/axlsx/drawing/graphic_frame.rb +6 -4
- data/lib/axlsx/drawing/hyperlink.rb +10 -8
- data/lib/axlsx/drawing/line_3D_chart.rb +7 -5
- data/lib/axlsx/drawing/line_chart.rb +10 -8
- data/lib/axlsx/drawing/line_series.rb +12 -10
- data/lib/axlsx/drawing/marker.rb +9 -7
- data/lib/axlsx/drawing/num_data.rb +9 -7
- data/lib/axlsx/drawing/num_data_source.rb +9 -7
- data/lib/axlsx/drawing/num_val.rb +7 -5
- data/lib/axlsx/drawing/one_cell_anchor.rb +7 -5
- data/lib/axlsx/drawing/pic.rb +16 -14
- data/lib/axlsx/drawing/picture_locking.rb +3 -1
- data/lib/axlsx/drawing/pie_3D_chart.rb +5 -3
- data/lib/axlsx/drawing/pie_series.rb +8 -6
- data/lib/axlsx/drawing/scaling.rb +8 -6
- data/lib/axlsx/drawing/scatter_chart.rb +7 -5
- data/lib/axlsx/drawing/scatter_series.rb +14 -12
- data/lib/axlsx/drawing/ser_axis.rb +7 -5
- data/lib/axlsx/drawing/series.rb +6 -4
- data/lib/axlsx/drawing/series_title.rb +6 -4
- data/lib/axlsx/drawing/str_data.rb +7 -5
- data/lib/axlsx/drawing/str_val.rb +6 -4
- data/lib/axlsx/drawing/title.rb +13 -14
- data/lib/axlsx/drawing/two_cell_anchor.rb +4 -2
- data/lib/axlsx/drawing/val_axis.rb +4 -2
- data/lib/axlsx/drawing/view_3D.rb +9 -7
- data/lib/axlsx/drawing/vml_drawing.rb +18 -16
- data/lib/axlsx/drawing/vml_shape.rb +24 -22
- data/lib/axlsx/package.rb +69 -66
- data/lib/axlsx/rels/relationship.rb +10 -5
- data/lib/axlsx/rels/relationships.rb +5 -3
- data/lib/axlsx/stylesheet/border.rb +6 -4
- data/lib/axlsx/stylesheet/border_pr.rb +5 -3
- data/lib/axlsx/stylesheet/cell_alignment.rb +12 -10
- data/lib/axlsx/stylesheet/cell_protection.rb +5 -3
- data/lib/axlsx/stylesheet/cell_style.rb +10 -8
- data/lib/axlsx/stylesheet/color.rb +9 -7
- data/lib/axlsx/stylesheet/dxf.rb +5 -3
- data/lib/axlsx/stylesheet/fill.rb +3 -1
- data/lib/axlsx/stylesheet/font.rb +18 -16
- data/lib/axlsx/stylesheet/gradient_fill.rb +6 -4
- data/lib/axlsx/stylesheet/gradient_stop.rb +6 -4
- data/lib/axlsx/stylesheet/num_fmt.rb +8 -10
- data/lib/axlsx/stylesheet/pattern_fill.rb +5 -3
- data/lib/axlsx/stylesheet/styles.rb +69 -71
- data/lib/axlsx/stylesheet/table_style.rb +7 -5
- data/lib/axlsx/stylesheet/table_style_element.rb +6 -4
- data/lib/axlsx/stylesheet/table_styles.rb +6 -4
- data/lib/axlsx/stylesheet/xf.rb +18 -16
- data/lib/axlsx/util/accessors.rb +4 -2
- data/lib/axlsx/util/buffered_zip_output_stream.rb +60 -0
- data/lib/axlsx/util/constants.rb +117 -104
- data/lib/axlsx/util/mime_type_utils.rb +3 -5
- data/lib/axlsx/util/options_parser.rb +3 -1
- data/lib/axlsx/util/serialized_attributes.rb +42 -17
- data/lib/axlsx/util/simple_typed_list.rb +47 -47
- data/lib/axlsx/util/storage.rb +11 -10
- data/lib/axlsx/util/validators.rb +101 -41
- data/lib/axlsx/util/zip_command.rb +10 -10
- data/lib/axlsx/version.rb +3 -1
- data/lib/axlsx/workbook/defined_name.rb +6 -4
- data/lib/axlsx/workbook/defined_names.rb +3 -1
- data/lib/axlsx/workbook/shared_strings_table.rb +8 -6
- data/lib/axlsx/workbook/workbook.rb +78 -76
- data/lib/axlsx/workbook/workbook_view.rb +3 -1
- data/lib/axlsx/workbook/workbook_views.rb +3 -1
- data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +65 -8
- data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +7 -3
- data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +11 -7
- 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 +5 -3
- data/lib/axlsx/workbook/worksheet/break.rb +3 -1
- data/lib/axlsx/workbook/worksheet/cell.rb +53 -54
- data/lib/axlsx/workbook/worksheet/cell_serializer.rb +31 -27
- data/lib/axlsx/workbook/worksheet/cfvo.rb +5 -3
- data/lib/axlsx/workbook/worksheet/cfvos.rb +3 -1
- data/lib/axlsx/workbook/worksheet/col.rb +5 -3
- data/lib/axlsx/workbook/worksheet/col_breaks.rb +5 -3
- data/lib/axlsx/workbook/worksheet/color_scale.rb +12 -10
- data/lib/axlsx/workbook/worksheet/cols.rb +3 -1
- data/lib/axlsx/workbook/worksheet/comment.rb +8 -6
- data/lib/axlsx/workbook/worksheet/comments.rb +6 -4
- data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +9 -4
- data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +18 -16
- data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +3 -1
- data/lib/axlsx/workbook/worksheet/data_bar.rb +14 -13
- data/lib/axlsx/workbook/worksheet/data_validation.rb +30 -28
- data/lib/axlsx/workbook/worksheet/data_validations.rb +3 -1
- data/lib/axlsx/workbook/worksheet/date_time_converter.rb +7 -5
- data/lib/axlsx/workbook/worksheet/dimension.rb +4 -2
- data/lib/axlsx/workbook/worksheet/header_footer.rb +4 -2
- data/lib/axlsx/workbook/worksheet/icon_set.rb +23 -6
- data/lib/axlsx/workbook/worksheet/merged_cells.rb +5 -5
- data/lib/axlsx/workbook/worksheet/outline_pr.rb +6 -2
- data/lib/axlsx/workbook/worksheet/page_margins.rb +15 -10
- data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +6 -2
- data/lib/axlsx/workbook/worksheet/page_setup.rb +11 -9
- data/lib/axlsx/workbook/worksheet/pane.rb +11 -9
- data/lib/axlsx/workbook/worksheet/pivot_table.rb +20 -19
- data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +8 -6
- data/lib/axlsx/workbook/worksheet/pivot_tables.rb +2 -0
- data/lib/axlsx/workbook/worksheet/print_options.rb +3 -1
- data/lib/axlsx/workbook/worksheet/protected_range.rb +3 -1
- data/lib/axlsx/workbook/worksheet/protected_ranges.rb +5 -3
- data/lib/axlsx/workbook/worksheet/rich_text.rb +3 -1
- data/lib/axlsx/workbook/worksheet/rich_text_run.rb +16 -14
- data/lib/axlsx/workbook/worksheet/row.rb +6 -7
- data/lib/axlsx/workbook/worksheet/row_breaks.rb +6 -4
- data/lib/axlsx/workbook/worksheet/selection.rb +9 -7
- data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +6 -2
- data/lib/axlsx/workbook/worksheet/sheet_data.rb +3 -1
- data/lib/axlsx/workbook/worksheet/sheet_format_pr.rb +6 -2
- data/lib/axlsx/workbook/worksheet/sheet_pr.rb +8 -4
- data/lib/axlsx/workbook/worksheet/sheet_protection.rb +10 -8
- data/lib/axlsx/workbook/worksheet/sheet_view.rb +15 -13
- data/lib/axlsx/workbook/worksheet/table.rb +9 -7
- data/lib/axlsx/workbook/worksheet/table_style_info.rb +4 -2
- data/lib/axlsx/workbook/worksheet/tables.rb +3 -1
- data/lib/axlsx/workbook/worksheet/worksheet.rb +38 -37
- data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +4 -2
- data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +8 -2
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +6 -4
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +4 -2
- data/lib/axlsx.rb +56 -42
- data/lib/caxlsx.rb +3 -1
- metadata +49 -43
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'open3'
|
|
2
4
|
require 'shellwords'
|
|
3
5
|
|
|
@@ -23,10 +25,10 @@ module Axlsx
|
|
|
23
25
|
# Create a temporary directory for writing files to.
|
|
24
26
|
#
|
|
25
27
|
# The directory and its contents are removed at the end of the block.
|
|
26
|
-
def open(output
|
|
28
|
+
def open(output)
|
|
27
29
|
Dir.mktmpdir do |dir|
|
|
28
30
|
@dir = dir
|
|
29
|
-
|
|
31
|
+
yield(self)
|
|
30
32
|
write_file
|
|
31
33
|
zip_parts(output)
|
|
32
34
|
end
|
|
@@ -38,23 +40,21 @@ module Axlsx
|
|
|
38
40
|
@current_file = "#{@dir}/#{entry.name}"
|
|
39
41
|
@files << entry.name
|
|
40
42
|
FileUtils.mkdir_p(File.dirname(@current_file))
|
|
43
|
+
@io = File.open(@current_file, "wb")
|
|
41
44
|
end
|
|
42
45
|
|
|
43
46
|
# Write to a buffer that will be written to the current entry
|
|
44
47
|
def write(content)
|
|
45
|
-
@
|
|
48
|
+
@io << content
|
|
46
49
|
end
|
|
47
50
|
alias << write
|
|
48
51
|
|
|
49
52
|
private
|
|
50
53
|
|
|
51
54
|
def write_file
|
|
52
|
-
if @current_file
|
|
53
|
-
@buffer.rewind
|
|
54
|
-
File.open(@current_file, "wb") { |f| f.write @buffer.read }
|
|
55
|
-
end
|
|
55
|
+
@io.close if @current_file
|
|
56
56
|
@current_file = nil
|
|
57
|
-
@
|
|
57
|
+
@io = nil
|
|
58
58
|
end
|
|
59
59
|
|
|
60
60
|
def zip_parts(output)
|
|
@@ -63,8 +63,8 @@ module Axlsx
|
|
|
63
63
|
escaped_dir = Shellwords.shellescape(@dir)
|
|
64
64
|
command = "cd #{escaped_dir} && #{@zip_command} #{output} #{inputs}"
|
|
65
65
|
stdout_and_stderr, status = Open3.capture2e(command)
|
|
66
|
-
|
|
67
|
-
raise
|
|
66
|
+
unless status.success?
|
|
67
|
+
raise ZipError, stdout_and_stderr
|
|
68
68
|
end
|
|
69
69
|
end
|
|
70
70
|
end
|
data/lib/axlsx/version.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
# <definedNames>
|
|
2
4
|
# <definedName name="_xlnm.Print_Titles" localSheetId="0">Sheet1!$1:$1</definedName>
|
|
3
5
|
# </definedNames>
|
|
@@ -107,7 +109,7 @@ module Axlsx
|
|
|
107
109
|
# The local sheet index (0-based)
|
|
108
110
|
# @param [Integer] value the unsigned integer index of the sheet this defined_name applies to.
|
|
109
111
|
def local_sheet_id=(value)
|
|
110
|
-
Axlsx
|
|
112
|
+
Axlsx.validate_unsigned_int(value)
|
|
111
113
|
@local_sheet_id = value
|
|
112
114
|
end
|
|
113
115
|
|
|
@@ -118,12 +120,12 @@ module Axlsx
|
|
|
118
120
|
serializable_attributes :short_cut_key, :status_bar, :help, :description, :custom_menu, :comment,
|
|
119
121
|
:workbook_parameter, :publish_to_server, :xlm, :vb_proceedure, :function, :hidden, :local_sheet_id
|
|
120
122
|
|
|
121
|
-
def to_xml_string(str = '')
|
|
123
|
+
def to_xml_string(str = +'')
|
|
122
124
|
raise ArgumentError, 'you must specify the name for this defined name. Please read the documentation for Axlsx::DefinedName for more details' unless name
|
|
123
125
|
|
|
124
|
-
str <<
|
|
126
|
+
str << '<definedName ' << 'name="' << name << '" '
|
|
125
127
|
serialized_attributes str
|
|
126
|
-
str <<
|
|
128
|
+
str << '>' << @formula << '</definedName>'
|
|
127
129
|
end
|
|
128
130
|
end
|
|
129
131
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Axlsx
|
|
2
4
|
# a simple types list of DefinedName objects
|
|
3
5
|
class DefinedNames < SimpleTypedList
|
|
@@ -9,7 +11,7 @@ module Axlsx
|
|
|
9
11
|
# Serialize to xml
|
|
10
12
|
# @param [String] str
|
|
11
13
|
# @return [String]
|
|
12
|
-
def to_xml_string(str = '')
|
|
14
|
+
def to_xml_string(str = +'')
|
|
13
15
|
return if empty?
|
|
14
16
|
|
|
15
17
|
str << '<definedNames>'
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Axlsx
|
|
2
4
|
# The Shared String Table class is responsible for managing and serializing common strings in a workbook.
|
|
3
5
|
# While the ECMA-376 spec allows for both inline and shared strings it seems that at least some applications like iWorks Numbers
|
|
@@ -34,7 +36,7 @@ module Axlsx
|
|
|
34
36
|
@index = 0
|
|
35
37
|
@xml_space = xml_space
|
|
36
38
|
@unique_cells = {}
|
|
37
|
-
@shared_xml_string =
|
|
39
|
+
@shared_xml_string = +''
|
|
38
40
|
shareable_cells = cells.flatten.select { |cell| cell.plain_string? || cell.contains_rich_text? }
|
|
39
41
|
@count = shareable_cells.size
|
|
40
42
|
resolve(shareable_cells)
|
|
@@ -43,11 +45,11 @@ module Axlsx
|
|
|
43
45
|
# Serializes the object
|
|
44
46
|
# @param [String] str
|
|
45
47
|
# @return [String]
|
|
46
|
-
def to_xml_string(str = '')
|
|
47
|
-
Axlsx
|
|
48
|
-
str <<
|
|
49
|
-
str <<
|
|
50
|
-
str <<
|
|
48
|
+
def to_xml_string(str = +'')
|
|
49
|
+
Axlsx.sanitize(@shared_xml_string)
|
|
50
|
+
str << '<?xml version="1.0" encoding="UTF-8"?><sst xmlns="' << XML_NS << '"'
|
|
51
|
+
str << ' count="' << @count.to_s << '" uniqueCount="' << unique_count.to_s << '"'
|
|
52
|
+
str << ' xml:space="' << xml_space.to_s << '">' << @shared_xml_string << '</sst>'
|
|
51
53
|
end
|
|
52
54
|
|
|
53
55
|
private
|
|
@@ -1,39 +1,41 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Axlsx
|
|
2
|
-
require 'axlsx/workbook/worksheet/sheet_calc_pr
|
|
3
|
-
require 'axlsx/workbook/worksheet/auto_filter/auto_filter
|
|
4
|
-
require 'axlsx/workbook/worksheet/date_time_converter
|
|
5
|
-
require 'axlsx/workbook/worksheet/protected_range
|
|
6
|
-
require 'axlsx/workbook/worksheet/protected_ranges
|
|
4
|
+
require 'axlsx/workbook/worksheet/sheet_calc_pr'
|
|
5
|
+
require 'axlsx/workbook/worksheet/auto_filter/auto_filter'
|
|
6
|
+
require 'axlsx/workbook/worksheet/date_time_converter'
|
|
7
|
+
require 'axlsx/workbook/worksheet/protected_range'
|
|
8
|
+
require 'axlsx/workbook/worksheet/protected_ranges'
|
|
7
9
|
require 'axlsx/workbook/worksheet/rich_text_run'
|
|
8
10
|
require 'axlsx/workbook/worksheet/rich_text'
|
|
9
|
-
require 'axlsx/workbook/worksheet/cell_serializer
|
|
10
|
-
require 'axlsx/workbook/worksheet/cell
|
|
11
|
-
require 'axlsx/workbook/worksheet/page_margins
|
|
12
|
-
require 'axlsx/workbook/worksheet/page_set_up_pr
|
|
13
|
-
require 'axlsx/workbook/worksheet/outline_pr
|
|
14
|
-
require 'axlsx/workbook/worksheet/page_setup
|
|
15
|
-
require 'axlsx/workbook/worksheet/header_footer
|
|
16
|
-
require 'axlsx/workbook/worksheet/print_options
|
|
17
|
-
require 'axlsx/workbook/worksheet/cfvo
|
|
18
|
-
require 'axlsx/workbook/worksheet/cfvos
|
|
19
|
-
require 'axlsx/workbook/worksheet/color_scale
|
|
20
|
-
require 'axlsx/workbook/worksheet/data_bar
|
|
21
|
-
require 'axlsx/workbook/worksheet/icon_set
|
|
22
|
-
require 'axlsx/workbook/worksheet/conditional_formatting
|
|
23
|
-
require 'axlsx/workbook/worksheet/conditional_formatting_rule
|
|
24
|
-
require 'axlsx/workbook/worksheet/conditional_formattings
|
|
25
|
-
require 'axlsx/workbook/worksheet/row
|
|
26
|
-
require 'axlsx/workbook/worksheet/col
|
|
27
|
-
require 'axlsx/workbook/worksheet/cols
|
|
28
|
-
require 'axlsx/workbook/worksheet/comments
|
|
29
|
-
require 'axlsx/workbook/worksheet/comment
|
|
30
|
-
require 'axlsx/workbook/worksheet/merged_cells
|
|
31
|
-
require 'axlsx/workbook/worksheet/sheet_protection
|
|
32
|
-
require 'axlsx/workbook/worksheet/sheet_pr
|
|
33
|
-
require 'axlsx/workbook/worksheet/dimension
|
|
34
|
-
require 'axlsx/workbook/worksheet/sheet_data
|
|
35
|
-
require 'axlsx/workbook/worksheet/worksheet_drawing
|
|
36
|
-
require 'axlsx/workbook/worksheet/worksheet_comments
|
|
11
|
+
require 'axlsx/workbook/worksheet/cell_serializer'
|
|
12
|
+
require 'axlsx/workbook/worksheet/cell'
|
|
13
|
+
require 'axlsx/workbook/worksheet/page_margins'
|
|
14
|
+
require 'axlsx/workbook/worksheet/page_set_up_pr'
|
|
15
|
+
require 'axlsx/workbook/worksheet/outline_pr'
|
|
16
|
+
require 'axlsx/workbook/worksheet/page_setup'
|
|
17
|
+
require 'axlsx/workbook/worksheet/header_footer'
|
|
18
|
+
require 'axlsx/workbook/worksheet/print_options'
|
|
19
|
+
require 'axlsx/workbook/worksheet/cfvo'
|
|
20
|
+
require 'axlsx/workbook/worksheet/cfvos'
|
|
21
|
+
require 'axlsx/workbook/worksheet/color_scale'
|
|
22
|
+
require 'axlsx/workbook/worksheet/data_bar'
|
|
23
|
+
require 'axlsx/workbook/worksheet/icon_set'
|
|
24
|
+
require 'axlsx/workbook/worksheet/conditional_formatting'
|
|
25
|
+
require 'axlsx/workbook/worksheet/conditional_formatting_rule'
|
|
26
|
+
require 'axlsx/workbook/worksheet/conditional_formattings'
|
|
27
|
+
require 'axlsx/workbook/worksheet/row'
|
|
28
|
+
require 'axlsx/workbook/worksheet/col'
|
|
29
|
+
require 'axlsx/workbook/worksheet/cols'
|
|
30
|
+
require 'axlsx/workbook/worksheet/comments'
|
|
31
|
+
require 'axlsx/workbook/worksheet/comment'
|
|
32
|
+
require 'axlsx/workbook/worksheet/merged_cells'
|
|
33
|
+
require 'axlsx/workbook/worksheet/sheet_protection'
|
|
34
|
+
require 'axlsx/workbook/worksheet/sheet_pr'
|
|
35
|
+
require 'axlsx/workbook/worksheet/dimension'
|
|
36
|
+
require 'axlsx/workbook/worksheet/sheet_data'
|
|
37
|
+
require 'axlsx/workbook/worksheet/worksheet_drawing'
|
|
38
|
+
require 'axlsx/workbook/worksheet/worksheet_comments'
|
|
37
39
|
require 'axlsx/workbook/worksheet/worksheet_hyperlink'
|
|
38
40
|
require 'axlsx/workbook/worksheet/worksheet_hyperlinks'
|
|
39
41
|
require 'axlsx/workbook/worksheet/break'
|
|
@@ -41,22 +43,22 @@ module Axlsx
|
|
|
41
43
|
require 'axlsx/workbook/worksheet/col_breaks'
|
|
42
44
|
require 'axlsx/workbook/workbook_view'
|
|
43
45
|
require 'axlsx/workbook/workbook_views'
|
|
44
|
-
require 'axlsx/workbook/worksheet/worksheet
|
|
45
|
-
require 'axlsx/workbook/shared_strings_table
|
|
46
|
-
require 'axlsx/workbook/defined_name
|
|
47
|
-
require 'axlsx/workbook/defined_names
|
|
48
|
-
require 'axlsx/workbook/worksheet/table_style_info
|
|
49
|
-
require 'axlsx/workbook/worksheet/table
|
|
50
|
-
require 'axlsx/workbook/worksheet/tables
|
|
51
|
-
require 'axlsx/workbook/worksheet/pivot_table_cache_definition
|
|
52
|
-
require 'axlsx/workbook/worksheet/pivot_table
|
|
53
|
-
require 'axlsx/workbook/worksheet/pivot_tables
|
|
54
|
-
require 'axlsx/workbook/worksheet/data_validation
|
|
55
|
-
require 'axlsx/workbook/worksheet/data_validations
|
|
56
|
-
require 'axlsx/workbook/worksheet/sheet_view
|
|
57
|
-
require 'axlsx/workbook/worksheet/sheet_format_pr
|
|
58
|
-
require 'axlsx/workbook/worksheet/pane
|
|
59
|
-
require 'axlsx/workbook/worksheet/selection
|
|
46
|
+
require 'axlsx/workbook/worksheet/worksheet'
|
|
47
|
+
require 'axlsx/workbook/shared_strings_table'
|
|
48
|
+
require 'axlsx/workbook/defined_name'
|
|
49
|
+
require 'axlsx/workbook/defined_names'
|
|
50
|
+
require 'axlsx/workbook/worksheet/table_style_info'
|
|
51
|
+
require 'axlsx/workbook/worksheet/table'
|
|
52
|
+
require 'axlsx/workbook/worksheet/tables'
|
|
53
|
+
require 'axlsx/workbook/worksheet/pivot_table_cache_definition'
|
|
54
|
+
require 'axlsx/workbook/worksheet/pivot_table'
|
|
55
|
+
require 'axlsx/workbook/worksheet/pivot_tables'
|
|
56
|
+
require 'axlsx/workbook/worksheet/data_validation'
|
|
57
|
+
require 'axlsx/workbook/worksheet/data_validations'
|
|
58
|
+
require 'axlsx/workbook/worksheet/sheet_view'
|
|
59
|
+
require 'axlsx/workbook/worksheet/sheet_format_pr'
|
|
60
|
+
require 'axlsx/workbook/worksheet/pane'
|
|
61
|
+
require 'axlsx/workbook/worksheet/selection'
|
|
60
62
|
|
|
61
63
|
# The Workbook class is an xlsx workbook that manages worksheets, charts, drawings and styles.
|
|
62
64
|
# The following parts of the Office Open XML spreadsheet specification are not implimented in this version.
|
|
@@ -93,7 +95,7 @@ module Axlsx
|
|
|
93
95
|
|
|
94
96
|
# @see use_shared_strings
|
|
95
97
|
def use_shared_strings=(v)
|
|
96
|
-
Axlsx
|
|
98
|
+
Axlsx.validate_boolean(v)
|
|
97
99
|
@use_shared_strings = v
|
|
98
100
|
end
|
|
99
101
|
|
|
@@ -102,7 +104,7 @@ module Axlsx
|
|
|
102
104
|
attr_reader :is_reversed
|
|
103
105
|
|
|
104
106
|
def is_reversed=(v)
|
|
105
|
-
Axlsx
|
|
107
|
+
Axlsx.validate_boolean(v)
|
|
106
108
|
@is_reversed = v
|
|
107
109
|
end
|
|
108
110
|
|
|
@@ -169,7 +171,7 @@ module Axlsx
|
|
|
169
171
|
# @see Comment
|
|
170
172
|
# @return [Comments]
|
|
171
173
|
def comments
|
|
172
|
-
worksheets.map
|
|
174
|
+
worksheets.map(&:comments).compact
|
|
173
175
|
end
|
|
174
176
|
|
|
175
177
|
# The styles associated with this workbook
|
|
@@ -195,16 +197,16 @@ module Axlsx
|
|
|
195
197
|
# A helper to apply styles that were added using `worksheet.add_style`
|
|
196
198
|
# @return [Boolean]
|
|
197
199
|
def apply_styles
|
|
198
|
-
return false
|
|
200
|
+
return false unless styled_cells
|
|
199
201
|
|
|
200
202
|
styled_cells.each do |cell|
|
|
201
203
|
current_style = styles.style_index[cell.style]
|
|
202
204
|
|
|
203
|
-
if current_style
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
205
|
+
new_style = if current_style
|
|
206
|
+
Axlsx.hash_deep_merge(current_style, cell.raw_style)
|
|
207
|
+
else
|
|
208
|
+
cell.raw_style
|
|
209
|
+
end
|
|
208
210
|
|
|
209
211
|
cell.style = styles.add_style(new_style)
|
|
210
212
|
end
|
|
@@ -219,8 +221,8 @@ module Axlsx
|
|
|
219
221
|
# @param [String] name The name of the sheet you are looking for
|
|
220
222
|
# @return [Worksheet] The sheet found, or nil
|
|
221
223
|
def sheet_by_name(name)
|
|
222
|
-
|
|
223
|
-
@worksheets
|
|
224
|
+
encoded_name = Axlsx.coder.encode(name)
|
|
225
|
+
@worksheets.find { |sheet| sheet.name == encoded_name }
|
|
224
226
|
end
|
|
225
227
|
|
|
226
228
|
# Creates a new Workbook.
|
|
@@ -250,11 +252,11 @@ module Axlsx
|
|
|
250
252
|
def date1904() @@date1904; end
|
|
251
253
|
|
|
252
254
|
# see @date1904
|
|
253
|
-
def date1904=(v) Axlsx
|
|
255
|
+
def date1904=(v) Axlsx.validate_boolean v; @@date1904 = v; end
|
|
254
256
|
|
|
255
257
|
# Sets the date1904 attribute to the provided boolean
|
|
256
258
|
# @return [Boolean]
|
|
257
|
-
def self.date1904=(v) Axlsx
|
|
259
|
+
def self.date1904=(v) Axlsx.validate_boolean v; @@date1904 = v; end
|
|
258
260
|
|
|
259
261
|
# retrieves the date1904 attribute
|
|
260
262
|
# @return [Boolean]
|
|
@@ -281,7 +283,7 @@ module Axlsx
|
|
|
281
283
|
def use_autowidth() @use_autowidth; end
|
|
282
284
|
|
|
283
285
|
# see @use_autowidth
|
|
284
|
-
def use_autowidth=(v = true) Axlsx
|
|
286
|
+
def use_autowidth=(v = true) Axlsx.validate_boolean v; @use_autowidth = v; end
|
|
285
287
|
|
|
286
288
|
# Font size of bold fonts is multiplied with this
|
|
287
289
|
# Used for automatic calculation of cell widths with bold text
|
|
@@ -289,7 +291,7 @@ module Axlsx
|
|
|
289
291
|
attr_reader :bold_font_multiplier
|
|
290
292
|
|
|
291
293
|
def bold_font_multiplier=(v)
|
|
292
|
-
Axlsx
|
|
294
|
+
Axlsx.validate_float v
|
|
293
295
|
@bold_font_multiplier = v
|
|
294
296
|
end
|
|
295
297
|
|
|
@@ -299,7 +301,7 @@ module Axlsx
|
|
|
299
301
|
attr_reader :font_scale_divisor
|
|
300
302
|
|
|
301
303
|
def font_scale_divisor=(v)
|
|
302
|
-
Axlsx
|
|
304
|
+
Axlsx.validate_float v
|
|
303
305
|
@font_scale_divisor = v
|
|
304
306
|
end
|
|
305
307
|
|
|
@@ -352,10 +354,10 @@ module Axlsx
|
|
|
352
354
|
def relationships
|
|
353
355
|
r = Relationships.new
|
|
354
356
|
@worksheets.each do |sheet|
|
|
355
|
-
r << Relationship.new(sheet, WORKSHEET_R, WORKSHEET_PN
|
|
357
|
+
r << Relationship.new(sheet, WORKSHEET_R, format(WORKSHEET_PN, r.size + 1))
|
|
356
358
|
end
|
|
357
359
|
pivot_tables.each_with_index do |pivot_table, index|
|
|
358
|
-
r << Relationship.new(pivot_table.cache_definition, PIVOT_TABLE_CACHE_DEFINITION_R, PIVOT_TABLE_CACHE_DEFINITION_PN
|
|
360
|
+
r << Relationship.new(pivot_table.cache_definition, PIVOT_TABLE_CACHE_DEFINITION_R, format(PIVOT_TABLE_CACHE_DEFINITION_PN, index + 1))
|
|
359
361
|
end
|
|
360
362
|
r << Relationship.new(self, STYLES_R, STYLES_PN)
|
|
361
363
|
if use_shared_strings
|
|
@@ -367,7 +369,7 @@ module Axlsx
|
|
|
367
369
|
# generates a shared string object against all cells in all worksheets.
|
|
368
370
|
# @return [SharedStringTable]
|
|
369
371
|
def shared_strings
|
|
370
|
-
SharedStringsTable.new(worksheets.collect
|
|
372
|
+
SharedStringsTable.new(worksheets.collect(&:cells), xml_space)
|
|
371
373
|
end
|
|
372
374
|
|
|
373
375
|
# The xml:space attribute for the worksheet.
|
|
@@ -389,12 +391,12 @@ module Axlsx
|
|
|
389
391
|
end
|
|
390
392
|
|
|
391
393
|
# returns a range of cells in a worksheet
|
|
392
|
-
# @param [String] cell_def The
|
|
394
|
+
# @param [String] cell_def The Excel style reference defining the worksheet and cells. The range must specify the sheet to
|
|
393
395
|
# retrieve the cells from. e.g. range('Sheet1!A1:B2') will return an array of four cells [A1, A2, B1, B2] while range('Sheet1!A1') will return a single Cell.
|
|
394
396
|
# @return [Cell, Array]
|
|
395
397
|
def [](cell_def)
|
|
396
|
-
sheet_name = cell_def.split('!')[0] if cell_def.
|
|
397
|
-
worksheet =
|
|
398
|
+
sheet_name = cell_def.split('!')[0] if cell_def.include?('!')
|
|
399
|
+
worksheet = worksheets.find { |s| s.name == sheet_name }
|
|
398
400
|
raise ArgumentError, 'Unknown Sheet' unless sheet_name && worksheet.is_a?(Worksheet)
|
|
399
401
|
|
|
400
402
|
worksheet[cell_def.gsub(/.+!/, "")]
|
|
@@ -403,11 +405,11 @@ module Axlsx
|
|
|
403
405
|
# Serialize the workbook
|
|
404
406
|
# @param [String] str
|
|
405
407
|
# @return [String]
|
|
406
|
-
def to_xml_string(str = '')
|
|
407
|
-
add_worksheet(name: 'Sheet1')
|
|
408
|
+
def to_xml_string(str = +'')
|
|
409
|
+
add_worksheet(name: 'Sheet1') if worksheets.empty?
|
|
408
410
|
str << '<?xml version="1.0" encoding="UTF-8"?>'
|
|
409
|
-
str <<
|
|
410
|
-
str <<
|
|
411
|
+
str << '<workbook xmlns="' << XML_NS << '" xmlns:r="' << XML_NS_R << '">'
|
|
412
|
+
str << '<workbookPr date1904="' << @@date1904.to_s << '"/>'
|
|
411
413
|
views.to_xml_string(str)
|
|
412
414
|
str << '<sheets>'
|
|
413
415
|
if is_reversed
|
|
@@ -420,7 +422,7 @@ module Axlsx
|
|
|
420
422
|
unless pivot_tables.empty?
|
|
421
423
|
str << '<pivotCaches>'
|
|
422
424
|
pivot_tables.each do |pivot_table|
|
|
423
|
-
str <<
|
|
425
|
+
str << '<pivotCache cacheId="' << pivot_table.cache_definition.cache_id.to_s << '" r:id="' << pivot_table.cache_definition.rId << '"/>'
|
|
424
426
|
end
|
|
425
427
|
str << '</pivotCaches>'
|
|
426
428
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
# <xsd:complexType name="CT_BookView">
|
|
2
4
|
# <xsd:sequence>
|
|
3
5
|
# <xsd:element name="extLst" type="CT_ExtensionList" minOccurs="0" maxOccurs="1"/>
|
|
@@ -66,7 +68,7 @@ module Axlsx
|
|
|
66
68
|
# Serialize the WorkbookView
|
|
67
69
|
# @param [String] str
|
|
68
70
|
# @return [String]
|
|
69
|
-
def to_xml_string(str = '')
|
|
71
|
+
def to_xml_string(str = +'')
|
|
70
72
|
str << '<workbookView '
|
|
71
73
|
serialized_attributes str
|
|
72
74
|
str << '></workbookView>'
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Axlsx
|
|
2
4
|
# a simple types list of BookView objects
|
|
3
5
|
class WorkbookViews < SimpleTypedList
|
|
@@ -9,7 +11,7 @@ module Axlsx
|
|
|
9
11
|
# Serialize to xml
|
|
10
12
|
# @param [String] str
|
|
11
13
|
# @return [String]
|
|
12
|
-
def to_xml_string(str = '')
|
|
14
|
+
def to_xml_string(str = +'')
|
|
13
15
|
return if empty?
|
|
14
16
|
|
|
15
17
|
str << "<bookViews>"
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'axlsx/workbook/worksheet/auto_filter/filter_column'
|
|
4
|
+
require 'axlsx/workbook/worksheet/auto_filter/filters'
|
|
5
|
+
require 'axlsx/workbook/worksheet/auto_filter/sort_state'
|
|
3
6
|
|
|
4
7
|
module Axlsx
|
|
5
8
|
# This class represents an auto filter range in a worksheet
|
|
@@ -10,9 +13,10 @@ module Axlsx
|
|
|
10
13
|
raise ArgumentError, 'you must provide a worksheet' unless worksheet.is_a?(Worksheet)
|
|
11
14
|
|
|
12
15
|
@worksheet = worksheet
|
|
16
|
+
@sort_on_generate = true
|
|
13
17
|
end
|
|
14
18
|
|
|
15
|
-
attr_reader :worksheet
|
|
19
|
+
attr_reader :worksheet, :sort_on_generate
|
|
16
20
|
|
|
17
21
|
# The range the autofilter should be applied to.
|
|
18
22
|
# This should be a string like 'A1:B8'
|
|
@@ -46,15 +50,50 @@ module Axlsx
|
|
|
46
50
|
columns.last
|
|
47
51
|
end
|
|
48
52
|
|
|
49
|
-
#
|
|
50
|
-
# match the filter.
|
|
53
|
+
# Performs the sorting of the rows based on the sort_state conditions. Then it actually performs
|
|
54
|
+
# the filtering of rows who's cells do not match the filter.
|
|
51
55
|
def apply
|
|
52
56
|
first_cell, last_cell = range.split(':')
|
|
53
|
-
start_point = Axlsx
|
|
54
|
-
end_point = Axlsx
|
|
57
|
+
start_point = Axlsx.name_to_indices(first_cell)
|
|
58
|
+
end_point = Axlsx.name_to_indices(last_cell)
|
|
55
59
|
# The +1 is so we skip the header row with the filter drop downs
|
|
56
60
|
rows = worksheet.rows[(start_point.last + 1)..end_point.last] || []
|
|
57
61
|
|
|
62
|
+
# the sorting of the rows if sort_conditions are available.
|
|
63
|
+
if !sort_state.sort_conditions.empty? && sort_on_generate
|
|
64
|
+
sort_conditions = sort_state.sort_conditions
|
|
65
|
+
sorted_rows = rows.sort do |row1, row2|
|
|
66
|
+
comparison = 0
|
|
67
|
+
|
|
68
|
+
sort_conditions.each do |condition|
|
|
69
|
+
cell_value_row1 = row1.cells[condition.column_index + start_point.first].value
|
|
70
|
+
cell_value_row2 = row2.cells[condition.column_index + start_point.first].value
|
|
71
|
+
custom_list = condition.custom_list
|
|
72
|
+
comparison = if cell_value_row1.nil? || cell_value_row2.nil?
|
|
73
|
+
cell_value_row1.nil? ? 1 : -1
|
|
74
|
+
elsif custom_list.empty?
|
|
75
|
+
condition.order == :asc ? cell_value_row1 <=> cell_value_row2 : cell_value_row2 <=> cell_value_row1
|
|
76
|
+
else
|
|
77
|
+
index1 = custom_list.index(cell_value_row1) || custom_list.size
|
|
78
|
+
index2 = custom_list.index(cell_value_row2) || custom_list.size
|
|
79
|
+
|
|
80
|
+
condition.order == :asc ? index1 <=> index2 : index2 <=> index1
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
break unless comparison.zero?
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
comparison
|
|
87
|
+
end
|
|
88
|
+
insert_index = start_point.last + 1
|
|
89
|
+
|
|
90
|
+
sorted_rows.each do |row|
|
|
91
|
+
# Insert the row at the specified index
|
|
92
|
+
worksheet.rows[insert_index] = row
|
|
93
|
+
insert_index += 1
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
58
97
|
column_offset = start_point.first
|
|
59
98
|
columns.each do |column|
|
|
60
99
|
rows.each do |row|
|
|
@@ -65,13 +104,31 @@ module Axlsx
|
|
|
65
104
|
end
|
|
66
105
|
end
|
|
67
106
|
|
|
107
|
+
# the SortState object for this AutoFilter
|
|
108
|
+
# @return [SortState]
|
|
109
|
+
def sort_state
|
|
110
|
+
@sort_state ||= SortState.new self
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# @param [Boolean] v Flag indicating whether the AutoFilter should sort the rows when generating the
|
|
114
|
+
# file. If false, the sorting rules will need to be applied manually after generating to alter
|
|
115
|
+
# the order of the rows.
|
|
116
|
+
# @return [Boolean]
|
|
117
|
+
def sort_on_generate=(v)
|
|
118
|
+
Axlsx.validate_boolean v
|
|
119
|
+
@sort_on_generate = v
|
|
120
|
+
end
|
|
121
|
+
|
|
68
122
|
# serialize the object
|
|
69
123
|
# @return [String]
|
|
70
|
-
def to_xml_string(str = '')
|
|
124
|
+
def to_xml_string(str = +'')
|
|
71
125
|
return unless range
|
|
72
126
|
|
|
73
127
|
str << "<autoFilter ref='#{range}'>"
|
|
74
128
|
columns.each { |filter_column| filter_column.to_xml_string(str) }
|
|
129
|
+
unless @sort_state.nil?
|
|
130
|
+
@sort_state.to_xml_string(str)
|
|
131
|
+
end
|
|
75
132
|
str << "</autoFilter>"
|
|
76
133
|
end
|
|
77
134
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Axlsx
|
|
2
4
|
# The filterColumn collection identifies a particular column in the AutoFilter
|
|
3
5
|
# range and specifies filter information that has been applied to this column.
|
|
@@ -26,7 +28,7 @@ module Axlsx
|
|
|
26
28
|
serializable_attributes :col_id, :hidden_button, :show_button
|
|
27
29
|
|
|
28
30
|
# Allowed filters
|
|
29
|
-
FILTERS = [:filters] # , :top10, :custom_filters, :dynamic_filters, :color_filters, :icon_filters]
|
|
31
|
+
FILTERS = [:filters].freeze # , :top10, :custom_filters, :dynamic_filters, :color_filters, :icon_filters]
|
|
30
32
|
|
|
31
33
|
# Zero-based index indicating the AutoFilter column to which this filter information applies.
|
|
32
34
|
# @return [Integer]
|
|
@@ -85,8 +87,10 @@ module Axlsx
|
|
|
85
87
|
end
|
|
86
88
|
|
|
87
89
|
# Serialize the object to xml
|
|
88
|
-
def to_xml_string(str = '')
|
|
89
|
-
str <<
|
|
90
|
+
def to_xml_string(str = +'')
|
|
91
|
+
str << '<filterColumn '
|
|
92
|
+
serialized_attributes(str)
|
|
93
|
+
str << '>'
|
|
90
94
|
@filter.to_xml_string(str)
|
|
91
95
|
str << "</filterColumn>"
|
|
92
96
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Axlsx
|
|
2
4
|
# When multiple values are chosen to filter by, or when a group of date values are chosen to filter by,
|
|
3
5
|
# this object groups those criteria together.
|
|
@@ -22,7 +24,7 @@ module Axlsx
|
|
|
22
24
|
serializable_attributes :blank, :calendar_type
|
|
23
25
|
|
|
24
26
|
# Allowed calendar types
|
|
25
|
-
CALENDAR_TYPES = %w(gregorian gregorianUs gregorianMeFrench gregorianArabic hijri hebrew taiwan japan thai korea saka gregorianXlitEnglish gregorianXlitFrench none)
|
|
27
|
+
CALENDAR_TYPES = %w(gregorian gregorianUs gregorianMeFrench gregorianArabic hijri hebrew taiwan japan thai korea saka gregorianXlitEnglish gregorianXlitFrench none).freeze
|
|
26
28
|
|
|
27
29
|
# Flag indicating whether to filter by blank.
|
|
28
30
|
# @return [Boolean]
|
|
@@ -74,8 +76,10 @@ module Axlsx
|
|
|
74
76
|
end
|
|
75
77
|
|
|
76
78
|
# Serialize the object to xml
|
|
77
|
-
def to_xml_string(str = '')
|
|
78
|
-
str <<
|
|
79
|
+
def to_xml_string(str = +'')
|
|
80
|
+
str << '<filters '
|
|
81
|
+
serialized_attributes(str)
|
|
82
|
+
str << '>'
|
|
79
83
|
filter_items.each { |filter| filter.to_xml_string(str) }
|
|
80
84
|
date_group_items.each { |date_group_item| date_group_item.to_xml_string(str) }
|
|
81
85
|
str << '</filters>'
|
|
@@ -118,8 +122,8 @@ module Axlsx
|
|
|
118
122
|
|
|
119
123
|
# Serializes the filter value object
|
|
120
124
|
# @param [String] str The string to concact the serialization information to.
|
|
121
|
-
def to_xml_string(str = '')
|
|
122
|
-
str << "<filter val='#{@val
|
|
125
|
+
def to_xml_string(str = +'')
|
|
126
|
+
str << "<filter val='#{@val}' />"
|
|
123
127
|
end
|
|
124
128
|
end
|
|
125
129
|
|
|
@@ -153,7 +157,7 @@ module Axlsx
|
|
|
153
157
|
serializable_attributes :date_time_grouping, :year, :month, :day, :hour, :minute, :second
|
|
154
158
|
|
|
155
159
|
# Allowed date time groupings
|
|
156
|
-
DATE_TIME_GROUPING = %w(year month day hour minute second)
|
|
160
|
+
DATE_TIME_GROUPING = %w(year month day hour minute second).freeze
|
|
157
161
|
|
|
158
162
|
# Grouping level
|
|
159
163
|
# This must be one of year, month, day, hour, minute or second.
|
|
@@ -235,7 +239,7 @@ module Axlsx
|
|
|
235
239
|
|
|
236
240
|
# Serialize the object to xml
|
|
237
241
|
# @param [String] str The string object this serialization will be concatenated to.
|
|
238
|
-
def to_xml_string(str = '')
|
|
242
|
+
def to_xml_string(str = +'')
|
|
239
243
|
serialized_tag('dateGroupItem', str)
|
|
240
244
|
end
|
|
241
245
|
end
|