caxlsx 3.1.1 → 3.2.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/.yardopts +9 -9
- data/.yardopts_guide +18 -18
- data/CHANGELOG.md +354 -343
- data/LICENSE +21 -21
- data/README.md +168 -172
- data/Rakefile +29 -29
- data/examples/generate.rb +15 -15
- data/lib/axlsx/content_type/abstract_content_type.rb +32 -32
- data/lib/axlsx/content_type/content_type.rb +26 -26
- data/lib/axlsx/content_type/default.rb +25 -25
- data/lib/axlsx/content_type/override.rb +25 -25
- data/lib/axlsx/doc_props/app.rb +235 -235
- data/lib/axlsx/doc_props/core.rb +39 -39
- data/lib/axlsx/drawing/area_chart.rb +99 -99
- data/lib/axlsx/drawing/area_series.rb +110 -110
- data/lib/axlsx/drawing/ax_data_source.rb +26 -26
- data/lib/axlsx/drawing/axes.rb +61 -61
- data/lib/axlsx/drawing/axis.rb +190 -190
- data/lib/axlsx/drawing/bar_3D_chart.rb +148 -148
- data/lib/axlsx/drawing/bar_chart.rb +138 -138
- data/lib/axlsx/drawing/bar_series.rb +97 -97
- data/lib/axlsx/drawing/bubble_chart.rb +59 -59
- data/lib/axlsx/drawing/bubble_series.rb +63 -63
- data/lib/axlsx/drawing/cat_axis.rb +85 -85
- data/lib/axlsx/drawing/chart.rb +276 -276
- data/lib/axlsx/drawing/d_lbls.rb +90 -90
- data/lib/axlsx/drawing/drawing.rb +167 -167
- data/lib/axlsx/drawing/graphic_frame.rb +54 -54
- data/lib/axlsx/drawing/hyperlink.rb +100 -100
- data/lib/axlsx/drawing/line_3D_chart.rb +68 -68
- data/lib/axlsx/drawing/line_chart.rb +99 -99
- data/lib/axlsx/drawing/line_series.rb +110 -110
- data/lib/axlsx/drawing/marker.rb +84 -84
- data/lib/axlsx/drawing/num_data.rb +52 -52
- data/lib/axlsx/drawing/num_data_source.rb +62 -62
- data/lib/axlsx/drawing/num_val.rb +34 -34
- data/lib/axlsx/drawing/one_cell_anchor.rb +99 -99
- data/lib/axlsx/drawing/pic.rb +211 -211
- data/lib/axlsx/drawing/picture_locking.rb +42 -42
- data/lib/axlsx/drawing/pie_3D_chart.rb +47 -47
- data/lib/axlsx/drawing/pie_series.rb +74 -74
- data/lib/axlsx/drawing/scaling.rb +60 -60
- data/lib/axlsx/drawing/scatter_chart.rb +74 -74
- data/lib/axlsx/drawing/scatter_series.rb +129 -98
- data/lib/axlsx/drawing/ser_axis.rb +45 -45
- data/lib/axlsx/drawing/series.rb +69 -69
- data/lib/axlsx/drawing/series_title.rb +25 -25
- data/lib/axlsx/drawing/str_data.rb +42 -42
- data/lib/axlsx/drawing/str_val.rb +34 -34
- data/lib/axlsx/drawing/title.rb +97 -97
- data/lib/axlsx/drawing/two_cell_anchor.rb +97 -97
- data/lib/axlsx/drawing/val_axis.rb +37 -37
- data/lib/axlsx/drawing/view_3D.rb +115 -115
- data/lib/axlsx/drawing/vml_drawing.rb +42 -42
- data/lib/axlsx/drawing/vml_shape.rb +66 -66
- data/lib/axlsx/package.rb +388 -388
- data/lib/axlsx/rels/relationship.rb +130 -130
- data/lib/axlsx/rels/relationships.rb +32 -32
- data/lib/axlsx/stylesheet/border.rb +73 -71
- data/lib/axlsx/stylesheet/border_pr.rb +71 -71
- data/lib/axlsx/stylesheet/cell_alignment.rb +132 -132
- data/lib/axlsx/stylesheet/cell_protection.rb +41 -41
- data/lib/axlsx/stylesheet/cell_style.rb +72 -72
- data/lib/axlsx/stylesheet/color.rb +76 -76
- data/lib/axlsx/stylesheet/dxf.rb +79 -79
- data/lib/axlsx/stylesheet/fill.rb +35 -35
- data/lib/axlsx/stylesheet/font.rb +156 -156
- data/lib/axlsx/stylesheet/gradient_fill.rb +103 -103
- data/lib/axlsx/stylesheet/gradient_stop.rb +37 -37
- data/lib/axlsx/stylesheet/num_fmt.rb +86 -86
- data/lib/axlsx/stylesheet/pattern_fill.rb +73 -73
- data/lib/axlsx/stylesheet/styles.rb +494 -420
- data/lib/axlsx/stylesheet/table_style.rb +54 -54
- data/lib/axlsx/stylesheet/table_style_element.rb +77 -77
- data/lib/axlsx/stylesheet/table_styles.rb +46 -46
- data/lib/axlsx/stylesheet/xf.rb +147 -147
- data/lib/axlsx/util/accessors.rb +64 -64
- data/lib/axlsx/util/constants.rb +410 -401
- data/lib/axlsx/util/mime_type_utils.rb +11 -11
- data/lib/axlsx/util/options_parser.rb +16 -16
- data/lib/axlsx/util/serialized_attributes.rb +89 -89
- data/lib/axlsx/util/simple_typed_list.rb +179 -179
- data/lib/axlsx/util/storage.rb +146 -146
- data/lib/axlsx/util/validators.rb +312 -312
- data/lib/axlsx/util/zip_command.rb +73 -73
- data/lib/axlsx/version.rb +5 -5
- data/lib/axlsx/workbook/defined_name.rb +128 -128
- data/lib/axlsx/workbook/defined_names.rb +21 -21
- data/lib/axlsx/workbook/shared_strings_table.rb +77 -77
- data/lib/axlsx/workbook/workbook.rb +395 -370
- data/lib/axlsx/workbook/workbook_view.rb +80 -80
- data/lib/axlsx/workbook/workbook_views.rb +22 -22
- data/lib/axlsx/workbook/worksheet/auto_filter/auto_filter.rb +77 -77
- data/lib/axlsx/workbook/worksheet/auto_filter/filter_column.rb +94 -94
- data/lib/axlsx/workbook/worksheet/auto_filter/filters.rb +244 -244
- data/lib/axlsx/workbook/worksheet/break.rb +35 -35
- data/lib/axlsx/workbook/worksheet/cell.rb +506 -505
- data/lib/axlsx/workbook/worksheet/cell_serializer.rb +164 -164
- data/lib/axlsx/workbook/worksheet/cfvo.rb +60 -60
- data/lib/axlsx/workbook/worksheet/cfvos.rb +18 -18
- data/lib/axlsx/workbook/worksheet/col.rb +145 -145
- data/lib/axlsx/workbook/worksheet/col_breaks.rb +35 -35
- data/lib/axlsx/workbook/worksheet/color_scale.rb +110 -110
- data/lib/axlsx/workbook/worksheet/cols.rb +23 -23
- data/lib/axlsx/workbook/worksheet/comment.rb +91 -91
- data/lib/axlsx/workbook/worksheet/comments.rb +82 -82
- data/lib/axlsx/workbook/worksheet/conditional_formatting.rb +82 -82
- data/lib/axlsx/workbook/worksheet/conditional_formatting_rule.rb +220 -220
- data/lib/axlsx/workbook/worksheet/conditional_formattings.rb +25 -25
- data/lib/axlsx/workbook/worksheet/data_bar.rb +129 -129
- data/lib/axlsx/workbook/worksheet/data_validation.rb +246 -246
- data/lib/axlsx/workbook/worksheet/data_validations.rb +28 -28
- data/lib/axlsx/workbook/worksheet/date_time_converter.rb +30 -30
- data/lib/axlsx/workbook/worksheet/dimension.rb +64 -64
- data/lib/axlsx/workbook/worksheet/header_footer.rb +52 -52
- data/lib/axlsx/workbook/worksheet/icon_set.rb +81 -81
- data/lib/axlsx/workbook/worksheet/merged_cells.rb +37 -37
- data/lib/axlsx/workbook/worksheet/outline_pr.rb +33 -33
- data/lib/axlsx/workbook/worksheet/page_margins.rb +97 -97
- data/lib/axlsx/workbook/worksheet/page_set_up_pr.rb +44 -44
- data/lib/axlsx/workbook/worksheet/page_setup.rb +240 -240
- data/lib/axlsx/workbook/worksheet/pane.rb +139 -139
- data/lib/axlsx/workbook/worksheet/pivot_table.rb +296 -294
- data/lib/axlsx/workbook/worksheet/pivot_table_cache_definition.rb +66 -66
- data/lib/axlsx/workbook/worksheet/pivot_tables.rb +24 -24
- data/lib/axlsx/workbook/worksheet/print_options.rb +39 -39
- data/lib/axlsx/workbook/worksheet/protected_range.rb +47 -47
- data/lib/axlsx/workbook/worksheet/protected_ranges.rb +37 -37
- data/lib/axlsx/workbook/worksheet/rich_text.rb +55 -55
- data/lib/axlsx/workbook/worksheet/rich_text_run.rb +250 -250
- data/lib/axlsx/workbook/worksheet/row.rb +164 -164
- data/lib/axlsx/workbook/worksheet/row_breaks.rb +33 -33
- data/lib/axlsx/workbook/worksheet/selection.rb +101 -101
- data/lib/axlsx/workbook/worksheet/sheet_calc_pr.rb +29 -29
- data/lib/axlsx/workbook/worksheet/sheet_data.rb +27 -27
- data/lib/axlsx/workbook/worksheet/sheet_pr.rb +87 -87
- data/lib/axlsx/workbook/worksheet/sheet_protection.rb +118 -118
- data/lib/axlsx/workbook/worksheet/sheet_view.rb +213 -213
- data/lib/axlsx/workbook/worksheet/table.rb +102 -102
- data/lib/axlsx/workbook/worksheet/table_style_info.rb +49 -49
- data/lib/axlsx/workbook/worksheet/tables.rb +34 -34
- data/lib/axlsx/workbook/worksheet/worksheet.rb +786 -768
- data/lib/axlsx/workbook/worksheet/worksheet_comments.rb +58 -58
- data/lib/axlsx/workbook/worksheet/worksheet_drawing.rb +58 -58
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlink.rb +74 -74
- data/lib/axlsx/workbook/worksheet/worksheet_hyperlinks.rb +38 -38
- data/lib/axlsx.rb +185 -171
- data/lib/caxlsx.rb +2 -2
- data/lib/schema/dc.xsd +118 -118
- data/lib/schema/dcmitype.xsd +51 -51
- data/lib/schema/dcterms.xsd +331 -331
- data/lib/schema/dml-chartDrawing.xsd +146 -146
- data/lib/schema/dml-compatibility.xsd +14 -14
- data/lib/schema/dml-lockedCanvas.xsd +11 -11
- data/lib/schema/dml-main.xsd +3048 -3048
- data/lib/schema/dml-picture.xsd +23 -23
- data/lib/schema/dml-spreadsheetDrawing.xsd +185 -185
- data/lib/schema/dml-wordprocessingDrawing.xsd +185 -185
- data/lib/schema/shared-additionalCharacteristics.xsd +28 -28
- data/lib/schema/shared-bibliography.xsd +144 -144
- data/lib/schema/shared-commonSimpleTypes.xsd +166 -166
- data/lib/schema/shared-customXmlDataProperties.xsd +25 -25
- data/lib/schema/shared-customXmlSchemaProperties.xsd +18 -18
- data/lib/schema/shared-documentPropertiesCustom.xsd +59 -59
- data/lib/schema/shared-documentPropertiesExtended.xsd +56 -56
- data/lib/schema/shared-documentPropertiesVariantTypes.xsd +195 -195
- data/lib/schema/shared-relationshipReference.xsd +25 -25
- data/lib/schema/vml-main.xsd +569 -569
- data/lib/schema/vml-officeDrawing.xsd +509 -509
- data/lib/schema/vml-presentationDrawing.xsd +12 -12
- data/lib/schema/vml-spreadsheetDrawing.xsd +108 -108
- data/lib/schema/vml-wordprocessingDrawing.xsd +96 -96
- data/lib/schema/xml.xsd +116 -116
- data/test/benchmark.rb +72 -72
- data/test/content_type/tc_content_type.rb +76 -76
- data/test/content_type/tc_default.rb +16 -16
- data/test/content_type/tc_override.rb +14 -14
- data/test/doc_props/tc_app.rb +43 -43
- data/test/doc_props/tc_core.rb +42 -42
- data/test/drawing/tc_area_chart.rb +39 -39
- data/test/drawing/tc_area_series.rb +71 -71
- data/test/drawing/tc_axes.rb +7 -7
- data/test/drawing/tc_axis.rb +112 -112
- data/test/drawing/tc_bar_3D_chart.rb +86 -86
- data/test/drawing/tc_bar_chart.rb +86 -86
- data/test/drawing/tc_bar_series.rb +46 -46
- data/test/drawing/tc_bubble_chart.rb +44 -44
- data/test/drawing/tc_bubble_series.rb +21 -21
- data/test/drawing/tc_cat_axis.rb +31 -31
- data/test/drawing/tc_cat_axis_data.rb +27 -27
- data/test/drawing/tc_chart.rb +123 -123
- data/test/drawing/tc_d_lbls.rb +57 -57
- data/test/drawing/tc_data_source.rb +23 -23
- data/test/drawing/tc_drawing.rb +80 -80
- data/test/drawing/tc_graphic_frame.rb +27 -27
- data/test/drawing/tc_hyperlink.rb +64 -64
- data/test/drawing/tc_line_3d_chart.rb +47 -47
- data/test/drawing/tc_line_chart.rb +39 -39
- data/test/drawing/tc_line_series.rb +71 -71
- data/test/drawing/tc_marker.rb +44 -44
- data/test/drawing/tc_named_axis_data.rb +27 -27
- data/test/drawing/tc_num_data.rb +31 -31
- data/test/drawing/tc_num_val.rb +29 -29
- data/test/drawing/tc_one_cell_anchor.rb +66 -66
- data/test/drawing/tc_pic.rb +103 -103
- data/test/drawing/tc_picture_locking.rb +72 -72
- data/test/drawing/tc_pie_3D_chart.rb +28 -28
- data/test/drawing/tc_pie_series.rb +33 -33
- data/test/drawing/tc_scaling.rb +36 -36
- data/test/drawing/tc_scatter_chart.rb +48 -48
- data/test/drawing/tc_scatter_series.rb +74 -56
- data/test/drawing/tc_ser_axis.rb +31 -31
- data/test/drawing/tc_series.rb +23 -23
- data/test/drawing/tc_series_title.rb +54 -54
- data/test/drawing/tc_str_data.rb +18 -18
- data/test/drawing/tc_str_val.rb +30 -30
- data/test/drawing/tc_title.rb +70 -70
- data/test/drawing/tc_two_cell_anchor.rb +36 -36
- data/test/drawing/tc_val_axis.rb +24 -24
- data/test/drawing/tc_view_3D.rb +54 -54
- data/test/drawing/tc_vml_drawing.rb +25 -25
- data/test/drawing/tc_vml_shape.rb +106 -106
- data/test/profile.rb +24 -24
- data/test/rels/tc_relationship.rb +52 -52
- data/test/rels/tc_relationships.rb +37 -37
- data/test/stylesheet/tc_border.rb +37 -37
- data/test/stylesheet/tc_border_pr.rb +32 -32
- data/test/stylesheet/tc_cell_alignment.rb +81 -81
- data/test/stylesheet/tc_cell_protection.rb +29 -29
- data/test/stylesheet/tc_cell_style.rb +57 -57
- data/test/stylesheet/tc_color.rb +43 -43
- data/test/stylesheet/tc_dxf.rb +81 -81
- data/test/stylesheet/tc_fill.rb +18 -18
- data/test/stylesheet/tc_font.rb +133 -133
- data/test/stylesheet/tc_gradient_fill.rb +72 -72
- data/test/stylesheet/tc_gradient_stop.rb +31 -31
- data/test/stylesheet/tc_num_fmt.rb +30 -30
- data/test/stylesheet/tc_pattern_fill.rb +43 -43
- data/test/stylesheet/tc_styles.rb +309 -261
- data/test/stylesheet/tc_table_style.rb +44 -44
- data/test/stylesheet/tc_table_style_element.rb +45 -45
- data/test/stylesheet/tc_table_styles.rb +29 -29
- data/test/stylesheet/tc_xf.rb +120 -120
- data/test/tc_axlsx.rb +109 -109
- data/test/tc_helper.rb +10 -10
- data/test/tc_package.rb +317 -314
- data/test/util/tc_mime_type_utils.rb +13 -13
- data/test/util/tc_serialized_attributes.rb +19 -19
- data/test/util/tc_simple_typed_list.rb +77 -77
- data/test/util/tc_validators.rb +210 -210
- data/test/workbook/tc_defined_name.rb +49 -49
- data/test/workbook/tc_shared_strings_table.rb +59 -59
- data/test/workbook/tc_workbook.rb +165 -160
- data/test/workbook/tc_workbook_view.rb +50 -50
- data/test/workbook/worksheet/auto_filter/tc_auto_filter.rb +38 -38
- data/test/workbook/worksheet/auto_filter/tc_filter_column.rb +76 -76
- data/test/workbook/worksheet/auto_filter/tc_filters.rb +50 -50
- data/test/workbook/worksheet/tc_break.rb +49 -49
- data/test/workbook/worksheet/tc_cell.rb +465 -453
- data/test/workbook/worksheet/tc_cfvo.rb +31 -31
- data/test/workbook/worksheet/tc_col.rb +93 -93
- data/test/workbook/worksheet/tc_color_scale.rb +58 -58
- data/test/workbook/worksheet/tc_comment.rb +72 -72
- data/test/workbook/worksheet/tc_comments.rb +57 -57
- data/test/workbook/worksheet/tc_conditional_formatting.rb +224 -224
- data/test/workbook/worksheet/tc_data_bar.rb +46 -46
- data/test/workbook/worksheet/tc_data_validation.rb +265 -265
- data/test/workbook/worksheet/tc_date_time_converter.rb +124 -124
- data/test/workbook/worksheet/tc_header_footer.rb +151 -151
- data/test/workbook/worksheet/tc_icon_set.rb +45 -45
- data/test/workbook/worksheet/tc_outline_pr.rb +19 -19
- data/test/workbook/worksheet/tc_page_margins.rb +97 -97
- data/test/workbook/worksheet/tc_page_set_up_pr.rb +15 -15
- data/test/workbook/worksheet/tc_page_setup.rb +143 -143
- data/test/workbook/worksheet/tc_pane.rb +54 -54
- data/test/workbook/worksheet/tc_pivot_table.rb +180 -143
- data/test/workbook/worksheet/tc_pivot_table_cache_definition.rb +62 -62
- data/test/workbook/worksheet/tc_print_options.rb +72 -72
- data/test/workbook/worksheet/tc_protected_range.rb +17 -17
- data/test/workbook/worksheet/tc_rich_text.rb +44 -44
- data/test/workbook/worksheet/tc_rich_text_run.rb +173 -173
- data/test/workbook/worksheet/tc_row.rb +160 -160
- data/test/workbook/worksheet/tc_selection.rb +55 -55
- data/test/workbook/worksheet/tc_sheet_calc_pr.rb +18 -18
- data/test/workbook/worksheet/tc_sheet_format_pr.rb +88 -88
- data/test/workbook/worksheet/tc_sheet_pr.rb +49 -49
- data/test/workbook/worksheet/tc_sheet_protection.rb +117 -117
- data/test/workbook/worksheet/tc_sheet_view.rb +214 -214
- data/test/workbook/worksheet/tc_table.rb +77 -77
- data/test/workbook/worksheet/tc_table_style_info.rb +53 -53
- data/test/workbook/worksheet/tc_worksheet.rb +632 -601
- data/test/workbook/worksheet/tc_worksheet_hyperlink.rb +55 -55
- metadata +101 -101
|
@@ -1,294 +1,296 @@
|
|
|
1
|
-
# encoding: UTF-8
|
|
2
|
-
module Axlsx
|
|
3
|
-
# Table
|
|
4
|
-
# @note Worksheet#add_pivot_table is the recommended way to create tables for your worksheets.
|
|
5
|
-
# @see README for examples
|
|
6
|
-
class PivotTable
|
|
7
|
-
|
|
8
|
-
include Axlsx::OptionsParser
|
|
9
|
-
|
|
10
|
-
# Creates a new PivotTable object
|
|
11
|
-
# @param [String] ref The reference to where the pivot table lives like 'G4:L17'.
|
|
12
|
-
# @param [String] range The reference to the pivot table data like 'A1:D31'.
|
|
13
|
-
# @param [Worksheet] sheet The sheet containing the table data.
|
|
14
|
-
# @option options [Cell, String] name
|
|
15
|
-
# @option options [TableStyle] style
|
|
16
|
-
def initialize(ref, range, sheet, options={})
|
|
17
|
-
@ref = ref
|
|
18
|
-
self.range = range
|
|
19
|
-
@sheet = sheet
|
|
20
|
-
@sheet.workbook.pivot_tables << self
|
|
21
|
-
@name = "PivotTable#{index+1}"
|
|
22
|
-
@data_sheet = nil
|
|
23
|
-
@rows = []
|
|
24
|
-
@columns = []
|
|
25
|
-
@data = []
|
|
26
|
-
@pages = []
|
|
27
|
-
@subtotal = nil
|
|
28
|
-
@no_subtotals_on_headers = []
|
|
29
|
-
@style_info = {}
|
|
30
|
-
parse_options options
|
|
31
|
-
yield self if block_given?
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
# Defines the headers in which subtotals are not to be included
|
|
35
|
-
# @return[Array]
|
|
36
|
-
attr_accessor :no_subtotals_on_headers
|
|
37
|
-
|
|
38
|
-
# Style info for the pivot table
|
|
39
|
-
# @return[Hash]
|
|
40
|
-
attr_accessor :style_info
|
|
41
|
-
|
|
42
|
-
# The reference to the table data
|
|
43
|
-
# @return [String]
|
|
44
|
-
attr_reader :ref
|
|
45
|
-
|
|
46
|
-
# The name of the table.
|
|
47
|
-
# @return [String]
|
|
48
|
-
attr_reader :name
|
|
49
|
-
|
|
50
|
-
# The name of the sheet.
|
|
51
|
-
# @return [String]
|
|
52
|
-
attr_reader :sheet
|
|
53
|
-
|
|
54
|
-
# The sheet used as data source for the pivot table
|
|
55
|
-
# @return [Worksheet]
|
|
56
|
-
attr_writer :data_sheet
|
|
57
|
-
|
|
58
|
-
# @see #data_sheet
|
|
59
|
-
def data_sheet
|
|
60
|
-
@data_sheet || @sheet
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
# The range where the data for this pivot table lives.
|
|
64
|
-
# @return [String]
|
|
65
|
-
attr_reader :range
|
|
66
|
-
|
|
67
|
-
# (see #range)
|
|
68
|
-
def range=(v)
|
|
69
|
-
DataTypeValidator.validate "#{self.class}.range", [String], v
|
|
70
|
-
if v.is_a?(String)
|
|
71
|
-
@range = v
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
# The rows
|
|
76
|
-
# @return [Array]
|
|
77
|
-
attr_reader :rows
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
# (see #rows)
|
|
81
|
-
def rows=(v)
|
|
82
|
-
DataTypeValidator.validate "#{self.class}.rows", [Array], v
|
|
83
|
-
v.each do |ref|
|
|
84
|
-
DataTypeValidator.validate "#{self.class}.rows[]", [String], ref
|
|
85
|
-
end
|
|
86
|
-
@rows = v
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
# The columns
|
|
90
|
-
# @return [Array]
|
|
91
|
-
attr_reader :columns
|
|
92
|
-
|
|
93
|
-
# (see #columns)
|
|
94
|
-
def columns=(v)
|
|
95
|
-
DataTypeValidator.validate "#{self.class}.columns", [Array], v
|
|
96
|
-
v.each do |ref|
|
|
97
|
-
DataTypeValidator.validate "#{self.class}.columns[]", [String], ref
|
|
98
|
-
end
|
|
99
|
-
@columns = v
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
# The data
|
|
103
|
-
# @return [Array]
|
|
104
|
-
attr_reader :data
|
|
105
|
-
|
|
106
|
-
# (see #data)
|
|
107
|
-
def data=(v)
|
|
108
|
-
DataTypeValidator.validate "#{self.class}.data", [Array], v
|
|
109
|
-
@data = []
|
|
110
|
-
v.each do |data_field|
|
|
111
|
-
if data_field.is_a? String
|
|
112
|
-
data_field = {:ref => data_field}
|
|
113
|
-
end
|
|
114
|
-
data_field.each do |key, value|
|
|
115
|
-
if key == :num_fmt
|
|
116
|
-
DataTypeValidator.validate "#{self.class}.data[]", [Integer], value
|
|
117
|
-
else
|
|
118
|
-
DataTypeValidator.validate "#{self.class}.data[]", [String], value
|
|
119
|
-
end
|
|
120
|
-
end
|
|
121
|
-
@data << data_field
|
|
122
|
-
end
|
|
123
|
-
@data
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
# The pages
|
|
127
|
-
# @return [String]
|
|
128
|
-
attr_reader :pages
|
|
129
|
-
|
|
130
|
-
# (see #pages)
|
|
131
|
-
def pages=(v)
|
|
132
|
-
DataTypeValidator.validate "#{self.class}.pages", [Array], v
|
|
133
|
-
v.each do |ref|
|
|
134
|
-
DataTypeValidator.validate "#{self.class}.pages[]", [String], ref
|
|
135
|
-
end
|
|
136
|
-
@pages = v
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
# The index of this chart in the workbooks charts collection
|
|
140
|
-
# @return [Integer]
|
|
141
|
-
def index
|
|
142
|
-
@sheet.workbook.pivot_tables.index(self)
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
# The part name for this table
|
|
146
|
-
# @return [String]
|
|
147
|
-
def pn
|
|
148
|
-
"#{PIVOT_TABLE_PN % (index+1)}"
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
# The relationship part name of this pivot table
|
|
152
|
-
# @return [String]
|
|
153
|
-
def rels_pn
|
|
154
|
-
"#{PIVOT_TABLE_RELS_PN % (index+1)}"
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
# The cache_definition for this pivot table
|
|
158
|
-
# @return [PivotTableCacheDefinition]
|
|
159
|
-
def cache_definition
|
|
160
|
-
@cache_definition ||= PivotTableCacheDefinition.new(self)
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
# The relationships for this pivot table.
|
|
164
|
-
# @return [Relationships]
|
|
165
|
-
def relationships
|
|
166
|
-
r = Relationships.new
|
|
167
|
-
r << Relationship.new(cache_definition, PIVOT_TABLE_CACHE_DEFINITION_R, "../#{cache_definition.pn}")
|
|
168
|
-
r
|
|
169
|
-
end
|
|
170
|
-
|
|
171
|
-
# Serializes the object
|
|
172
|
-
# @param [String] str
|
|
173
|
-
# @return [String]
|
|
174
|
-
def to_xml_string(str = '')
|
|
175
|
-
str << '<?xml version="1.0" encoding="UTF-8"?>'
|
|
176
|
-
|
|
177
|
-
str << ('<
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
str <<
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
str <<
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
str << "
|
|
221
|
-
str << "
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
'<pivotField axis="axisRow" compact="0" outline="0" subtotalTop="0" showAll="0" includeNewItemsInFilter="1"
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
elsif
|
|
278
|
-
'<pivotField axis="
|
|
279
|
-
elsif
|
|
280
|
-
'<pivotField
|
|
281
|
-
|
|
282
|
-
'<pivotField compact="0" outline="0" subtotalTop="0" showAll="0" includeNewItemsInFilter="1"></pivotField>'
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
end
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
module Axlsx
|
|
3
|
+
# Table
|
|
4
|
+
# @note Worksheet#add_pivot_table is the recommended way to create tables for your worksheets.
|
|
5
|
+
# @see README for examples
|
|
6
|
+
class PivotTable
|
|
7
|
+
|
|
8
|
+
include Axlsx::OptionsParser
|
|
9
|
+
|
|
10
|
+
# Creates a new PivotTable object
|
|
11
|
+
# @param [String] ref The reference to where the pivot table lives like 'G4:L17'.
|
|
12
|
+
# @param [String] range The reference to the pivot table data like 'A1:D31'.
|
|
13
|
+
# @param [Worksheet] sheet The sheet containing the table data.
|
|
14
|
+
# @option options [Cell, String] name
|
|
15
|
+
# @option options [TableStyle] style
|
|
16
|
+
def initialize(ref, range, sheet, options={})
|
|
17
|
+
@ref = ref
|
|
18
|
+
self.range = range
|
|
19
|
+
@sheet = sheet
|
|
20
|
+
@sheet.workbook.pivot_tables << self
|
|
21
|
+
@name = "PivotTable#{index+1}"
|
|
22
|
+
@data_sheet = nil
|
|
23
|
+
@rows = []
|
|
24
|
+
@columns = []
|
|
25
|
+
@data = []
|
|
26
|
+
@pages = []
|
|
27
|
+
@subtotal = nil
|
|
28
|
+
@no_subtotals_on_headers = []
|
|
29
|
+
@style_info = {}
|
|
30
|
+
parse_options options
|
|
31
|
+
yield self if block_given?
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Defines the headers in which subtotals are not to be included
|
|
35
|
+
# @return[Array]
|
|
36
|
+
attr_accessor :no_subtotals_on_headers
|
|
37
|
+
|
|
38
|
+
# Style info for the pivot table
|
|
39
|
+
# @return[Hash]
|
|
40
|
+
attr_accessor :style_info
|
|
41
|
+
|
|
42
|
+
# The reference to the table data
|
|
43
|
+
# @return [String]
|
|
44
|
+
attr_reader :ref
|
|
45
|
+
|
|
46
|
+
# The name of the table.
|
|
47
|
+
# @return [String]
|
|
48
|
+
attr_reader :name
|
|
49
|
+
|
|
50
|
+
# The name of the sheet.
|
|
51
|
+
# @return [String]
|
|
52
|
+
attr_reader :sheet
|
|
53
|
+
|
|
54
|
+
# The sheet used as data source for the pivot table
|
|
55
|
+
# @return [Worksheet]
|
|
56
|
+
attr_writer :data_sheet
|
|
57
|
+
|
|
58
|
+
# @see #data_sheet
|
|
59
|
+
def data_sheet
|
|
60
|
+
@data_sheet || @sheet
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# The range where the data for this pivot table lives.
|
|
64
|
+
# @return [String]
|
|
65
|
+
attr_reader :range
|
|
66
|
+
|
|
67
|
+
# (see #range)
|
|
68
|
+
def range=(v)
|
|
69
|
+
DataTypeValidator.validate "#{self.class}.range", [String], v
|
|
70
|
+
if v.is_a?(String)
|
|
71
|
+
@range = v
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# The rows
|
|
76
|
+
# @return [Array]
|
|
77
|
+
attr_reader :rows
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
# (see #rows)
|
|
81
|
+
def rows=(v)
|
|
82
|
+
DataTypeValidator.validate "#{self.class}.rows", [Array], v
|
|
83
|
+
v.each do |ref|
|
|
84
|
+
DataTypeValidator.validate "#{self.class}.rows[]", [String], ref
|
|
85
|
+
end
|
|
86
|
+
@rows = v
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# The columns
|
|
90
|
+
# @return [Array]
|
|
91
|
+
attr_reader :columns
|
|
92
|
+
|
|
93
|
+
# (see #columns)
|
|
94
|
+
def columns=(v)
|
|
95
|
+
DataTypeValidator.validate "#{self.class}.columns", [Array], v
|
|
96
|
+
v.each do |ref|
|
|
97
|
+
DataTypeValidator.validate "#{self.class}.columns[]", [String], ref
|
|
98
|
+
end
|
|
99
|
+
@columns = v
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# The data
|
|
103
|
+
# @return [Array]
|
|
104
|
+
attr_reader :data
|
|
105
|
+
|
|
106
|
+
# (see #data)
|
|
107
|
+
def data=(v)
|
|
108
|
+
DataTypeValidator.validate "#{self.class}.data", [Array], v
|
|
109
|
+
@data = []
|
|
110
|
+
v.each do |data_field|
|
|
111
|
+
if data_field.is_a? String
|
|
112
|
+
data_field = {:ref => data_field}
|
|
113
|
+
end
|
|
114
|
+
data_field.each do |key, value|
|
|
115
|
+
if key == :num_fmt
|
|
116
|
+
DataTypeValidator.validate "#{self.class}.data[]", [Integer], value
|
|
117
|
+
else
|
|
118
|
+
DataTypeValidator.validate "#{self.class}.data[]", [String], value
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
@data << data_field
|
|
122
|
+
end
|
|
123
|
+
@data
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# The pages
|
|
127
|
+
# @return [String]
|
|
128
|
+
attr_reader :pages
|
|
129
|
+
|
|
130
|
+
# (see #pages)
|
|
131
|
+
def pages=(v)
|
|
132
|
+
DataTypeValidator.validate "#{self.class}.pages", [Array], v
|
|
133
|
+
v.each do |ref|
|
|
134
|
+
DataTypeValidator.validate "#{self.class}.pages[]", [String], ref
|
|
135
|
+
end
|
|
136
|
+
@pages = v
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# The index of this chart in the workbooks charts collection
|
|
140
|
+
# @return [Integer]
|
|
141
|
+
def index
|
|
142
|
+
@sheet.workbook.pivot_tables.index(self)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# The part name for this table
|
|
146
|
+
# @return [String]
|
|
147
|
+
def pn
|
|
148
|
+
"#{PIVOT_TABLE_PN % (index+1)}"
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# The relationship part name of this pivot table
|
|
152
|
+
# @return [String]
|
|
153
|
+
def rels_pn
|
|
154
|
+
"#{PIVOT_TABLE_RELS_PN % (index+1)}"
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# The cache_definition for this pivot table
|
|
158
|
+
# @return [PivotTableCacheDefinition]
|
|
159
|
+
def cache_definition
|
|
160
|
+
@cache_definition ||= PivotTableCacheDefinition.new(self)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
# The relationships for this pivot table.
|
|
164
|
+
# @return [Relationships]
|
|
165
|
+
def relationships
|
|
166
|
+
r = Relationships.new
|
|
167
|
+
r << Relationship.new(cache_definition, PIVOT_TABLE_CACHE_DEFINITION_R, "../#{cache_definition.pn}")
|
|
168
|
+
r
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# Serializes the object
|
|
172
|
+
# @param [String] str
|
|
173
|
+
# @return [String]
|
|
174
|
+
def to_xml_string(str = '')
|
|
175
|
+
str << '<?xml version="1.0" encoding="UTF-8"?>'
|
|
176
|
+
|
|
177
|
+
str << ('<pivotTableDefinition xmlns="' << XML_NS << '" name="' << name << '" cacheId="' << cache_definition.cache_id.to_s << '"' << (data.size <= 1 ? ' dataOnRows="1"' : '') << ' applyNumberFormats="0" applyBorderFormats="0" applyFontFormats="0" applyPatternFormats="0" applyAlignmentFormats="0" applyWidthHeightFormats="1" dataCaption="Data" showMultipleLabel="0" showMemberPropertyTips="0" useAutoFormatting="1" indent="0" compact="0" compactData="0" gridDropZones="1" multipleFieldFilters="0">')
|
|
178
|
+
|
|
179
|
+
str << ('<location firstDataCol="1" firstDataRow="1" firstHeaderRow="1" ref="' << ref << '"/>')
|
|
180
|
+
str << ('<pivotFields count="' << header_cells_count.to_s << '">')
|
|
181
|
+
header_cell_values.each do |cell_value|
|
|
182
|
+
str << pivot_field_for(cell_value, !no_subtotals_on_headers.include?(cell_value))
|
|
183
|
+
end
|
|
184
|
+
str << '</pivotFields>'
|
|
185
|
+
if rows.empty?
|
|
186
|
+
str << '<rowFields count="1"><field x="-2"/></rowFields>'
|
|
187
|
+
str << '<rowItems count="2"><i><x/></i> <i i="1"><x v="1"/></i></rowItems>'
|
|
188
|
+
else
|
|
189
|
+
str << ('<rowFields count="' << rows.size.to_s << '">')
|
|
190
|
+
rows.each do |row_value|
|
|
191
|
+
str << ('<field x="' << header_index_of(row_value).to_s << '"/>')
|
|
192
|
+
end
|
|
193
|
+
str << '</rowFields>'
|
|
194
|
+
str << ('<rowItems count="' << rows.size.to_s << '">')
|
|
195
|
+
rows.size.times do |i|
|
|
196
|
+
str << '<i/>'
|
|
197
|
+
end
|
|
198
|
+
str << '</rowItems>'
|
|
199
|
+
end
|
|
200
|
+
if columns.empty? && data.size <= 1
|
|
201
|
+
str << '<colItems count="1"><i/></colItems>'
|
|
202
|
+
else
|
|
203
|
+
str << ('<colFields count="' << columns.size.to_s << '">')
|
|
204
|
+
columns.each do |column_value|
|
|
205
|
+
str << ('<field x="' << header_index_of(column_value).to_s << '"/>')
|
|
206
|
+
end
|
|
207
|
+
str << '</colFields>'
|
|
208
|
+
end
|
|
209
|
+
unless pages.empty?
|
|
210
|
+
str << ('<pageFields count="' << pages.size.to_s << '">')
|
|
211
|
+
pages.each do |page_value|
|
|
212
|
+
str << ('<pageField fld="' << header_index_of(page_value).to_s << '"/>')
|
|
213
|
+
end
|
|
214
|
+
str << '</pageFields>'
|
|
215
|
+
end
|
|
216
|
+
unless data.empty?
|
|
217
|
+
str << "<dataFields count=\"#{data.size}\">"
|
|
218
|
+
data.each do |datum_value|
|
|
219
|
+
# The correct name prefix in ["Sum","Average", etc...]
|
|
220
|
+
str << "<dataField name='#{(datum_value[:subtotal]||'')} of #{datum_value[:ref]}' fld='#{header_index_of(datum_value[:ref])}' baseField='0' baseItem='0'"
|
|
221
|
+
str << " numFmtId='#{datum_value[:num_fmt]}'" if datum_value[:num_fmt]
|
|
222
|
+
str << " subtotal='#{datum_value[:subtotal]}' " if datum_value[:subtotal]
|
|
223
|
+
str << "/>"
|
|
224
|
+
end
|
|
225
|
+
str << '</dataFields>'
|
|
226
|
+
end
|
|
227
|
+
# custom pivot table style
|
|
228
|
+
unless style_info.empty?
|
|
229
|
+
str << '<pivotTableStyleInfo'
|
|
230
|
+
style_info.each do |k,v|
|
|
231
|
+
str << ' ' << k.to_s << '="' << v.to_s << '"'
|
|
232
|
+
end
|
|
233
|
+
str << ' />'
|
|
234
|
+
end
|
|
235
|
+
str << '</pivotTableDefinition>'
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
# References for header cells
|
|
239
|
+
# @return [Array]
|
|
240
|
+
def header_cell_refs
|
|
241
|
+
Axlsx::range_to_a(header_range).first
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
# The header cells for the pivot table
|
|
245
|
+
# @return [Array]
|
|
246
|
+
def header_cells
|
|
247
|
+
data_sheet[header_range]
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
# The values in the header cells collection
|
|
251
|
+
# @return [Array]
|
|
252
|
+
def header_cell_values
|
|
253
|
+
header_cells.map(&:value)
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
# The number of cells in the header_cells collection
|
|
257
|
+
# @return [Integer]
|
|
258
|
+
def header_cells_count
|
|
259
|
+
header_cells.count
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
# The index of a given value in the header cells
|
|
263
|
+
# @return [Integer]
|
|
264
|
+
def header_index_of(value)
|
|
265
|
+
header_cell_values.index(value)
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
private
|
|
269
|
+
|
|
270
|
+
def pivot_field_for(cell_ref, subtotal=true)
|
|
271
|
+
if rows.include? cell_ref
|
|
272
|
+
if subtotal
|
|
273
|
+
'<pivotField axis="axisRow" compact="0" outline="0" subtotalTop="0" showAll="0" includeNewItemsInFilter="1"><items count="1"><item t="default"/></items></pivotField>'
|
|
274
|
+
else
|
|
275
|
+
'<pivotField axis="axisRow" compact="0" outline="0" subtotalTop="0" showAll="0" includeNewItemsInFilter="1" defaultSubtotal="0"></pivotField>'
|
|
276
|
+
end
|
|
277
|
+
elsif columns.include? cell_ref
|
|
278
|
+
'<pivotField axis="axisCol" compact="0" outline="0" subtotalTop="0" showAll="0" includeNewItemsInFilter="1"><items count="1"><item t="default"/></items></pivotField>'
|
|
279
|
+
elsif pages.include? cell_ref
|
|
280
|
+
'<pivotField axis="axisPage" compact="0" outline="0" subtotalTop="0" showAll="0" includeNewItemsInFilter="1"><items count="1"><item t="default"/></items></pivotField>'
|
|
281
|
+
elsif data_refs.include? cell_ref
|
|
282
|
+
'<pivotField dataField="1" compact="0" outline="0" subtotalTop="0" showAll="0" includeNewItemsInFilter="1"></pivotField>'
|
|
283
|
+
else
|
|
284
|
+
'<pivotField compact="0" outline="0" subtotalTop="0" showAll="0" includeNewItemsInFilter="1"></pivotField>'
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
def data_refs
|
|
289
|
+
data.map { |hash| hash[:ref] }
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
def header_range
|
|
293
|
+
range.gsub(/^(\w+?)(\d+)\:(\w+?)\d+$/, '\1\2:\3\2')
|
|
294
|
+
end
|
|
295
|
+
end
|
|
296
|
+
end
|