AutoFilter inside Tables

Worksheet autofilter and autofilter inside tables share the
same XML structure. By taking advantage of that, I just added
a simple reference to the worksheet autofilter inside the table.

In this commit:
- Added autofilter inside tables.
- Implemented XLSX writer and reader.
- Refactored autofilter writer and reader.
- Added additional unit test.
- Fixed the broken test (testLoadOffice365AutoFilter).
This commit is contained in:
aswinkumar863 2022-05-29 19:38:43 +05:30
parent e1ab240419
commit 83feae3f35
No known key found for this signature in database
GPG Key ID: 8A69BFA6AEF8FA3E
10 changed files with 241 additions and 127 deletions

View File

@ -2260,11 +2260,6 @@ parameters:
count: 2 count: 2
path: src/PhpSpreadsheet/Reader/Xlsx.php path: src/PhpSpreadsheet/Reader/Xlsx.php
-
message: "#^Comparison operation \"\\>\" between SimpleXMLElement\\|null and 0 results in an error\\.$#"
count: 1
path: src/PhpSpreadsheet/Reader/Xlsx.php
- -
message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:boolean\\(\\) has parameter \\$value with no type specified\\.$#" message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:boolean\\(\\) has parameter \\$value with no type specified\\.$#"
count: 1 count: 1
@ -2452,17 +2447,7 @@ parameters:
- -
message: "#^Parameter \\#1 \\$operator of method PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\AutoFilter\\\\Column\\\\Rule\\:\\:setRule\\(\\) expects string, null given\\.$#" message: "#^Parameter \\#1 \\$operator of method PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\AutoFilter\\\\Column\\\\Rule\\:\\:setRule\\(\\) expects string, null given\\.$#"
count: 2 count: 4
path: src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php
-
message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\AutoFilter\\:\\:\\$worksheet has no type specified\\.$#"
count: 1
path: src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php
-
message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\AutoFilter\\:\\:\\$worksheetXml has no type specified\\.$#"
count: 1
path: src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php path: src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php
- -
@ -4827,7 +4812,7 @@ parameters:
- -
message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int given\\.$#" message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int given\\.$#"
count: 15 count: 12
path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php
- -

View File

@ -1,6 +1,7 @@
<?php <?php
use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter;
use PhpOffice\PhpSpreadsheet\Worksheet\Table; use PhpOffice\PhpSpreadsheet\Worksheet\Table;
use PhpOffice\PhpSpreadsheet\Worksheet\Table\TableStyle; use PhpOffice\PhpSpreadsheet\Worksheet\Table\TableStyle;
@ -46,16 +47,37 @@ $dataArray = [
['2011', 'Q2', 'Belgium', 350], ['2011', 'Q2', 'Belgium', 350],
['2011', 'Q3', 'Belgium', 450], ['2011', 'Q3', 'Belgium', 450],
['2011', 'Q4', 'Belgium', 500], ['2011', 'Q4', 'Belgium', 500],
['2010', 'Q1', 'UK', 690],
['2010', 'Q2', 'UK', 610],
['2010', 'Q3', 'UK', 620],
['2010', 'Q4', 'UK', 600],
['2011', 'Q1', 'UK', 720],
['2011', 'Q2', 'UK', 650],
['2011', 'Q3', 'UK', 580],
['2011', 'Q4', 'UK', 510],
['2010', 'Q1', 'France', 510],
['2010', 'Q2', 'France', 490],
['2010', 'Q3', 'France', 460],
['2010', 'Q4', 'France', 590],
['2011', 'Q1', 'France', 620],
['2011', 'Q2', 'France', 650],
['2011', 'Q3', 'France', 415],
['2011', 'Q4', 'France', 570],
]; ];
$spreadsheet->getActiveSheet()->fromArray($dataArray, null, 'A2'); $spreadsheet->getActiveSheet()->fromArray($dataArray, null, 'A2');
// Create Table // Create Table
$helper->log('Create Table'); $helper->log('Create Table');
$table = new Table('A1:D17', 'Sales_Data'); $table = new Table('A1:D33', 'Sales_Data');
// Create Columns // Create Columns
$table->getColumn('D')->setShowFilterButton(false); $table->getColumn('D')->setShowFilterButton(false);
$table->getAutoFilter()->getColumn('A')
->setFilterType(AutoFilter\Column::AUTOFILTER_FILTERTYPE_CUSTOMFILTER)
->createRule()
->setRule(AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_GREATERTHANOREQUAL, 2011)
->setRuleType(AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_CUSTOMFILTER);
// Create Table Style // Create Table Style
$helper->log('Create Table Style'); $helper->log('Create Table Style');

