Class: Axlsx::PivotTable
- Inherits:
-
Object
- Object
- Axlsx::PivotTable
- Includes:
- OptionsParser
- Defined in:
- lib/axlsx/workbook/worksheet/pivot_table.rb
Overview
Worksheet#add_pivot_table is the recommended way to create tables for your worksheets.
Table
Instance Attribute Summary collapse
-
#columns ⇒ Array
The columns.
-
#data ⇒ Array
The data as an array of either headers (String) or hashes or mix of the two.
- #data_sheet ⇒ Object
-
#grand_totals ⇒ Symbol
Defines which Grand Totals are to be shown.
-
#name ⇒ String
readonly
The name of the table.
-
#no_subtotals_on_headers ⇒ Array
Defines the headers in which subtotals are not to be included.
-
#pages ⇒ String
The pages.
-
#range ⇒ String
The range where the data for this pivot table lives.
-
#ref ⇒ String
readonly
The reference to the table data.
-
#rows ⇒ Array
The rows.
-
#sheet ⇒ String
readonly
The name of the sheet.
-
#sort_on_headers ⇒ Hash
Defines the headers in which sort is applied.
-
#style_info ⇒ Hash
Style info for the pivot table.
Instance Method Summary collapse
-
#cache_definition ⇒ PivotTableCacheDefinition
The cache_definition for this pivot table.
-
#header_cell_refs ⇒ Array
References for header cells.
-
#header_cell_values ⇒ Array
The values in the header cells collection.
-
#header_cells ⇒ Array
The header cells for the pivot table.
-
#header_cells_count ⇒ Integer
The number of cells in the header_cells collection.
-
#header_index_of(value) ⇒ Integer
The index of a given value in the header cells.
-
#index ⇒ Integer
The index of this chart in the workbooks charts collection.
-
#initialize(ref, range, sheet, options = {}) {|_self| ... } ⇒ PivotTable
constructor
Creates a new PivotTable object.
-
#pn ⇒ String
The part name for this table.
-
#relationships ⇒ Relationships
The relationships for this pivot table.
-
#rels_pn ⇒ String
The relationship part name of this pivot table.
-
#to_xml_string(str = +'')) ⇒ String
Serializes the object.
Methods included from OptionsParser
Constructor Details
#initialize(ref, range, sheet, options = {}) {|_self| ... } ⇒ PivotTable
Creates a new PivotTable object
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 16 def initialize(ref, range, sheet, = {}) @ref = ref self.range = range @sheet = sheet @sheet.workbook.pivot_tables << self @name = "PivotTable#{index + 1}" @data_sheet = nil @rows = [] @columns = [] @data = [] @pages = [] @subtotal = nil @no_subtotals_on_headers = [] @grand_totals = :both @sort_on_headers = {} @style_info = {} yield self if block_given? end |
Instance Attribute Details
#columns ⇒ Array
The columns
120 121 122 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 120 def columns @columns end |
#data ⇒ Array
The data as an array of either headers (String) or hashes or mix of the two. Hash in format of { ref: header, num_fmt: numFmts, subtotal: subtotal }, where header is String, numFmts is Integer, and subtotal one of %w[sum count average max min product countNums stdDev stdDevp var varp]; leave subtotal blank to sum values
134 135 136 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 134 def data @data end |
#data_sheet ⇒ Object
89 90 91 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 89 def data_sheet @data_sheet || @sheet end |
#grand_totals ⇒ Symbol
Defines which Grand Totals are to be shown.
Defaults to :both
to show both row & column grand totals.
Set to :row_only
, :col_only
, or :none
to hide one or both Grand Totals.
59 60 61 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 59 def grand_totals @grand_totals end |
#name ⇒ String (readonly)
The name of the table.
78 79 80 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 78 def name @name end |
#no_subtotals_on_headers ⇒ Array
Defines the headers in which subtotals are not to be included.
38 39 40 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 38 def no_subtotals_on_headers @no_subtotals_on_headers end |
#pages ⇒ String
The pages
157 158 159 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 157 def pages @pages end |
#range ⇒ String
The range where the data for this pivot table lives.
95 96 97 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 95 def range @range end |
#ref ⇒ String (readonly)
The reference to the table data
74 75 76 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 74 def ref @ref end |
#rows ⇒ Array
The rows
107 108 109 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 107 def rows @rows end |
#sheet ⇒ String (readonly)
The name of the sheet.
82 83 84 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 82 def sheet @sheet end |
#sort_on_headers ⇒ Hash
Defines the headers in which sort is applied.
Can be an array of headers to sort ascending by default, or a hash for specific control
(with headers as keys, :ascending
or :descending
as values).
Examples: ["year", "month"]
or {"year" => :descending, "month" => :descending}
46 47 48 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 46 def sort_on_headers @sort_on_headers end |
#style_info ⇒ Hash
Style info for the pivot table
70 71 72 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 70 def style_info @style_info end |
Instance Method Details
#cache_definition ⇒ PivotTableCacheDefinition
The cache_definition for this pivot table
188 189 190 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 188 def cache_definition @cache_definition ||= PivotTableCacheDefinition.new(self) end |
#header_cell_refs ⇒ Array
References for header cells
288 289 290 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 288 def header_cell_refs Axlsx.range_to_a(header_range).first end |
#header_cell_values ⇒ Array
The values in the header cells collection
300 301 302 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 300 def header_cell_values header_cells.map(&:value) end |
#header_cells ⇒ Array
The header cells for the pivot table
294 295 296 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 294 def header_cells data_sheet[header_range] end |
#header_cells_count ⇒ Integer
The number of cells in the header_cells collection
306 307 308 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 306 def header_cells_count header_cells.count end |
#header_index_of(value) ⇒ Integer
The index of a given value in the header cells
312 313 314 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 312 def header_index_of(value) header_cell_values.index(value) end |
#index ⇒ Integer
The index of this chart in the workbooks charts collection
170 171 172 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 170 def index @sheet.workbook.pivot_tables.index(self) end |
#pn ⇒ String
The part name for this table
176 177 178 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 176 def pn format(PIVOT_TABLE_PN, index + 1) end |
#relationships ⇒ Relationships
The relationships for this pivot table.
194 195 196 197 198 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 194 def relationships r = Relationships.new r << Relationship.new(cache_definition, PIVOT_TABLE_CACHE_DEFINITION_R, "../#{cache_definition.pn}") r end |
#rels_pn ⇒ String
The relationship part name of this pivot table
182 183 184 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 182 def rels_pn format(PIVOT_TABLE_RELS_PN, index + 1) end |
#to_xml_string(str = +'')) ⇒ String
Serializes the object
203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 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 274 275 276 277 278 279 280 281 282 283 284 |
# File 'lib/axlsx/workbook/worksheet/pivot_table.rb', line 203 def to_xml_string(str = +'') str << '<?xml version="1.0" encoding="UTF-8"?>' str << '<pivotTableDefinition xmlns="' << XML_NS << '" name="' << name << '" cacheId="' << cache_definition.cache_id.to_s << '"' str << ' dataOnRows="1"' if data.size <= 1 str << ' rowGrandTotals="0"' if grand_totals == :col_only || grand_totals == :none str << ' colGrandTotals="0"' if grand_totals == :row_only || grand_totals == :none str << ' 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">' str << '<location firstDataCol="1" firstDataRow="1" firstHeaderRow="1" ref="' << ref << '"/>' str << '<pivotFields count="' << header_cells_count.to_s << '">' header_cell_values.each do |cell_value| subtotal = !no_subtotals_on_headers.include?(cell_value) sorttype = sort_on_headers[cell_value] str << pivot_field_for(cell_value, subtotal, sorttype) end str << '</pivotFields>' if rows.empty? str << '<rowFields count="1"><field x="-2"/></rowFields>' str << '<rowItems count="2"><i><x/></i> <i i="1"><x v="1"/></i></rowItems>' else str << '<rowFields count="' << rows.size.to_s << '">' rows.each do |row_value| str << '<field x="' << header_index_of(row_value).to_s << '"/>' end str << '</rowFields>' str << '<rowItems count="' << rows.size.to_s << '">' rows.size.times do str << '<i/>' end str << '</rowItems>' end if columns.empty? if data.size > 1 str << '<colFields count="1"><field x="-2"/></colFields>' str << "<colItems count=\"#{data.size}\">" str << '<i><x/></i>' (data.size - 1).times do |i| str << "<i i=\"#{i + 1}\"><x v=\"#{i + 1}\"/></i>" end str << '</colItems>' else str << '<colItems count="1"><i/></colItems>' end else str << '<colFields count="' << columns.size.to_s << '">' columns.each do |column_value| str << '<field x="' << header_index_of(column_value).to_s << '"/>' end str << '</colFields>' end unless pages.empty? str << '<pageFields count="' << pages.size.to_s << '">' pages.each do |page_value| str << '<pageField fld="' << header_index_of(page_value).to_s << '"/>' end str << '</pageFields>' end unless data.empty? str << "<dataFields count=\"#{data.size}\">" data.each do |datum_value| subtotal_name = datum_value[:subtotal] || 'sum' subtotal_name = 'count' if name == 'countNums' # both count & countNums are labelled as count str << "<dataField name='#{subtotal_name.capitalize} of #{datum_value[:ref]}' fld='#{header_index_of(datum_value[:ref])}' baseField='0' baseItem='0'" str << " numFmtId='#{datum_value[:num_fmt]}'" if datum_value[:num_fmt] str << " subtotal='#{datum_value[:subtotal]}' " if datum_value[:subtotal] str << "/>" end str << '</dataFields>' end # custom pivot table style unless style_info.empty? str << '<pivotTableStyleInfo' style_info.each do |k, v| str << ' ' << k.to_s << '="' << v.to_s << '"' end str << ' />' end str << '</pivotTableDefinition>' end |