caxlsx 3.4.1 → 4.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +24 -1
- data/README.md +9 -11
- data/Rakefile +7 -5
- data/examples/generate.rb +3 -1
- data/lib/axlsx/content_type/abstract_content_type.rb +12 -4
- data/lib/axlsx/content_type/content_type.rb +8 -6
- data/lib/axlsx/content_type/default.rb +7 -2
- data/lib/axlsx/content_type/override.rb +7 -2
- data/lib/axlsx/doc_props/app.rb +95 -26
- 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 +20 -12
- data/lib/axlsx/drawing/ax_data_source.rb +2 -0
- data/lib/axlsx/drawing/axes.rb +6 -4
- data/lib/axlsx/drawing/axis.rb +42 -22
- 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 +20 -9
- 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 +29 -12
- data/lib/axlsx/drawing/chart.rb +46 -20
- data/lib/axlsx/drawing/d_lbls.rb +10 -8
- data/lib/axlsx/drawing/drawing.rb +59 -56
- data/lib/axlsx/drawing/graphic_frame.rb +6 -4
- data/lib/axlsx/drawing/hyperlink.rb +19 -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 +20 -12
- data/lib/axlsx/drawing/marker.rb +24 -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 +13 -5
- data/lib/axlsx/drawing/pic.rb +26 -15
- data/lib/axlsx/drawing/picture_locking.rb +3 -1
- data/lib/axlsx/drawing/pie_3D_chart.rb +6 -4
- data/lib/axlsx/drawing/pie_chart.rb +36 -0
- data/lib/axlsx/drawing/pie_series.rb +23 -9
- data/lib/axlsx/drawing/scaling.rb +25 -9
- 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 +13 -5
- data/lib/axlsx/drawing/series.rb +13 -5
- 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 +16 -8
- data/lib/axlsx/drawing/vml_drawing.rb +18 -16
- data/lib/axlsx/drawing/vml_shape.rb +24 -22
- data/lib/axlsx/package.rb +73 -67
- data/lib/axlsx/rels/relationship.rb +21 -6
- data/lib/axlsx/rels/relationships.rb +6 -4
- data/lib/axlsx/stylesheet/border.rb +15 -4
- data/lib/axlsx/stylesheet/border_pr.rb +19 -6
- data/lib/axlsx/stylesheet/cell_alignment.rb +41 -10
- data/lib/axlsx/stylesheet/cell_protection.rb +12 -3
- data/lib/axlsx/stylesheet/cell_style.rb +33 -8
- data/lib/axlsx/stylesheet/color.rb +15 -7
- data/lib/axlsx/stylesheet/dxf.rb +34 -9
- data/lib/axlsx/stylesheet/fill.rb +7 -2
- data/lib/axlsx/stylesheet/font.rb +65 -17
- data/lib/axlsx/stylesheet/gradient_fill.rb +12 -4
- data/lib/axlsx/stylesheet/gradient_stop.rb +14 -5
- data/lib/axlsx/stylesheet/num_fmt.rb +14 -10
- data/lib/axlsx/stylesheet/pattern_fill.rb +18 -5
- data/lib/axlsx/stylesheet/styles.rb +124 -82
- data/lib/axlsx/stylesheet/table_style.rb +19 -6
- data/lib/axlsx/stylesheet/table_style_element.rb +15 -4
- data/lib/axlsx/stylesheet/table_styles.rb +14 -5
- data/lib/axlsx/stylesheet/xf.rb +73 -18
- data/lib/axlsx/util/accessors.rb +10 -6
- 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 +4 -2
- data/lib/axlsx/workbook/shared_strings_table.rb +8 -6
- data/lib/axlsx/workbook/workbook.rb +94 -79
- data/lib/axlsx/workbook/workbook_view.rb +3 -1
- data/lib/axlsx/workbook/workbook_views.rb +4 -2
- data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +65 -8
- data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +11 -5
- 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 +83 -64
- data/lib/axlsx/workbook/worksheet/cell_serializer.rb +31 -27
- data/lib/axlsx/workbook/worksheet/cfvo.rb +11 -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 +6 -4
- data/lib/axlsx/workbook/worksheet/color_scale.rb +12 -10
- data/lib/axlsx/workbook/worksheet/cols.rb +4 -2
- 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 +16 -5
- data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +73 -16
- data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +4 -2
- data/lib/axlsx/workbook/worksheet/data_bar.rb +14 -13
- data/lib/axlsx/workbook/worksheet/data_validation.rb +69 -28
- data/lib/axlsx/workbook/worksheet/data_validations.rb +4 -2
- 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 +38 -9
- data/lib/axlsx/workbook/worksheet/merged_cells.rb +6 -6
- data/lib/axlsx/workbook/worksheet/outline_pr.rb +6 -2
- data/lib/axlsx/workbook/worksheet/page_margins.rb +39 -11
- data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +7 -4
- data/lib/axlsx/workbook/worksheet/page_setup.rb +34 -9
- data/lib/axlsx/workbook/worksheet/pane.rb +17 -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 +3 -1
- 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 +6 -4
- data/lib/axlsx/workbook/worksheet/rich_text.rb +3 -1
- data/lib/axlsx/workbook/worksheet/rich_text_run.rb +46 -24
- data/lib/axlsx/workbook/worksheet/row.rb +11 -9
- data/lib/axlsx/workbook/worksheet/row_breaks.rb +7 -5
- data/lib/axlsx/workbook/worksheet/selection.rb +15 -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 +11 -9
- data/lib/axlsx/workbook/worksheet/sheet_view.rb +38 -15
- 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 +4 -2
- data/lib/axlsx/workbook/worksheet/worksheet.rb +56 -39
- 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 +7 -5
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +5 -3
- data/lib/axlsx.rb +56 -42
- data/lib/caxlsx.rb +3 -1
- metadata +39 -71
@@ -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,15 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Axlsx
|
2
4
|
# a simple types list of DefinedName objects
|
3
5
|
class DefinedNames < SimpleTypedList
|
4
6
|
# creates the DefinedNames object
|
5
7
|
def initialize
|
6
|
-
super
|
8
|
+
super(DefinedName)
|
7
9
|
end
|
8
10
|
|
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.
|
@@ -247,18 +249,28 @@ module Axlsx
|
|
247
249
|
|
248
250
|
# Instance level access to the class variable 1904
|
249
251
|
# @return [Boolean]
|
250
|
-
def date1904
|
252
|
+
def date1904
|
253
|
+
@@date1904
|
254
|
+
end
|
251
255
|
|
252
256
|
# see @date1904
|
253
|
-
def date1904=(v)
|
257
|
+
def date1904=(v)
|
258
|
+
Axlsx.validate_boolean v
|
259
|
+
@@date1904 = v
|
260
|
+
end
|
254
261
|
|
255
262
|
# Sets the date1904 attribute to the provided boolean
|
256
263
|
# @return [Boolean]
|
257
|
-
def self.date1904=(v)
|
264
|
+
def self.date1904=(v)
|
265
|
+
Axlsx.validate_boolean v
|
266
|
+
@@date1904 = v
|
267
|
+
end
|
258
268
|
|
259
269
|
# retrieves the date1904 attribute
|
260
270
|
# @return [Boolean]
|
261
|
-
def self.date1904
|
271
|
+
def self.date1904
|
272
|
+
@@date1904
|
273
|
+
end
|
262
274
|
|
263
275
|
# Whether to treat values starting with an equals sign as formulas or as literal strings.
|
264
276
|
# Allowing user-generated data to be interpreted as formulas is a security risk.
|
@@ -278,10 +290,13 @@ module Axlsx
|
|
278
290
|
# calculation. Thus the performance benefits of turning this off are
|
279
291
|
# marginal unless you are creating a very large sheet.
|
280
292
|
# @return [Boolean]
|
281
|
-
|
293
|
+
attr_reader :use_autowidth
|
282
294
|
|
283
295
|
# see @use_autowidth
|
284
|
-
def use_autowidth=(v = true)
|
296
|
+
def use_autowidth=(v = true)
|
297
|
+
Axlsx.validate_boolean v
|
298
|
+
@use_autowidth = v
|
299
|
+
end
|
285
300
|
|
286
301
|
# Font size of bold fonts is multiplied with this
|
287
302
|
# Used for automatic calculation of cell widths with bold text
|
@@ -289,7 +304,7 @@ module Axlsx
|
|
289
304
|
attr_reader :bold_font_multiplier
|
290
305
|
|
291
306
|
def bold_font_multiplier=(v)
|
292
|
-
Axlsx
|
307
|
+
Axlsx.validate_float v
|
293
308
|
@bold_font_multiplier = v
|
294
309
|
end
|
295
310
|
|
@@ -299,7 +314,7 @@ module Axlsx
|
|
299
314
|
attr_reader :font_scale_divisor
|
300
315
|
|
301
316
|
def font_scale_divisor=(v)
|
302
|
-
Axlsx
|
317
|
+
Axlsx.validate_float v
|
303
318
|
@font_scale_divisor = v
|
304
319
|
end
|
305
320
|
|
@@ -352,10 +367,10 @@ module Axlsx
|
|
352
367
|
def relationships
|
353
368
|
r = Relationships.new
|
354
369
|
@worksheets.each do |sheet|
|
355
|
-
r << Relationship.new(sheet, WORKSHEET_R, WORKSHEET_PN
|
370
|
+
r << Relationship.new(sheet, WORKSHEET_R, format(WORKSHEET_PN, r.size + 1))
|
356
371
|
end
|
357
372
|
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
|
373
|
+
r << Relationship.new(pivot_table.cache_definition, PIVOT_TABLE_CACHE_DEFINITION_R, format(PIVOT_TABLE_CACHE_DEFINITION_PN, index + 1))
|
359
374
|
end
|
360
375
|
r << Relationship.new(self, STYLES_R, STYLES_PN)
|
361
376
|
if use_shared_strings
|
@@ -367,7 +382,7 @@ module Axlsx
|
|
367
382
|
# generates a shared string object against all cells in all worksheets.
|
368
383
|
# @return [SharedStringTable]
|
369
384
|
def shared_strings
|
370
|
-
SharedStringsTable.new(worksheets.collect
|
385
|
+
SharedStringsTable.new(worksheets.collect(&:cells), xml_space)
|
371
386
|
end
|
372
387
|
|
373
388
|
# The xml:space attribute for the worksheet.
|
@@ -389,12 +404,12 @@ module Axlsx
|
|
389
404
|
end
|
390
405
|
|
391
406
|
# returns a range of cells in a worksheet
|
392
|
-
# @param [String] cell_def The
|
407
|
+
# @param [String] cell_def The Excel style reference defining the worksheet and cells. The range must specify the sheet to
|
393
408
|
# 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
409
|
# @return [Cell, Array]
|
395
410
|
def [](cell_def)
|
396
|
-
sheet_name = cell_def.split('!')[0] if cell_def.
|
397
|
-
worksheet =
|
411
|
+
sheet_name = cell_def.split('!')[0] if cell_def.include?('!')
|
412
|
+
worksheet = worksheets.find { |s| s.name == sheet_name }
|
398
413
|
raise ArgumentError, 'Unknown Sheet' unless sheet_name && worksheet.is_a?(Worksheet)
|
399
414
|
|
400
415
|
worksheet[cell_def.gsub(/.+!/, "")]
|
@@ -403,11 +418,11 @@ module Axlsx
|
|
403
418
|
# Serialize the workbook
|
404
419
|
# @param [String] str
|
405
420
|
# @return [String]
|
406
|
-
def to_xml_string(str = '')
|
407
|
-
add_worksheet(name: 'Sheet1')
|
421
|
+
def to_xml_string(str = +'')
|
422
|
+
add_worksheet(name: 'Sheet1') if worksheets.empty?
|
408
423
|
str << '<?xml version="1.0" encoding="UTF-8"?>'
|
409
|
-
str <<
|
410
|
-
str <<
|
424
|
+
str << '<workbook xmlns="' << XML_NS << '" xmlns:r="' << XML_NS_R << '">'
|
425
|
+
str << '<workbookPr date1904="' << @@date1904.to_s << '"/>'
|
411
426
|
views.to_xml_string(str)
|
412
427
|
str << '<sheets>'
|
413
428
|
if is_reversed
|
@@ -420,7 +435,7 @@ module Axlsx
|
|
420
435
|
unless pivot_tables.empty?
|
421
436
|
str << '<pivotCaches>'
|
422
437
|
pivot_tables.each do |pivot_table|
|
423
|
-
str <<
|
438
|
+
str << '<pivotCache cacheId="' << pivot_table.cache_definition.cache_id.to_s << '" r:id="' << pivot_table.cache_definition.rId << '"/>'
|
424
439
|
end
|
425
440
|
str << '</pivotCaches>'
|
426
441
|
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,15 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Axlsx
|
2
4
|
# a simple types list of BookView objects
|
3
5
|
class WorkbookViews < SimpleTypedList
|
4
6
|
# creates the book views object
|
5
7
|
def initialize
|
6
|
-
super
|
8
|
+
super(WorkbookView)
|
7
9
|
end
|
8
10
|
|
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]
|
@@ -41,7 +43,9 @@ module Axlsx
|
|
41
43
|
# the filter button can be hidden, and not drawn.
|
42
44
|
# @return [Boolean]
|
43
45
|
def show_button
|
44
|
-
@show_button
|
46
|
+
return @show_button if defined?(@show_button)
|
47
|
+
|
48
|
+
true
|
45
49
|
end
|
46
50
|
|
47
51
|
# Flag indicating whether the AutoFilter button for this column is hidden.
|
@@ -81,12 +85,14 @@ module Axlsx
|
|
81
85
|
# @return [Boolean]
|
82
86
|
def show_button=(show)
|
83
87
|
Axlsx.validate_boolean show
|
84
|
-
@
|
88
|
+
@show_button = show
|
85
89
|
end
|
86
90
|
|
87
91
|
# Serialize the object to xml
|
88
|
-
def to_xml_string(str = '')
|
89
|
-
str <<
|
92
|
+
def to_xml_string(str = +'')
|
93
|
+
str << '<filterColumn '
|
94
|
+
serialized_attributes(str)
|
95
|
+
str << '>'
|
90
96
|
@filter.to_xml_string(str)
|
91
97
|
str << "</filterColumn>"
|
92
98
|
end
|