View File

@ -4,18 +4,28 @@ namespace PhpOffice\PhpSpreadsheet\Reader\Xlsx;
use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column; use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column;
use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule; use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule;
use PhpOffice\PhpSpreadsheet\Worksheet\Table;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
use SimpleXMLElement; use SimpleXMLElement;
class AutoFilter class AutoFilter
{ {
private $worksheet; /**
* @var Table|Worksheet
*/
private $parent;
/**
* @var SimpleXMLElement
*/
private $worksheetXml; private $worksheetXml;
public function __construct(Worksheet $workSheet, SimpleXMLElement $worksheetXml) /**
* @param Table|Worksheet $parent
*/
public function __construct($parent, SimpleXMLElement $worksheetXml)
{ {
$this->worksheet = $workSheet; $this->parent = $parent;
$this->worksheetXml = $worksheetXml; $this->worksheetXml = $worksheetXml;
} }
@ -30,7 +40,7 @@ class AutoFilter
private function readAutoFilter($autoFilterRange, $xmlSheet): void private function readAutoFilter($autoFilterRange, $xmlSheet): void
{ {
$autoFilter = $this->worksheet->getAutoFilter(); $autoFilter = $this->parent->getAutoFilter();
$autoFilter->setRange($autoFilterRange); $autoFilter->setRange($autoFilterRange);
foreach ($xmlSheet->autoFilter->filterColumn as $filterColumn) { foreach ($xmlSheet->autoFilter->filterColumn as $filterColumn) {

View File

@ -51,6 +51,7 @@ class TableReader
$this->readTableColumns($table, $tableXml->tableColumns); $this->readTableColumns($table, $tableXml->tableColumns);
$this->readTableStyle($table, $tableXml->tableStyleInfo); $this->readTableStyle($table, $tableXml->tableStyleInfo);
(new AutoFilter($table, $tableXml))->load();
$this->worksheet->addTable($table); $this->worksheet->addTable($table);
} }
@ -70,8 +71,9 @@ class TableReader
*/ */
private function readTableColumns(Table $table, SimpleXMLElement $tableColumnsXml): void private function readTableColumns(Table $table, SimpleXMLElement $tableColumnsXml): void
{ {
$offset = 0;
foreach ($tableColumnsXml->tableColumn as $tableColumn) { foreach ($tableColumnsXml->tableColumn as $tableColumn) {
$column = $table->getColumnByOffset((int) $tableColumn['id'] - 1); $column = $table->getColumnByOffset($offset++);
if ($table->getShowTotalsRow()) { if ($table->getShowTotalsRow()) {
if ($tableColumn['totalsRowLabel']) { if ($tableColumn['totalsRowLabel']) {

View File

@ -59,6 +59,13 @@ class Table
*/ */
private $style; private $style;
/**
* Table AutoFilter.
*
* @var AutoFilter
*/
private $autoFilter;
/** /**
* Create a new Table. * Create a new Table.
* *
@ -70,9 +77,10 @@ class Table
*/ */
public function __construct($range = '', string $name = '') public function __construct($range = '', string $name = '')
{ {
$this->style = new TableStyle();
$this->autoFilter = new AutoFilter($range);
$this->setRange($range); $this->setRange($range);
$this->setName($name); $this->setName($name);
$this->style = new TableStyle();
} }
/** /**
@ -193,6 +201,8 @@ class Table
} }
$this->range = $range; $this->range = $range;
$this->autoFilter->setRange($range);
// Discard any column ruless that are no longer valid within this range // Discard any column ruless that are no longer valid within this range
[$rangeStart, $rangeEnd] = Coordinate::rangeBoundaries($this->range); [$rangeStart, $rangeEnd] = Coordinate::rangeBoundaries($this->range);
foreach ($this->columns as $key => $value) { foreach ($this->columns as $key => $value) {
@ -248,6 +258,7 @@ class Table
} }
$this->workSheet = $worksheet; $this->workSheet = $worksheet;
$this->autoFilter->setParent($worksheet);
return $this; return $this;
} }
@ -415,6 +426,24 @@ class Table
return $this; return $this;
} }
/**
* Get AutoFilter.
*/
public function getAutoFilter(): AutoFilter
{
return $this->autoFilter;
}
/**
* Set AutoFilter.
*/
public function setAutoFilter(AutoFilter $autoFilter): self
{
$this->autoFilter = $autoFilter;
return $this;
}
/** /**
* Implement PHP __clone to create a deep clone, not just a shallow copy. * Implement PHP __clone to create a deep clone, not just a shallow copy.
*/ */

View File

@ -0,0 +1,117 @@
<?php
namespace PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\Shared\XMLWriter;
use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column;
use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
class AutoFilter extends WriterPart
{
/**
* Write AutoFilter.
*/
public static function writeAutoFilter(XMLWriter $objWriter, Worksheet $worksheet): void
{
$autoFilterRange = $worksheet->getAutoFilter()->getRange();
if (!empty($autoFilterRange)) {
// autoFilter
$objWriter->startElement('autoFilter');
// Strip any worksheet reference from the filter coordinates
$range = Coordinate::splitRange($autoFilterRange);
$range = $range[0];
// Strip any worksheet ref
[$ws, $range[0]] = Worksheet::extractSheetTitle($range[0], true);
$range = implode(':', $range);
$objWriter->writeAttribute('ref', str_replace('$', '', $range));
$columns = $worksheet->getAutoFilter()->getColumns();
if (count($columns) > 0) {
foreach ($columns as $columnID => $column) {
$colId = $worksheet->getAutoFilter()->getColumnOffset($columnID);
self::writeAutoFilterColumn($objWriter, $column, $colId);
}
}
$objWriter->endElement();
}
}
/**
* Write AutoFilter's filterColumn.
*/
public static function writeAutoFilterColumn(XMLWriter $objWriter, Column $column, int $colId): void
{
$rules = $column->getRules();
if (count($rules) > 0) {
$objWriter->startElement('filterColumn');
$objWriter->writeAttribute('colId', "$colId");
$objWriter->startElement($column->getFilterType());
if ($column->getJoin() == Column::AUTOFILTER_COLUMN_JOIN_AND) {
$objWriter->writeAttribute('and', '1');
}
foreach ($rules as $rule) {
if (
($column->getFilterType() === Column::AUTOFILTER_FILTERTYPE_FILTER) &&
($rule->getOperator() === Rule::AUTOFILTER_COLUMN_RULE_EQUAL) &&
($rule->getValue() === '')
) {
// Filter rule for Blanks
$objWriter->writeAttribute('blank', '1');
} elseif ($rule->getRuleType() === Rule::AUTOFILTER_RULETYPE_DYNAMICFILTER) {
// Dynamic Filter Rule
$objWriter->writeAttribute('type', $rule->getGrouping());
$val = $column->getAttribute('val');
if ($val !== null) {
$objWriter->writeAttribute('val', "$val");
}
$maxVal = $column->getAttribute('maxVal');
if ($maxVal !== null) {
$objWriter->writeAttribute('maxVal', "$maxVal");
}
} elseif ($rule->getRuleType() === Rule::AUTOFILTER_RULETYPE_TOPTENFILTER) {
// Top 10 Filter Rule
$ruleValue = $rule->getValue();
if (!is_array($ruleValue)) {
$objWriter->writeAttribute('val', "$ruleValue");
}
$objWriter->writeAttribute('percent', (($rule->getOperator() === Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT) ? '1' : '0'));
$objWriter->writeAttribute('top', (($rule->getGrouping() === Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP) ? '1' : '0'));
} else {
// Filter, DateGroupItem or CustomFilter
$objWriter->startElement($rule->getRuleType());
if ($rule->getOperator() !== Rule::AUTOFILTER_COLUMN_RULE_EQUAL) {
$objWriter->writeAttribute('operator', $rule->getOperator());
}
if ($rule->getRuleType() === Rule::AUTOFILTER_RULETYPE_DATEGROUP) {
// Date Group filters
$ruleValue = $rule->getValue();
if (is_array($ruleValue)) {
foreach ($ruleValue as $key => $value) {
$objWriter->writeAttribute($key, "$value");
}
}
$objWriter->writeAttribute('dateTimeGrouping', $rule->getGrouping());
} else {
$ruleValue = $rule->getValue();
if (!is_array($ruleValue)) {
$objWriter->writeAttribute('val', "$ruleValue");
}
}
$objWriter->endElement();
}
}
$objWriter->endElement();
$objWriter->endElement();
}
}
}

View File

@ -57,6 +57,9 @@ class Table extends WriterPart
$objWriter->writeAttribute('colId', (string) $offset); $objWriter->writeAttribute('colId', (string) $offset);
$objWriter->writeAttribute('hiddenButton', '1'); $objWriter->writeAttribute('hiddenButton', '1');
$objWriter->endElement(); $objWriter->endElement();
} else {
$column = $table->getAutoFilter()->getColumnByOffset($offset);
AutoFilter::writeAutoFilterColumn($objWriter, $column, $offset);
} }
} }
$objWriter->endElement(); $objWriter->endElement();

View File

@ -3,7 +3,6 @@
namespace PhpOffice\PhpSpreadsheet\Writer\Xlsx; namespace PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Calculation\Information\ErrorValue; use PhpOffice\PhpSpreadsheet\Calculation\Information\ErrorValue;
use PhpOffice\PhpSpreadsheet\Calculation\Information\Value;
use PhpOffice\PhpSpreadsheet\Cell\Cell; use PhpOffice\PhpSpreadsheet\Cell\Cell;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate; use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
use PhpOffice\PhpSpreadsheet\RichText\RichText; use PhpOffice\PhpSpreadsheet\RichText\RichText;
@ -13,8 +12,6 @@ use PhpOffice\PhpSpreadsheet\Shared\XMLWriter;
use PhpOffice\PhpSpreadsheet\Style\Conditional; use PhpOffice\PhpSpreadsheet\Style\Conditional;
use PhpOffice\PhpSpreadsheet\Style\ConditionalFormatting\ConditionalDataBar; use PhpOffice\PhpSpreadsheet\Style\ConditionalFormatting\ConditionalDataBar;
use PhpOffice\PhpSpreadsheet\Style\ConditionalFormatting\ConditionalFormattingRuleExtension; use PhpOffice\PhpSpreadsheet\Style\ConditionalFormatting\ConditionalFormattingRuleExtension;
use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column;
use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule;
use PhpOffice\PhpSpreadsheet\Worksheet\SheetView; use PhpOffice\PhpSpreadsheet\Worksheet\SheetView;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet as PhpspreadsheetWorksheet; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet as PhpspreadsheetWorksheet;
@ -154,6 +151,14 @@ class Worksheet extends WriterPart
$worksheet->getAutoFilter()->showHideRows(); $worksheet->getAutoFilter()->showHideRows();
} }
} }
$tables = $worksheet->getTableCollection();
if (count($tables)) {
foreach ($tables as $table) {
if (!$table->getAutoFilter()->getEvaluated()) {
$table->getAutoFilter()->showHideRows();
}
}
}
// tabColor // tabColor
if ($worksheet->isTabColorSet()) { if ($worksheet->isTabColorSet()) {
@ -905,95 +910,7 @@ class Worksheet extends WriterPart
*/ */
private function writeAutoFilter(XMLWriter $objWriter, PhpspreadsheetWorksheet $worksheet): void private function writeAutoFilter(XMLWriter $objWriter, PhpspreadsheetWorksheet $worksheet): void
{ {
$autoFilterRange = $worksheet->getAutoFilter()->getRange(); AutoFilter::writeAutoFilter($objWriter, $worksheet);
if (!empty($autoFilterRange)) {
// autoFilter
$objWriter->startElement('autoFilter');
// Strip any worksheet reference from the filter coordinates
$range = Coordinate::splitRange($autoFilterRange);
$range = $range[0];
// Strip any worksheet ref
[$ws, $range[0]] = PhpspreadsheetWorksheet::extractSheetTitle($range[0], true);
$range = implode(':', $range);
$objWriter->writeAttribute('ref', str_replace('$', '', $range));
$columns = $worksheet->getAutoFilter()->getColumns();
if (count($columns) > 0) {
foreach ($columns as $columnID => $column) {
$rules = $column->getRules();
if (count($rules) > 0) {
$objWriter->startElement('filterColumn');
$objWriter->writeAttribute('colId', $worksheet->getAutoFilter()->getColumnOffset($columnID));
$objWriter->startElement($column->getFilterType());
if ($column->getJoin() == Column::AUTOFILTER_COLUMN_JOIN_AND) {
$objWriter->writeAttribute('and', 1);
}
foreach ($rules as $rule) {
if (
($column->getFilterType() === Column::AUTOFILTER_FILTERTYPE_FILTER) &&
($rule->getOperator() === Rule::AUTOFILTER_COLUMN_RULE_EQUAL) &&
($rule->getValue() === '')
) {
// Filter rule for Blanks
$objWriter->writeAttribute('blank', 1);
} elseif ($rule->getRuleType() === Rule::AUTOFILTER_RULETYPE_DYNAMICFILTER) {
// Dynamic Filter Rule
$objWriter->writeAttribute('type', $rule->getGrouping());
$val = $column->getAttribute('val');
if ($val !== null) {
$objWriter->writeAttribute('val', "$val");
}
$maxVal = $column->getAttribute('maxVal');
if ($maxVal !== null) {
$objWriter->writeAttribute('maxVal', "$maxVal");
}
} elseif ($rule->getRuleType() === Rule::AUTOFILTER_RULETYPE_TOPTENFILTER) {
// Top 10 Filter Rule
$ruleValue = $rule->getValue();
if (!is_array($ruleValue)) {
$objWriter->writeAttribute('val', "$ruleValue");
}
$objWriter->writeAttribute('percent', (($rule->getOperator() === Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT) ? '1' : '0'));
$objWriter->writeAttribute('top', (($rule->getGrouping() === Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP) ? '1' : '0'));
} else {
// Filter, DateGroupItem or CustomFilter
$objWriter->startElement($rule->getRuleType());
if ($rule->getOperator() !== Rule::AUTOFILTER_COLUMN_RULE_EQUAL) {
$objWriter->writeAttribute('operator', $rule->getOperator());
}
if ($rule->getRuleType() === Rule::AUTOFILTER_RULETYPE_DATEGROUP) {
// Date Group filters
$ruleValue = $rule->getValue();
if (is_array($ruleValue)) {
foreach ($ruleValue as $key => $value) {
$objWriter->writeAttribute($key, "$value");
}
}
$objWriter->writeAttribute('dateTimeGrouping', $rule->getGrouping());
} else {
$ruleValue = $rule->getValue();
if (!is_array($ruleValue)) {
$objWriter->writeAttribute('val', "$ruleValue");
}
}
$objWriter->endElement();
}
}
$objWriter->endElement();
$objWriter->endElement();
}
}
}
$objWriter->endElement();
}
} }
/** /**

View File

@ -4,6 +4,7 @@ namespace PhpOffice\PhpSpreadsheetTests\Features\AutoFilter\Xlsx;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx; use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule; use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule;
use PhpOffice\PhpSpreadsheet\Worksheet\Table;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
class BasicLoadTest extends TestCase class BasicLoadTest extends TestCase
@ -47,28 +48,34 @@ class BasicLoadTest extends TestCase
$spreadsheet = $reader->load($filename); $spreadsheet = $reader->load($filename);
$worksheet = $spreadsheet->getActiveSheet(); $worksheet = $spreadsheet->getActiveSheet();
self::assertSame('A1:D57', $worksheet->getAutoFilter()->getRange()); $tables = $worksheet->getTableCollection();
self::assertSame(2, $worksheet->getAutoFilter()->getColumn('C')->ruleCount()); self::assertCount(1, $tables);
$table = $tables->offsetGet(0);
self::assertInstanceOf(Table::class, $table);
self::assertSame('A1:D57', $table->getAutoFilter()->getRange());
self::assertSame(2, $table->getAutoFilter()->getColumn('C')->ruleCount());
self::assertSame( self::assertSame(
Rule::AUTOFILTER_COLUMN_RULE_EQUAL, Rule::AUTOFILTER_COLUMN_RULE_EQUAL,
$worksheet->getAutoFilter()->getColumn('C')->getRules()[0]->getOperator() $table->getAutoFilter()->getColumn('C')->getRules()[0]->getOperator()
); );
self::assertSame('UK', $worksheet->getAutoFilter()->getColumn('C')->getRules()[0]->getValue()); self::assertSame('UK', $table->getAutoFilter()->getColumn('C')->getRules()[0]->getValue());
self::assertSame( self::assertSame(
Rule::AUTOFILTER_COLUMN_RULE_EQUAL, Rule::AUTOFILTER_COLUMN_RULE_EQUAL,
$worksheet->getAutoFilter()->getColumn('C')->getRules()[1]->getOperator() $table->getAutoFilter()->getColumn('C')->getRules()[1]->getOperator()
); );
self::assertSame('United States', $worksheet->getAutoFilter()->getColumn('C')->getRules()[1]->getValue()); self::assertSame('United States', $table->getAutoFilter()->getColumn('C')->getRules()[1]->getValue());
self::assertSame(2, $worksheet->getAutoFilter()->getColumn('D')->ruleCount()); self::assertSame(2, $table->getAutoFilter()->getColumn('D')->ruleCount());
self::assertSame( self::assertSame(
Rule::AUTOFILTER_COLUMN_RULE_GREATERTHAN, Rule::AUTOFILTER_COLUMN_RULE_GREATERTHAN,
$worksheet->getAutoFilter()->getColumn('D')->getRules()[0]->getOperator() $table->getAutoFilter()->getColumn('D')->getRules()[0]->getOperator()
); );
self::assertSame('650', $worksheet->getAutoFilter()->getColumn('D')->getRules()[0]->getValue()); self::assertSame('650', $table->getAutoFilter()->getColumn('D')->getRules()[0]->getValue());
self::assertSame( self::assertSame(
Rule::AUTOFILTER_COLUMN_RULE_LESSTHAN, Rule::AUTOFILTER_COLUMN_RULE_LESSTHAN,
$worksheet->getAutoFilter()->getColumn('D')->getRules()[1]->getOperator() $table->getAutoFilter()->getColumn('D')->getRules()[1]->getOperator()
); );
self::assertSame('800', $worksheet->getAutoFilter()->getColumn('D')->getRules()[1]->getValue()); self::assertSame('800', $table->getAutoFilter()->getColumn('D')->getRules()[1]->getValue());
} }
} }

View File

@ -5,6 +5,7 @@ namespace PhpOffice\PhpSpreadsheetTests\Worksheet\Table;
use PhpOffice\PhpSpreadsheet\Cell\CellAddress; use PhpOffice\PhpSpreadsheet\Cell\CellAddress;
use PhpOffice\PhpSpreadsheet\Cell\CellRange; use PhpOffice\PhpSpreadsheet\Cell\CellRange;
use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException; use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException;
use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter;
use PhpOffice\PhpSpreadsheet\Worksheet\Table; use PhpOffice\PhpSpreadsheet\Worksheet\Table;
use PhpOffice\PhpSpreadsheet\Worksheet\Table\Column; use PhpOffice\PhpSpreadsheet\Worksheet\Table\Column;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
@ -555,4 +556,25 @@ class TableTest extends SetupTeardown
self::assertArrayHasKey('L', $columns); self::assertArrayHasKey('L', $columns);
self::assertArrayHasKey('M', $columns); self::assertArrayHasKey('M', $columns);
} }
public function testAutoFilterRule(): void
{
$table = new Table(self::INITIAL_RANGE);
$columnFilter = $table->getAutoFilter()->getColumn('H');
$columnFilter->setFilterType(AutoFilter\Column::AUTOFILTER_FILTERTYPE_FILTER);
$columnFilter->createRule()
->setRule(
AutoFilter\Column\Rule::AUTOFILTER_COLUMN_RULE_EQUAL,
3
);
$autoFilterRuleObject = new AutoFilter\Column\Rule($columnFilter);
self::assertEquals(AutoFilter\Column\Rule::AUTOFILTER_RULETYPE_FILTER, $autoFilterRuleObject->getRuleType());
$ruleParent = $autoFilterRuleObject->getParent();
if ($ruleParent === null) {
self::fail('Unexpected null parent');
} else {
self::assertEquals('H', $ruleParent->getColumnIndex());
self::assertSame($columnFilter, $ruleParent);
}
}
} }