mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-09-12 02:56:44 +00:00
Merge pull request #3243 from PHPOffice/Issue-3239_Load-Table-without-Filter
Allow option for disabled filtering on tables
This commit is contained in:
@@ -60,6 +60,12 @@ class TableReader
|
||||
*/
|
||||
private function readTableAutoFilter(Table $table, SimpleXMLElement $autoFilterXml): void
|
||||
{
|
||||
if ($autoFilterXml->filterColumn === null) {
|
||||
$table->setAllowFilter(false);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
foreach ($autoFilterXml->filterColumn as $filterColumn) {
|
||||
$column = $table->getColumnByOffset((int) $filterColumn['colId']);
|
||||
$column->setShowFilterButton((string) $filterColumn['hiddenButton'] !== '1');
|
||||
|
||||
@@ -47,6 +47,13 @@ class Table
|
||||
*/
|
||||
private $workSheet;
|
||||
|
||||
/**
|
||||
* Table allow filter.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
private $allowFilter = true;
|
||||
|
||||
/**
|
||||
* Table Column.
|
||||
*
|
||||
@@ -236,6 +243,26 @@ class Table
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get allow filter.
|
||||
* If false, autofiltering is disabled for the table, if true it is enabled.
|
||||
*/
|
||||
public function getAllowFilter(): bool
|
||||
{
|
||||
return $this->allowFilter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set show Autofiltering.
|
||||
* Disabling autofiltering has the same effect as hiding the filter button on all the columns in the table.
|
||||
*/
|
||||
public function setAllowFilter(bool $allowFilter): self
|
||||
{
|
||||
$this->allowFilter = $allowFilter;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Table Range.
|
||||
*/
|
||||
|
||||
@@ -47,9 +47,10 @@ class Table extends WriterPart
|
||||
[$rangeStart, $rangeEnd] = Coordinate::rangeBoundaries($table->getRange());
|
||||
|
||||
// Table Auto Filter
|
||||
if ($table->getShowHeaderRow()) {
|
||||
if ($table->getShowHeaderRow() && $table->getAllowFilter() === true) {
|
||||
$objWriter->startElement('autoFilter');
|
||||
$objWriter->writeAttribute('ref', $range);
|
||||
$objWriter->endElement();
|
||||
foreach (range($rangeStart[0], $rangeEnd[0]) as $offset => $columnIndex) {
|
||||
$column = $table->getColumnByOffset($offset);
|
||||
|
||||
@@ -63,7 +64,6 @@ class Table extends WriterPart
|
||||
AutoFilter::writeAutoFilterColumn($objWriter, $column, $offset);
|
||||
}
|
||||
}
|
||||
$objWriter->endElement();
|
||||
}
|
||||
|
||||
// Table Columns
|
||||
|
||||
@@ -9,7 +9,7 @@ use PHPUnit\Framework\TestCase;
|
||||
|
||||
class TableTest extends TestCase
|
||||
{
|
||||
public function testLoadXlsxTable(): void
|
||||
public function testLoadTable(): void
|
||||
{
|
||||
$filename = 'tests/data/Reader/XLSX/tableTest.xlsx';
|
||||
$reader = new Xlsx();
|
||||
@@ -26,6 +26,7 @@ class TableTest extends TestCase
|
||||
self::assertEquals('A1:G16', $table->getRange());
|
||||
self::assertTrue($table->getShowHeaderRow(), 'ShowHeaderRow');
|
||||
self::assertTrue($table->getShowTotalsRow(), 'ShowTotalsRow');
|
||||
self::assertTrue($table->getAllowFilter(), 'Allow Filter');
|
||||
|
||||
self::assertEquals('Total', $table->getColumn('B')->getTotalsRowLabel());
|
||||
self::assertEquals('sum', $table->getColumn('G')->getTotalsRowFunction());
|
||||
@@ -38,4 +39,20 @@ class TableTest extends TestCase
|
||||
self::assertFalse($tableStyle->getShowFirstColumn(), 'ShowFirstColumn');
|
||||
self::assertTrue($tableStyle->getShowLastColumn(), 'ShowLastColumn');
|
||||
}
|
||||
|
||||
public function testLoadTableNoFilter(): void
|
||||
{
|
||||
$filename = 'tests/data/Reader/XLSX/TableWithoutFilter.xlsx';
|
||||
$reader = new Xlsx();
|
||||
$spreadsheet = $reader->load($filename);
|
||||
|
||||
$worksheet = $spreadsheet->getActiveSheet();
|
||||
|
||||
$tables = $worksheet->getTableCollection();
|
||||
self::assertCount(1, $tables);
|
||||
|
||||
$table = $tables->offsetGet(0);
|
||||
self::assertInstanceOf(Table::class, $table);
|
||||
self::assertFalse($table->getAllowFilter(), 'Allow Filter');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
<?php
|
||||
|
||||
namespace PhpOffice\PhpSpreadsheetTests\Writer\Xlsx;
|
||||
|
||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||
use PhpOffice\PhpSpreadsheet\Worksheet\Table;
|
||||
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
|
||||
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
|
||||
|
||||
class TableTest extends AbstractFunctional
|
||||
{
|
||||
protected function populateData(Spreadsheet $spreadsheet): Table
|
||||
{
|
||||
$worksheet = $spreadsheet->getActiveSheet();
|
||||
|
||||
$tableName = 'SalesData';
|
||||
$columnFormula = "=SUM({$tableName}[[#This Row],[Q1]:[Q4]])";
|
||||
|
||||
$dataArray = [
|
||||
['Year', 'Country', 'Q1', 'Q2', 'Q3', 'Q4', 'Sales'],
|
||||
[2010, 'Belgium', 380, 390, 420, 460, $columnFormula],
|
||||
[2010, 'France', 510, 490, 460, 590, $columnFormula],
|
||||
[2010, 'Germany', 720, 680, 640, 660, $columnFormula],
|
||||
[2010, 'Italy', 440, 410, 420, 450, $columnFormula],
|
||||
[2010, 'Spain', 510, 490, 470, 420, $columnFormula],
|
||||
[2010, 'UK', 690, 610, 620, 600, $columnFormula],
|
||||
[2010, 'United States', 790, 730, 860, 850, $columnFormula],
|
||||
[2011, 'Belgium', 400, 350, 450, 500, $columnFormula],
|
||||
[2011, 'France', 620, 650, 415, 570, $columnFormula],
|
||||
[2011, 'Germany', 680, 620, 710, 690, $columnFormula],
|
||||
[2011, 'Italy', 430, 370, 350, 335, $columnFormula],
|
||||
[2011, 'Spain', 460, 390, 430, 415, $columnFormula],
|
||||
[2011, 'UK', 720, 650, 580, 510, $columnFormula],
|
||||
[2011, 'United States', 800, 700, 900, 950, $columnFormula],
|
||||
];
|
||||
|
||||
$worksheet->fromArray($dataArray, null, 'A1');
|
||||
|
||||
$rowColumnRange = "{$worksheet->getHighestDataColumn()}{$worksheet->getHighestDataRow()}";
|
||||
|
||||
$table = new Table("A1:{$rowColumnRange}", $tableName);
|
||||
$table->setRange("A1:{$rowColumnRange}");
|
||||
|
||||
$table->getColumn('G')
|
||||
->setTotalsRowLabel('Total')
|
||||
->setColumnFormula($columnFormula);
|
||||
$worksheet->getCell('A16')->setValue('Total');
|
||||
$worksheet->getCell('G16')->setValue("=SUBTOTAL(109,{$tableName}[Sales])");
|
||||
|
||||
$spreadsheet->getActiveSheet()->addTable($table);
|
||||
|
||||
return $table;
|
||||
}
|
||||
|
||||
public function testTableCreation(): void
|
||||
{
|
||||
$spreadsheet = new Spreadsheet();
|
||||
|
||||
$this->populateData($spreadsheet);
|
||||
|
||||
// TODO: We don't yet support Structured References in formulae, so we need to disable precalculation
|
||||
// when writing.
|
||||
$disablePrecalculation = function (Xlsx $writer): void {
|
||||
$writer->setPreCalculateFormulas(false);
|
||||
};
|
||||
|
||||
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx', null, $disablePrecalculation);
|
||||
$reloadedWorksheet = $reloadedSpreadsheet->getActiveSheet();
|
||||
|
||||
$reloadedTable = $reloadedWorksheet->getTableCollection()[0];
|
||||
self::assertNotNull($reloadedTable);
|
||||
}
|
||||
|
||||
public function testTableWithoutFilter(): void
|
||||
{
|
||||
$spreadsheet = new Spreadsheet();
|
||||
|
||||
$table = $this->populateData($spreadsheet);
|
||||
$table->setAllowFilter(false);
|
||||
|
||||
// TODO: We don't yet support Structured References in formulae, so we need to disable precalc when writing
|
||||
$disablePrecalculation = function (Xlsx $writer): void {
|
||||
$writer->setPreCalculateFormulas(false);
|
||||
};
|
||||
|
||||
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx', null, $disablePrecalculation);
|
||||
$reloadedWorksheet = $reloadedSpreadsheet->getActiveSheet();
|
||||
|
||||
$reloadedTable = $reloadedWorksheet->getTableCollection()[0];
|
||||
/** @var Table $reloadedTable */
|
||||
self::assertNotNull($reloadedTable);
|
||||
self::assertFalse($reloadedTable->getAllowFilter());
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Reference in New Issue
Block a user