From dac59ea79e0dc5aa32df2f2f49ead31e9675c86c Mon Sep 17 00:00:00 2001 From: aswinkumar863 Date: Sun, 15 May 2022 13:30:54 +0530 Subject: [PATCH 1/4] Load Table with XLSX Reader --- phpstan-baseline.neon | 5 - src/PhpSpreadsheet/Reader/Xlsx.php | 29 +++-- .../Reader/Xlsx/TableReader.php | 105 ++++++++++++++++++ .../Reader/Xlsx/TableTest.php | 41 +++++++ tests/data/Reader/XLSX/tableTest.xlsx | Bin 0 -> 10339 bytes 5 files changed, 164 insertions(+), 16 deletions(-) create mode 100644 src/PhpSpreadsheet/Reader/Xlsx/TableReader.php create mode 100644 tests/PhpSpreadsheetTests/Reader/Xlsx/TableTest.php create mode 100644 tests/data/Reader/XLSX/tableTest.xlsx diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 74087f44d5..3989e2cff1 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -2395,11 +2395,6 @@ parameters: count: 2 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 no return type specified\\.$#" count: 1 diff --git a/src/PhpSpreadsheet/Reader/Xlsx.php b/src/PhpSpreadsheet/Reader/Xlsx.php index a6e7fe03aa..166d9576f6 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx.php +++ b/src/PhpSpreadsheet/Reader/Xlsx.php @@ -19,6 +19,7 @@ use PhpOffice\PhpSpreadsheet\Reader\Xlsx\SheetViewOptions; use PhpOffice\PhpSpreadsheet\Reader\Xlsx\SheetViews; use PhpOffice\PhpSpreadsheet\Reader\Xlsx\Styles; +use PhpOffice\PhpSpreadsheet\Reader\Xlsx\TableReader; use PhpOffice\PhpSpreadsheet\Reader\Xlsx\Theme; use PhpOffice\PhpSpreadsheet\Reader\Xlsx\WorkbookView; use PhpOffice\PhpSpreadsheet\ReferenceHelper; @@ -874,7 +875,8 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet } if ($this->readDataOnly === false) { - $this->readAutoFilterTables($xmlSheet, $docSheet, $dir, $fileWorksheet, $zip); + $this->readAutoFilter($xmlSheet, $docSheet); + $this->readTables($xmlSheet, $docSheet, $dir, $fileWorksheet, $zip); } if ($xmlSheet && $xmlSheet->mergeCells && $xmlSheet->mergeCells->mergeCell && !$this->readDataOnly) { @@ -1983,23 +1985,28 @@ private function readSheetProtection(Worksheet $docSheet, SimpleXMLElement $xmlS } } - private function readAutoFilterTables( + private function readAutoFilter( + SimpleXMLElement $xmlSheet, + Worksheet $docSheet + ): void { + if ($xmlSheet && $xmlSheet->autoFilter) { + (new AutoFilter($docSheet, $xmlSheet))->load(); + } + } + + private function readTables( SimpleXMLElement $xmlSheet, Worksheet $docSheet, string $dir, string $fileWorksheet, ZipArchive $zip ): void { - if ($xmlSheet && $xmlSheet->autoFilter) { - // In older files, autofilter structure is defined in the worksheet file - (new AutoFilter($docSheet, $xmlSheet))->load(); - } elseif ($xmlSheet && $xmlSheet->tableParts && $xmlSheet->tableParts['count'] > 0) { - // But for Office365, MS decided to make it all just a bit more complicated - $this->readAutoFilterTablesInTablesFile($xmlSheet, $dir, $fileWorksheet, $zip, $docSheet); + if ($xmlSheet && $xmlSheet->tableParts && (int) $xmlSheet->tableParts['count'] > 0) { + $this->readTablesInTablesFile($xmlSheet, $dir, $fileWorksheet, $zip, $docSheet); } } - private function readAutoFilterTablesInTablesFile( + private function readTablesInTablesFile( SimpleXMLElement $xmlSheet, string $dir, string $fileWorksheet, @@ -2022,8 +2029,8 @@ private function readAutoFilterTablesInTablesFile( $relationshipFilePath = File::realpath($relationshipFilePath); if ($this->fileExistsInArchive($this->zip, $relationshipFilePath)) { - $autoFilter = $this->loadZip($relationshipFilePath); - (new AutoFilter($docSheet, $autoFilter))->load(); + $tableXml = $this->loadZip($relationshipFilePath); + (new TableReader($docSheet, $tableXml))->load(); } } } diff --git a/src/PhpSpreadsheet/Reader/Xlsx/TableReader.php b/src/PhpSpreadsheet/Reader/Xlsx/TableReader.php new file mode 100644 index 0000000000..e2c06da0d7 --- /dev/null +++ b/src/PhpSpreadsheet/Reader/Xlsx/TableReader.php @@ -0,0 +1,105 @@ +worksheet = $workSheet; + $this->tableXml = $tableXml; + } + + /** + * Loads Table into the Worksheet. + */ + public function load(): void + { + // Remove all "$" in the table range + $tableRange = (string) preg_replace('/\$/', '', $this->tableXml['ref'] ?? ''); + if (strpos($tableRange, ':') !== false) { + $this->readTable($tableRange, $this->tableXml); + } + } + + /** + * Read Table from xml. + */ + private function readTable(string $tableRange, SimpleXMLElement $tableXml): void + { + $table = new Table($tableRange); + $table->setName((string) $tableXml['displayName']); + $table->setShowHeaderRow((string) $tableXml['headerRowCount'] !== '0'); + $table->setShowTotalsRow((string) $tableXml['totalsRowCount'] === '1'); + + $this->readTableAutoFilter($table, $tableXml->autoFilter); + $this->readTableColumns($table, $tableXml->tableColumns); + $this->readTableStyle($table, $tableXml->tableStyleInfo); + + $this->worksheet->addTable($table); + } + + /** + * Reads TableAutoFilter from xml. + */ + private function readTableAutoFilter(Table $table, SimpleXMLElement $autoFilterXml): void + { + foreach ($autoFilterXml->filterColumn as $filterColumn) { + $column = $table->getColumnByOffset((int) $filterColumn['colId']); + $column->setShowFilterButton((string) $filterColumn['hiddenButton'] !== '1'); + } + } + + /** + * Reads TableColumns from xml. + */ + private function readTableColumns(Table $table, SimpleXMLElement $tableColumnsXml): void + { + foreach ($tableColumnsXml->tableColumn as $tableColumn) { + $column = $table->getColumnByOffset((int) $tableColumn['id'] - 1); + + if ($table->getShowTotalsRow()) { + if ($tableColumn['totalsRowLabel']) { + $column->setTotalsRowLabel((string) $tableColumn['totalsRowLabel']); + } + + if ($tableColumn['totalsRowFunction']) { + $column->setTotalsRowFunction((string) $tableColumn['totalsRowFunction']); + } + } + + if ($tableColumn->calculatedColumnFormula) { + $column->setColumnFormula((string) $tableColumn->calculatedColumnFormula); + } + } + } + + /** + * Reads TableStyle from xml. + */ + private function readTableStyle(Table $table, SimpleXMLElement $tableStyleInfoXml): void + { + $tableStyle = new TableStyle(); + $tableStyle->setTheme((string) $tableStyleInfoXml['name']); + $tableStyle->setShowRowStripes((string) $tableStyleInfoXml['showRowStripes'] === '1'); + $tableStyle->setShowColumnStripes((string) $tableStyleInfoXml['showColumnStripes'] === '1'); + $tableStyle->setShowFirstColumn((string) $tableStyleInfoXml['showFirstColumn'] === '1'); + $tableStyle->setShowLastColumn((string) $tableStyleInfoXml['showLastColumn'] === '1'); + $table->setStyle($tableStyle); + } +} diff --git a/tests/PhpSpreadsheetTests/Reader/Xlsx/TableTest.php b/tests/PhpSpreadsheetTests/Reader/Xlsx/TableTest.php new file mode 100644 index 0000000000..73e8d11123 --- /dev/null +++ b/tests/PhpSpreadsheetTests/Reader/Xlsx/TableTest.php @@ -0,0 +1,41 @@ +load($filename); + + $worksheet = $spreadsheet->getActiveSheet(); + + $tables = $worksheet->getTableCollection(); + self::assertCount(1, $tables); + + $table = $tables->offsetGet(0); + self::assertInstanceOf(Table::class, $table); + self::assertEquals('SalesData', $table->getName()); + self::assertEquals('A1:G16', $table->getRange()); + self::assertTrue($table->getShowHeaderRow(), 'ShowHeaderRow'); + self::assertTrue($table->getShowTotalsRow(), 'ShowTotalsRow'); + + self::assertEquals('Total', $table->getColumn('B')->getTotalsRowLabel()); + self::assertEquals('sum', $table->getColumn('G')->getTotalsRowFunction()); + self::assertEquals('SUM(SalesData[[#This Row],[Q1]:[Q4]])', $table->getColumn('G')->getColumnFormula()); + + $tableStyle = $table->getStyle(); + self::assertEquals(TableStyle::TABLE_STYLE_MEDIUM4, $tableStyle->getTheme()); + self::assertTrue($tableStyle->getShowRowStripes(), 'ShowRowStripes'); + self::assertFalse($tableStyle->getShowColumnStripes(), 'ShowColumnStripes'); + self::assertFalse($tableStyle->getShowFirstColumn(), 'ShowFirstColumn'); + self::assertTrue($tableStyle->getShowLastColumn(), 'ShowLastColumn'); + } +} diff --git a/tests/data/Reader/XLSX/tableTest.xlsx b/tests/data/Reader/XLSX/tableTest.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c707c9e7ab5e3ae2038e10726748b06c4486cb83 GIT binary patch literal 10339 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 literal 0 HcmV?d00001 From 83feae3f351c52b725cd784ce1323a5caeffe20d Mon Sep 17 00:00:00 2001 From: aswinkumar863 Date: Sun, 29 May 2022 19:38:43 +0530 Subject: [PATCH 2/4] 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). --- phpstan-baseline.neon | 19 +-- samples/Table/01_Table.php | 24 +++- src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php | 18 ++- .../Reader/Xlsx/TableReader.php | 4 +- src/PhpSpreadsheet/Worksheet/Table.php | 31 ++++- src/PhpSpreadsheet/Writer/Xlsx/AutoFilter.php | 117 ++++++++++++++++++ src/PhpSpreadsheet/Writer/Xlsx/Table.php | 3 + src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php | 101 ++------------- .../AutoFilter/Xlsx/BasicLoadTest.php | 29 +++-- .../Worksheet/Table/TableTest.php | 22 ++++ 10 files changed, 241 insertions(+), 127 deletions(-) create mode 100644 src/PhpSpreadsheet/Writer/Xlsx/AutoFilter.php diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 778090a872..200dd26bca 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -2260,11 +2260,6 @@ parameters: count: 2 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\\.$#" count: 1 @@ -2452,17 +2447,7 @@ parameters: - message: "#^Parameter \\#1 \\$operator of method PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\AutoFilter\\\\Column\\\\Rule\\:\\:setRule\\(\\) expects string, null given\\.$#" - count: 2 - 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 + count: 4 path: src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php - @@ -4827,7 +4812,7 @@ parameters: - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int given\\.$#" - count: 15 + count: 12 path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - diff --git a/samples/Table/01_Table.php b/samples/Table/01_Table.php index 476f187cc3..eebd60d1c1 100644 --- a/samples/Table/01_Table.php +++ b/samples/Table/01_Table.php @@ -1,6 +1,7 @@ getActiveSheet()->fromArray($dataArray, null, 'A2'); // Create Table $helper->log('Create Table'); -$table = new Table('A1:D17', 'Sales_Data'); +$table = new Table('A1:D33', 'Sales_Data'); // Create Columns $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 $helper->log('Create Table Style'); diff --git a/src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php b/src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php index 374da9f633..77c36f7b46 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php +++ b/src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php @@ -4,18 +4,28 @@ use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column; use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule; +use PhpOffice\PhpSpreadsheet\Worksheet\Table; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; use SimpleXMLElement; class AutoFilter { - private $worksheet; + /** + * @var Table|Worksheet + */ + private $parent; + /** + * @var SimpleXMLElement + */ 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; } @@ -30,7 +40,7 @@ public function load(): void private function readAutoFilter($autoFilterRange, $xmlSheet): void { - $autoFilter = $this->worksheet->getAutoFilter(); + $autoFilter = $this->parent->getAutoFilter(); $autoFilter->setRange($autoFilterRange); foreach ($xmlSheet->autoFilter->filterColumn as $filterColumn) { diff --git a/src/PhpSpreadsheet/Reader/Xlsx/TableReader.php b/src/PhpSpreadsheet/Reader/Xlsx/TableReader.php index e2c06da0d7..13df1c257c 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx/TableReader.php +++ b/src/PhpSpreadsheet/Reader/Xlsx/TableReader.php @@ -51,6 +51,7 @@ private function readTable(string $tableRange, SimpleXMLElement $tableXml): void $this->readTableColumns($table, $tableXml->tableColumns); $this->readTableStyle($table, $tableXml->tableStyleInfo); + (new AutoFilter($table, $tableXml))->load(); $this->worksheet->addTable($table); } @@ -70,8 +71,9 @@ private function readTableAutoFilter(Table $table, SimpleXMLElement $autoFilterX */ private function readTableColumns(Table $table, SimpleXMLElement $tableColumnsXml): void { + $offset = 0; foreach ($tableColumnsXml->tableColumn as $tableColumn) { - $column = $table->getColumnByOffset((int) $tableColumn['id'] - 1); + $column = $table->getColumnByOffset($offset++); if ($table->getShowTotalsRow()) { if ($tableColumn['totalsRowLabel']) { diff --git a/src/PhpSpreadsheet/Worksheet/Table.php b/src/PhpSpreadsheet/Worksheet/Table.php index ffdbf9a780..e2da5c4ff6 100644 --- a/src/PhpSpreadsheet/Worksheet/Table.php +++ b/src/PhpSpreadsheet/Worksheet/Table.php @@ -59,6 +59,13 @@ class Table */ private $style; + /** + * Table AutoFilter. + * + * @var AutoFilter + */ + private $autoFilter; + /** * Create a new Table. * @@ -70,9 +77,10 @@ class Table */ public function __construct($range = '', string $name = '') { + $this->style = new TableStyle(); + $this->autoFilter = new AutoFilter($range); $this->setRange($range); $this->setName($name); - $this->style = new TableStyle(); } /** @@ -193,6 +201,8 @@ public function setRange($range = ''): self } $this->range = $range; + $this->autoFilter->setRange($range); + // Discard any column ruless that are no longer valid within this range [$rangeStart, $rangeEnd] = Coordinate::rangeBoundaries($this->range); foreach ($this->columns as $key => $value) { @@ -248,6 +258,7 @@ public function setWorksheet(?Worksheet $worksheet = null): self } $this->workSheet = $worksheet; + $this->autoFilter->setParent($worksheet); return $this; } @@ -415,6 +426,24 @@ public function setStyle(TableStyle $style): self 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. */ diff --git a/src/PhpSpreadsheet/Writer/Xlsx/AutoFilter.php b/src/PhpSpreadsheet/Writer/Xlsx/AutoFilter.php new file mode 100644 index 0000000000..8b0f8884a0 --- /dev/null +++ b/src/PhpSpreadsheet/Writer/Xlsx/AutoFilter.php @@ -0,0 +1,117 @@ +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(); + } + } +} diff --git a/src/PhpSpreadsheet/Writer/Xlsx/Table.php b/src/PhpSpreadsheet/Writer/Xlsx/Table.php index 67dbd19bd8..a974c6cbff 100644 --- a/src/PhpSpreadsheet/Writer/Xlsx/Table.php +++ b/src/PhpSpreadsheet/Writer/Xlsx/Table.php @@ -57,6 +57,9 @@ public function writeTable(WorksheetTable $table, $tableRef): string $objWriter->writeAttribute('colId', (string) $offset); $objWriter->writeAttribute('hiddenButton', '1'); $objWriter->endElement(); + } else { + $column = $table->getAutoFilter()->getColumnByOffset($offset); + AutoFilter::writeAutoFilterColumn($objWriter, $column, $offset); } } $objWriter->endElement(); diff --git a/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php b/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php index cdc7c94177..be65d163f1 100644 --- a/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php +++ b/src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php @@ -3,7 +3,6 @@ namespace PhpOffice\PhpSpreadsheet\Writer\Xlsx; use PhpOffice\PhpSpreadsheet\Calculation\Information\ErrorValue; -use PhpOffice\PhpSpreadsheet\Calculation\Information\Value; use PhpOffice\PhpSpreadsheet\Cell\Cell; use PhpOffice\PhpSpreadsheet\Cell\Coordinate; use PhpOffice\PhpSpreadsheet\RichText\RichText; @@ -13,8 +12,6 @@ use PhpOffice\PhpSpreadsheet\Style\Conditional; use PhpOffice\PhpSpreadsheet\Style\ConditionalFormatting\ConditionalDataBar; 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\Worksheet as PhpspreadsheetWorksheet; @@ -154,6 +151,14 @@ private function writeSheetPr(XMLWriter $objWriter, PhpspreadsheetWorksheet $wor $worksheet->getAutoFilter()->showHideRows(); } } + $tables = $worksheet->getTableCollection(); + if (count($tables)) { + foreach ($tables as $table) { + if (!$table->getAutoFilter()->getEvaluated()) { + $table->getAutoFilter()->showHideRows(); + } + } + } // tabColor if ($worksheet->isTabColorSet()) { @@ -905,95 +910,7 @@ private function writePageMargins(XMLWriter $objWriter, PhpspreadsheetWorksheet */ private function writeAutoFilter(XMLWriter $objWriter, PhpspreadsheetWorksheet $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]] = 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(); - } + AutoFilter::writeAutoFilter($objWriter, $worksheet); } /** diff --git a/tests/PhpSpreadsheetTests/Features/AutoFilter/Xlsx/BasicLoadTest.php b/tests/PhpSpreadsheetTests/Features/AutoFilter/Xlsx/BasicLoadTest.php index c36e674116..63c3c6fd2d 100644 --- a/tests/PhpSpreadsheetTests/Features/AutoFilter/Xlsx/BasicLoadTest.php +++ b/tests/PhpSpreadsheetTests/Features/AutoFilter/Xlsx/BasicLoadTest.php @@ -4,6 +4,7 @@ use PhpOffice\PhpSpreadsheet\Reader\Xlsx; use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter\Column\Rule; +use PhpOffice\PhpSpreadsheet\Worksheet\Table; use PHPUnit\Framework\TestCase; class BasicLoadTest extends TestCase @@ -47,28 +48,34 @@ public function testLoadOffice365AutoFilter(): void $spreadsheet = $reader->load($filename); $worksheet = $spreadsheet->getActiveSheet(); - self::assertSame('A1:D57', $worksheet->getAutoFilter()->getRange()); - self::assertSame(2, $worksheet->getAutoFilter()->getColumn('C')->ruleCount()); + $tables = $worksheet->getTableCollection(); + 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( 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( 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(2, $worksheet->getAutoFilter()->getColumn('D')->ruleCount()); + self::assertSame('United States', $table->getAutoFilter()->getColumn('C')->getRules()[1]->getValue()); + self::assertSame(2, $table->getAutoFilter()->getColumn('D')->ruleCount()); self::assertSame( 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( 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()); } } diff --git a/tests/PhpSpreadsheetTests/Worksheet/Table/TableTest.php b/tests/PhpSpreadsheetTests/Worksheet/Table/TableTest.php index c7cbee25fe..028816a7de 100644 --- a/tests/PhpSpreadsheetTests/Worksheet/Table/TableTest.php +++ b/tests/PhpSpreadsheetTests/Worksheet/Table/TableTest.php @@ -5,6 +5,7 @@ use PhpOffice\PhpSpreadsheet\Cell\CellAddress; use PhpOffice\PhpSpreadsheet\Cell\CellRange; use PhpOffice\PhpSpreadsheet\Exception as PhpSpreadsheetException; +use PhpOffice\PhpSpreadsheet\Worksheet\AutoFilter; use PhpOffice\PhpSpreadsheet\Worksheet\Table; use PhpOffice\PhpSpreadsheet\Worksheet\Table\Column; use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; @@ -555,4 +556,25 @@ public function testClearColumn(): void self::assertArrayHasKey('L', $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); + } + } } From f602f8c58567be22204f65ca8780f74fc34ac01b Mon Sep 17 00:00:00 2001 From: MarkBaker Date: Tue, 11 Oct 2022 10:50:33 +0200 Subject: [PATCH 3/4] Merge with current master, and resolve conflicts --- phpstan-baseline.neon | 795 ------------------------------------------ 1 file changed, 795 deletions(-) diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 2b5c91e6a3..583ad66ed9 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -1340,426 +1340,6 @@ parameters: count: 2 path: src/PhpSpreadsheet/Reader/Xlsx.php - - - message: "#^Cannot call method addChart\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\Worksheet\\|null\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Cannot call method setBold\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Cannot call method setColor\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Cannot call method setItalic\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Cannot call method setName\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Cannot call method setSize\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Cannot call method setStrikethrough\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Cannot call method setSubscript\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Cannot call method setSuperscript\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Cannot call method setUnderline\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#" - count: 2 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:boolean\\(\\) has parameter \\$value with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToBoolean\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToBoolean\\(\\) has parameter \\$c with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToError\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToError\\(\\) has parameter \\$c with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToFormula\\(\\) has parameter \\$c with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToFormula\\(\\) has parameter \\$calculatedValue with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToFormula\\(\\) has parameter \\$castBaseType with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToFormula\\(\\) has parameter \\$cellDataType with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToFormula\\(\\) has parameter \\$r with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToFormula\\(\\) has parameter \\$sharedFormulas with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToFormula\\(\\) has parameter \\$value with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToString\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:castToString\\(\\) has parameter \\$c with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:dirAdd\\(\\) has parameter \\$add with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:dirAdd\\(\\) has parameter \\$base with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:getArrayItem\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:getArrayItem\\(\\) has parameter \\$array with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:getArrayItem\\(\\) has parameter \\$key with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:getFromZipArchive\\(\\) should return string but returns string\\|false\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:readFormControlProperties\\(\\) has parameter \\$dir with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:readFormControlProperties\\(\\) has parameter \\$docSheet with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:readFormControlProperties\\(\\) has parameter \\$fileWorksheet with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:readPrinterSettings\\(\\) has parameter \\$dir with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:readPrinterSettings\\(\\) has parameter \\$docSheet with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:readPrinterSettings\\(\\) has parameter \\$fileWorksheet with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:stripWhiteSpaceFromStyleString\\(\\) has parameter \\$string with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\:\\:toCSSArray\\(\\) has parameter \\$style with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Negated boolean expression is always true\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Parameter \\#1 \\$fontSizeInPoints of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Font\\:\\:fontSizeToPixels\\(\\) expects int, string given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Parameter \\#1 \\$haystack of function strpos expects string, int\\|string given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Parameter \\#1 \\$sizeInCm of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Font\\:\\:centimeterSizeToPixels\\(\\) expects int, string given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Parameter \\#1 \\$sizeInInch of static method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\Font\\:\\:inchSizeToPixels\\(\\) expects int, string given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Parameter \\#1 \\$worksheetName of method PhpOffice\\\\PhpSpreadsheet\\\\Spreadsheet\\:\\:getSheetByName\\(\\) expects string, array\\|string given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Parameter \\#3 \\$subject of function str_replace expects array\\|string, int\\|string given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Reader/Xlsx.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\AutoFilter\\:\\:readAutoFilter\\(\\) has parameter \\$autoFilterRange with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\AutoFilter\\:\\:readAutoFilter\\(\\) has parameter \\$xmlSheet with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php - - - - message: "#^Parameter \\#1 \\$operator of method PhpOffice\\\\PhpSpreadsheet\\\\Worksheet\\\\AutoFilter\\\\Column\\\\Rule\\:\\:setRule\\(\\) expects string, null given\\.$#" - count: 4 - path: src/PhpSpreadsheet/Reader/Xlsx/AutoFilter.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\BaseParserClass\\:\\:boolean\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/BaseParserClass.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\BaseParserClass\\:\\:boolean\\(\\) has parameter \\$value with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/BaseParserClass.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:isFilteredColumn\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:isFilteredColumn\\(\\) has parameter \\$columnCoordinate with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:isFilteredRow\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:isFilteredRow\\(\\) has parameter \\$rowCoordinate with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:readColumnAttributes\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:readColumnAttributes\\(\\) has parameter \\$readDataOnly with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:readColumnRangeAttributes\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:readColumnRangeAttributes\\(\\) has parameter \\$readDataOnly with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:readRowAttributes\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:readRowAttributes\\(\\) has parameter \\$readDataOnly with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php - - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:\\$worksheet has no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php - - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ColumnAndRowAttributes\\:\\:\\$worksheetXml has no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ColumnAndRowAttributes.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:readConditionalStyles\\(\\) has parameter \\$xmlSheet with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:readDataBarExtLstOfConditionalRule\\(\\) has parameter \\$cfRule with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:readDataBarExtLstOfConditionalRule\\(\\) has parameter \\$conditionalFormattingRuleExtensions with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:readDataBarOfConditionalRule\\(\\) has parameter \\$cfRule with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:readDataBarOfConditionalRule\\(\\) has parameter \\$conditionalFormattingRuleExtensions with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:readStyleRules\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:readStyleRules\\(\\) has parameter \\$cfRules with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:readStyleRules\\(\\) has parameter \\$extLst with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:setConditionalStyles\\(\\) has parameter \\$xmlExtLst with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php - - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:\\$dxfs has no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php - - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:\\$worksheet has no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php - - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\ConditionalStyles\\:\\:\\$worksheetXml has no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/ConditionalStyles.php - - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\DataValidations\\:\\:\\$worksheet has no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/DataValidations.php - - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\DataValidations\\:\\:\\$worksheetXml has no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/DataValidations.php - - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\Hyperlinks\\:\\:\\$hyperlinks has no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/Hyperlinks.php - - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\Hyperlinks\\:\\:\\$worksheet has no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/Hyperlinks.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\PageSetup\\:\\:load\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/PageSetup.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\PageSetup\\:\\:pageSetup\\(\\) has no return type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/PageSetup.php - - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\PageSetup\\:\\:\\$worksheet has no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/PageSetup.php - - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\PageSetup\\:\\:\\$worksheetXml has no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/PageSetup.php - - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\SheetViewOptions\\:\\:\\$worksheet has no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/SheetViewOptions.php - - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Reader\\\\Xlsx\\\\SheetViewOptions\\:\\:\\$worksheetXml has no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Reader/Xlsx/SheetViewOptions.php - - message: "#^Parameter \\#1 \\$haystack of function strpos expects string, string\\|false given\\.$#" count: 1 @@ -3105,378 +2685,3 @@ parameters: count: 1 path: src/PhpSpreadsheet/Writer/Xls/Xf.php - - - message: "#^Argument of an invalid type array\\|null supplied for foreach, only iterables are supported\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx.php - - - - message: "#^Parameter \\#1 \\$path of function basename expects string, array\\|string\\|null given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx.php - - - - message: "#^Parameter \\#1 \\$path of function dirname expects string, array\\|string\\|null given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx.php - - - - message: "#^Possibly invalid array key type array\\|string\\|null\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx.php - - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\:\\:\\$pathNames has no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx.php - - - - message: "#^Cannot call method getDataValues\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\DataSeriesValues\\|false\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Chart.php - - - - message: "#^Cannot call method getFillColor\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\DataSeriesValues\\|false\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Chart.php - - - - message: "#^Else branch is unreachable because previous condition is always true\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Chart.php - - - - message: "#^Parameter \\#1 \\$plotSeriesValues of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Chart\\:\\:writeBubbles\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\DataSeriesValues\\|null, PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\DataSeriesValues\\|false given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Chart.php - - - - message: "#^Parameter \\#1 \\$rawTextData of method PhpOffice\\\\PhpSpreadsheet\\\\Shared\\\\XMLWriter\\:\\:writeRawData\\(\\) expects array\\\\|string\\|null, int given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Chart.php - - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, array\\|int\\|string given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Writer/Xlsx/Chart.php - - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, array\\|int\\|string\\|null given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Chart.php - - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, float given\\.$#" - count: 6 - path: src/PhpSpreadsheet/Writer/Xlsx/Chart.php - - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, float\\|int given\\.$#" - count: 4 - path: src/PhpSpreadsheet/Writer/Xlsx/Chart.php - - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int given\\.$#" - count: 42 - path: src/PhpSpreadsheet/Writer/Xlsx/Chart.php - - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, string\\|null given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Writer/Xlsx/Chart.php - - - - message: "#^Parameter \\#6 \\$yAxis of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Chart\\:\\:writeCategoryAxis\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Axis, PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Axis\\|null given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Chart.php - - - - message: "#^Parameter \\#7 \\$xAxis of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Chart\\:\\:writeValueAxis\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Axis, PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\Axis\\|null given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Writer/Xlsx/Chart.php - - - - message: "#^Parameter \\#8 \\$majorGridlines of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Chart\\:\\:writeValueAxis\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\GridLines, PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\GridLines\\|null given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Writer/Xlsx/Chart.php - - - - message: "#^Parameter \\#9 \\$minorGridlines of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Chart\\:\\:writeValueAxis\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\GridLines, PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\GridLines\\|null given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Writer/Xlsx/Chart.php - - - - message: "#^Part \\$xAxis\\-\\>getShadowProperty\\(\\['color', 'type'\\]\\) \\(array\\|int\\|string\\|null\\) of encapsed string cannot be cast to string\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Chart.php - - - - message: "#^Property PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Chart\\:\\:\\$calculateCellValues has no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Chart.php - - - - message: "#^Strict comparison using \\=\\=\\= between PhpOffice\\\\PhpSpreadsheet\\\\Chart\\\\PlotArea and null will always evaluate to false\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Chart.php - - - - message: "#^Parameter \\#1 \\$string of function substr expects string, int given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Comments.php - - - - message: "#^Parameter \\#2 \\$content of method XMLWriter\\:\\:writeElement\\(\\) expects string\\|null, int given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Writer/Xlsx/Comments.php - - - - message: "#^Expression on left side of \\?\\? is not nullable\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/DefinedNames.php - - - - message: "#^Parameter \\#2 \\$content of method XMLWriter\\:\\:writeElement\\(\\) expects string\\|null, int given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/DocProps.php - - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Writer/Xlsx/DocProps.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Rels\\:\\:writeUnparsedRelationship\\(\\) has parameter \\$relationship with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Rels.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Rels\\:\\:writeUnparsedRelationship\\(\\) has parameter \\$type with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Rels.php - - - - message: "#^Parameter \\#2 \\$id of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Rels\\:\\:writeRelationship\\(\\) expects int, string given\\.$#" - count: 5 - path: src/PhpSpreadsheet/Writer/Xlsx/Rels.php - - - - message: "#^Parameter \\#4 \\$target of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Rels\\:\\:writeRelationship\\(\\) expects string, array\\|string\\|null given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Rels.php - - - - message: "#^Cannot call method getBold\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php - - - - message: "#^Cannot call method getColor\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php - - - - message: "#^Cannot call method getItalic\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php - - - - message: "#^Cannot call method getName\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php - - - - message: "#^Cannot call method getSize\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php - - - - message: "#^Cannot call method getStrikethrough\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php - - - - message: "#^Cannot call method getSubscript\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#" - count: 2 - path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php - - - - message: "#^Cannot call method getSuperscript\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#" - count: 2 - path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php - - - - message: "#^Cannot call method getUnderline\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php - - - - message: "#^Instanceof between \\*NEVER\\* and PhpOffice\\\\PhpSpreadsheet\\\\RichText\\\\RichText will always evaluate to false\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php - - - - message: "#^Instanceof between string and PhpOffice\\\\PhpSpreadsheet\\\\RichText\\\\RichText will always evaluate to false\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php - - - - message: "#^Parameter \\#1 \\$text of method PhpOffice\\\\PhpSpreadsheet\\\\RichText\\\\RichText\\:\\:createTextRun\\(\\) expects string, string\\|null given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php - - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, float\\|null given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php - - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php - - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int\\<0, max\\> given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php - - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, string\\|null given\\.$#" - count: 4 - path: src/PhpSpreadsheet/Writer/Xlsx/StringTable.php - - - - message: "#^Cannot call method getStyle\\(\\) on PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Conditional\\|null\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Style.php - - - - message: "#^Comparison operation \"\\<\" between int\\ and 0 is always true\\.$#" - count: 2 - path: src/PhpSpreadsheet/Writer/Xlsx/Style.php - - - - message: "#^Parameter \\#2 \\$borders of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Style\\:\\:writeBorder\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Borders, PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Borders\\|null given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Style.php - - - - message: "#^Parameter \\#2 \\$fill of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Style\\:\\:writeFill\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Fill, PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Fill\\|null given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Style.php - - - - message: "#^Parameter \\#2 \\$font of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Style\\:\\:writeFont\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font, PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\Font\\|null given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Style.php - - - - message: "#^Parameter \\#2 \\$numberFormat of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Style\\:\\:writeNumFmt\\(\\) expects PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\NumberFormat, PhpOffice\\\\PhpSpreadsheet\\\\Style\\\\NumberFormat\\|null given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Style.php - - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, float given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Style.php - - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int given\\.$#" - count: 22 - path: src/PhpSpreadsheet/Writer/Xlsx/Style.php - - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int\\<0, max\\> given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Style.php - - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int\\<1, max\\> given\\.$#" - count: 2 - path: src/PhpSpreadsheet/Writer/Xlsx/Style.php - - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int\\|null given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Style.php - - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, string\\|null given\\.$#" - count: 7 - path: src/PhpSpreadsheet/Writer/Xlsx/Style.php - - - - message: "#^Result of \\|\\| is always true\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Style.php - - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int given\\.$#" - count: 7 - path: src/PhpSpreadsheet/Writer/Xlsx/Workbook.php - - - - message: "#^Expression on left side of \\?\\? is not nullable\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - - - message: "#^If condition is always true\\.$#" - count: 6 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Worksheet\\:\\:writeAttributeIf\\(\\) has parameter \\$condition with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Worksheet\\:\\:writeDataBarElements\\(\\) has parameter \\$dataBar with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - - - message: "#^Method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Worksheet\\:\\:writeElementIf\\(\\) has parameter \\$condition with no type specified\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - - - message: "#^Parameter \\#2 \\$content of method XMLWriter\\:\\:writeElement\\(\\) expects string\\|null, int\\|string given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int given\\.$#" - count: 12 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int\\<0, max\\> given\\.$#" - count: 3 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int\\<1, max\\> given\\.$#" - count: 9 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, int\\|null given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - - - message: "#^Parameter \\#2 \\$value of method XMLWriter\\:\\:writeAttribute\\(\\) expects string, string\\|null given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - - - message: "#^Parameter \\#3 \\$stringTable of method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Worksheet\\:\\:writeSheetData\\(\\) expects array\\, array\\\\|null given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - - - - message: "#^Parameter \\#4 \\$val of static method PhpOffice\\\\PhpSpreadsheet\\\\Writer\\\\Xlsx\\\\Worksheet\\:\\:writeAttributeIf\\(\\) expects string, int given\\.$#" - count: 1 - path: src/PhpSpreadsheet/Writer/Xlsx/Worksheet.php - From 7e99e6bdd2b12240c26ca4e3983bf3885c03fb0d Mon Sep 17 00:00:00 2001 From: MarkBaker Date: Tue, 11 Oct 2022 11:40:36 +0200 Subject: [PATCH 4/4] Minor Refactoring for writing filter column rules --- src/PhpSpreadsheet/Writer/Xlsx/AutoFilter.php | 108 ++++++++++-------- 1 file changed, 58 insertions(+), 50 deletions(-) diff --git a/src/PhpSpreadsheet/Writer/Xlsx/AutoFilter.php b/src/PhpSpreadsheet/Writer/Xlsx/AutoFilter.php index 8b0f8884a0..87e96f08c1 100644 --- a/src/PhpSpreadsheet/Writer/Xlsx/AutoFilter.php +++ b/src/PhpSpreadsheet/Writer/Xlsx/AutoFilter.php @@ -56,60 +56,68 @@ public static function writeAutoFilterColumn(XMLWriter $objWriter, Column $colum } 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()); + self::writeAutoFilterColumnRule($column, $rule, $objWriter); + } - 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(); + } + } + + /** + * Write AutoFilter's filterColumn Rule. + */ + private static function writeAutoFilterColumnRule(Column $column, Rule $rule, XMLWriter $objWriter): void + { + 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()); - $objWriter->endElement(); + 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(); }