Merge pull request #3243 from PHPOffice/Issue-3239_Load-Table-without-Filter

Allow option for disabled filtering on tables
This commit is contained in:
Mark Baker
2022-12-13 16:28:04 +01:00
committed by GitHub
6 changed files with 147 additions and 3 deletions
@@ -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');
+27
View File
@@ -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.
*/
+2 -2
View File
@@ -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.