From 6fbf474642b8a31b60f05216c431a8a561298c64 Mon Sep 17 00:00:00 2001 From: Kevin Verschaeve Date: Thu, 14 Sep 2023 14:58:52 +0200 Subject: [PATCH] fix: Load tables when flag IReader::READ_DATA_ONLY is used (#3726) * fix: Load tables when flag IReader::READ_DATA_ONLY is used * Add test for table read when IReader:::READ_DATA_ONLY is used --------- Co-authored-by: Kevin Verschaeve --- src/PhpSpreadsheet/Reader/Xlsx.php | 3 +- .../Reader/Xlsx/XlsxTest.php | 27 ++++++++++++++++++ tests/data/Reader/XLSX/data_with_tables.xlsx | Bin 0 -> 10291 bytes 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 tests/data/Reader/XLSX/data_with_tables.xlsx diff --git a/src/PhpSpreadsheet/Reader/Xlsx.php b/src/PhpSpreadsheet/Reader/Xlsx.php index c89f1df5d..7f29194d9 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx.php +++ b/src/PhpSpreadsheet/Reader/Xlsx.php @@ -972,9 +972,10 @@ class Xlsx extends BaseReader if ($this->readDataOnly === false) { $this->readAutoFilter($xmlSheetNS, $docSheet); - $this->readTables($xmlSheetNS, $docSheet, $dir, $fileWorksheet, $zip, $mainNS); } + $this->readTables($xmlSheetNS, $docSheet, $dir, $fileWorksheet, $zip, $mainNS); + if ($xmlSheetNS && $xmlSheetNS->mergeCells && $xmlSheetNS->mergeCells->mergeCell && !$this->readDataOnly) { foreach ($xmlSheetNS->mergeCells->mergeCell as $mergeCellx) { /** @scrutinizer ignore-call */ diff --git a/tests/PhpSpreadsheetTests/Reader/Xlsx/XlsxTest.php b/tests/PhpSpreadsheetTests/Reader/Xlsx/XlsxTest.php index ab5081ccc..f7b86627c 100644 --- a/tests/PhpSpreadsheetTests/Reader/Xlsx/XlsxTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Xlsx/XlsxTest.php @@ -6,6 +6,7 @@ namespace PhpOffice\PhpSpreadsheetTests\Reader\Xlsx; use PhpOffice\PhpSpreadsheet\Cell\Coordinate; use PhpOffice\PhpSpreadsheet\IOFactory; +use PhpOffice\PhpSpreadsheet\Reader\IReader; use PhpOffice\PhpSpreadsheet\Reader\Xlsx; use PhpOffice\PhpSpreadsheet\Shared\File; use PhpOffice\PhpSpreadsheet\Style\Conditional; @@ -245,4 +246,30 @@ height:13.5pt;z-index:5;mso-wrap-style:tight'], height:13.5pt;z-index:5;mso-wrap-style:tight'], ]; } + + public function testLoadDataOnlyLoadsAlsoTables(): void + { + $filename = 'tests/data/Reader/XLSX/data_with_tables.xlsx'; + $reader = new Xlsx(); + $excel = $reader->load($filename, IReader::READ_DATA_ONLY); + + self::assertEquals(['First', 'Second'], $excel->getSheetNames()); + + $table = $excel->getTableByName('Tableau1'); + $firstSheet = $excel->getSheetByName('First'); + $secondSheet = $excel->getSheetByName('Second'); + if (!$table || !$firstSheet || !$secondSheet) { + self::fail('Table or Sheet not found.'); + } + + self::assertEquals('A1:B5', $table->getRange()); + self::assertEquals([['1', '2', '3']], $firstSheet->toArray()); + self::assertEquals([ + ['Colonne1', 'Colonne2'], + ['a', 'b'], + ['c', 'd'], + ['e', 'f'], + ['g', 'h'], + ], $secondSheet->toArray()); + } } diff --git a/tests/data/Reader/XLSX/data_with_tables.xlsx b/tests/data/Reader/XLSX/data_with_tables.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..30e4f8a3b16331c4ba612ccd2afdcd7d75fbb937 GIT binary patch literal 10291 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 literal 0 HcmV?d00001