From e05e354e1485cad72a35cf1d19a1e1d64eedaf9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jok=C5=ABbas?= <3471628+JokubasR@users.noreply.github.com> Date: Sun, 6 Nov 2022 19:43:50 +0200 Subject: [PATCH] Fix ODS read filter on number-columns-repeated cell (#3149) --- src/PhpSpreadsheet/Reader/Ods.php | 10 ++++- .../Reader/Ods/RepeatedColumnsTest.php | 41 ++++++++++++++++++ tests/data/Reader/Ods/RepeatedCells.ods | Bin 0 -> 2910 bytes 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 tests/PhpSpreadsheetTests/Reader/Ods/RepeatedColumnsTest.php create mode 100644 tests/data/Reader/Ods/RepeatedCells.ods diff --git a/src/PhpSpreadsheet/Reader/Ods.php b/src/PhpSpreadsheet/Reader/Ods.php index b3a84bf70..748cdd306 100644 --- a/src/PhpSpreadsheet/Reader/Ods.php +++ b/src/PhpSpreadsheet/Reader/Ods.php @@ -375,7 +375,15 @@ class Ods extends BaseReader foreach ($childNode->childNodes as $cellData) { if ($this->getReadFilter() !== null) { if (!$this->getReadFilter()->readCell($columnID, $rowID, $worksheetName)) { - ++$columnID; + if ($cellData->hasAttributeNS($tableNs, 'number-columns-repeated')) { + $colRepeats = (int) $cellData->getAttributeNS($tableNs, 'number-columns-repeated'); + } else { + $colRepeats = 1; + } + + for ($i = 0; $i < $colRepeats; ++$i) { + ++$columnID; + } continue; } diff --git a/tests/PhpSpreadsheetTests/Reader/Ods/RepeatedColumnsTest.php b/tests/PhpSpreadsheetTests/Reader/Ods/RepeatedColumnsTest.php new file mode 100644 index 000000000..1b477ff6c --- /dev/null +++ b/tests/PhpSpreadsheetTests/Reader/Ods/RepeatedColumnsTest.php @@ -0,0 +1,41 @@ +reader = new Ods(); + } + + public function testDefinedNames(): void + { + $this->reader->setReadFilter( + new class () implements IReadFilter { + public function readCell($columnAddress, $row, $worksheetName = ''): bool + { + return in_array($columnAddress, ['A', 'C', 'E', 'G', 'J', 'K'], true); + } + } + ); + $spreadsheet = $this->reader->load('tests/data/Reader/Ods/RepeatedCells.ods'); + $worksheet = $spreadsheet->getActiveSheet(); + + self::assertEquals('TestA', $worksheet->getCell('A1')->getValue()); + self::assertNull($worksheet->getCell('C1')->getValue()); + self::assertEquals('TestE', $worksheet->getCell('E1')->getValue()); + self::assertEquals('TestG', $worksheet->getCell('G1')->getValue()); + self::assertEquals('A', $worksheet->getCell('J1')->getValue()); + self::assertEquals('TestK', $worksheet->getCell('K1')->getValue()); + } +} diff --git a/tests/data/Reader/Ods/RepeatedCells.ods b/tests/data/Reader/Ods/RepeatedCells.ods new file mode 100644 index 0000000000000000000000000000000000000000..46ecc4535f2a3c64d21ab059bb0e9a8a4c92e288 GIT binary patch literal 2910 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 literal 0 HcmV?d00001