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