mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-09-27 03:15:21 +00:00
5aa558b6d6
Adds the ability to create a new pivot table from a range of source data, building on the existing read model and round-trip preservation. New Worksheet\PivotTable\PivotTableBuilder provides a fluent API: point it at a source worksheet and range (its first row supplies the field names), place fields on the row/column axes and add value fields with an aggregation function, then build() produces a PivotTable and registers it on a target sheet. Source field names are resolved from the header row (RichText/inline string headers included), and distinct values are collected for the cache definition's sharedItems. The model gains what generation needs: PivotTable::isGenerated(), per-field data-field captions, subtotal-function constants on PivotField, and sharedItems on PivotCacheDefinition. Writer: a new Writer\Xlsx\PivotTable generates the pivotTableDefinition, pivotCacheDefinition (with refreshOnLoad set) and an empty pivotCacheRecords part, plus their rels. On save, generated pivot tables are assigned indices that continue past any preserved pivot parts (so a workbook can mix loaded and new pivots without collision) and are wired into the worksheet relationships, workbook <pivotCaches> registry, workbook relationships and content types via the same unparsed-data path used for preservation. Values are computed by the spreadsheet application on open via refresh-on-load, so we don't reimplement the aggregation engine. Output is a structurally consistent OPC package and reads back into the object model. Tests cover building, validation errors, the generated parts and wiring, aggregation attributes, and mixing preserved with generated pivots.