mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-09-19 14:36:48 +00:00
6afe310f8a
Adds runnable samples under samples/PivotTable demonstrating the pivot table feature, discovered automatically by the sample browser: - 01_Create_PivotTable: build a basic pivot (row/column/value fields) from a source range and save it as Xlsx. - 02_PivotTable_Page_Filter: add a page (report filter) field. - 03_PivotTable_Grouping: group a numeric field into ranges and a date field by quarter. - 04_Read_PivotTable: write a pivot, load it back, and inspect the pivot table object model (source, row/column/page fields, value aggregation). Directory is named PivotTable to match the PascalCase convention used by the other sample categories (Table, Chart, ...).
62 lines
2.1 KiB
PHP
62 lines
2.1 KiB
PHP
<?php
|
|
|
|
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
|
use PhpOffice\PhpSpreadsheet\Worksheet\PivotTable\PivotField;
|
|
use PhpOffice\PhpSpreadsheet\Worksheet\PivotTable\PivotFieldGroup;
|
|
use PhpOffice\PhpSpreadsheet\Worksheet\PivotTable\PivotTableBuilder;
|
|
|
|
require __DIR__ . '/../Header.php';
|
|
/** @var PhpOffice\PhpSpreadsheet\Helper\Sample $helper */
|
|
|
|
$helper->log('Create new Spreadsheet object');
|
|
$spreadsheet = new Spreadsheet();
|
|
$spreadsheet->getProperties()->setTitle('PhpSpreadsheet PivotTable Grouping Sample');
|
|
|
|
$helper->log('Add source data');
|
|
$dataSheet = $spreadsheet->getActiveSheet();
|
|
$dataSheet->setTitle('Data');
|
|
$dataSheet->fromArray(
|
|
[
|
|
['Customer', 'Age', 'OrderDate', 'Amount'],
|
|
['Alice', 23, '2024-01-15', 100],
|
|
['Bob', 37, '2024-06-20', 150],
|
|
['Carol', 45, '2025-02-10', 200],
|
|
['Dan', 51, '2025-11-05', 250],
|
|
['Erin', 29, '2024-09-01', 175],
|
|
['Frank', 62, '2025-07-22', 300],
|
|
],
|
|
null,
|
|
'A1'
|
|
);
|
|
|
|
// --- Numeric range grouping: bucket Age into bands of 10 (20-30, 30-40, ...) ---
|
|
$helper->log('Build pivot table grouping Age into numeric ranges');
|
|
$agePivotSheet = $spreadsheet->createSheet();
|
|
$agePivotSheet->setTitle('ByAgeRange');
|
|
|
|
$ageBuilder = new PivotTableBuilder($dataSheet, 'A1:D7');
|
|
$ageBuilder
|
|
->groupFieldByNumericRange('Age', 10, 20, 70)
|
|
->addRowField('Age')
|
|
->addDataField('Amount', PivotField::SUBTOTAL_SUM);
|
|
$ageBuilder->build($agePivotSheet, 'A3', 'SalesByAgeRange');
|
|
|
|
// --- Date grouping: group OrderDate by quarter ---
|
|
$helper->log('Build pivot table grouping OrderDate by quarter');
|
|
$datePivotSheet = $spreadsheet->createSheet();
|
|
$datePivotSheet->setTitle('ByQuarter');
|
|
|
|
$dateBuilder = new PivotTableBuilder($dataSheet, 'A1:D7');
|
|
$dateBuilder
|
|
->groupFieldByDate('OrderDate', PivotFieldGroup::GROUP_BY_QUARTERS)
|
|
->addRowField('OrderDate')
|
|
->addDataField('Amount', PivotField::SUBTOTAL_SUM);
|
|
$dateBuilder->build($datePivotSheet, 'A3', 'SalesByQuarter');
|
|
|
|
$helper->log(
|
|
'Grouping is written into the pivot cache; the spreadsheet application '
|
|
. 'materialises the buckets when it refreshes the pivot on open.'
|
|
);
|
|
|
|
$helper->write($spreadsheet, __FILE__, ['Xlsx']);
|