diff --git a/src/PhpSpreadsheet/Reader/Xlsx.php b/src/PhpSpreadsheet/Reader/Xlsx.php index b13114ab4..b60bf047b 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx.php +++ b/src/PhpSpreadsheet/Reader/Xlsx.php @@ -2231,6 +2231,9 @@ class Xlsx extends BaseReader /** @param mixed[][][][] $unparsedLoadedData */ private function readPrinterSettings(Spreadsheet $excel, string $dir, string $fileWorksheet, Worksheet $docSheet, array &$unparsedLoadedData): void { + if ($this->readDataOnly) { + return; + } $zip = $this->zip; if ($zip->locateName(dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels') === false) { return; diff --git a/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue4477Test.php b/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue4477Test.php new file mode 100644 index 000000000..814e0daf7 --- /dev/null +++ b/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue4477Test.php @@ -0,0 +1,73 @@ +tempfile !== '') { + unlink($this->tempfile); + $this->tempfile = ''; + } + } + + public function testDataonlyNoPrinter(): void + { + // Need to ignore printer settings when Read Dataonly + $infile = 'tests/data/Reader/XLSX/issue.4477.disclaimer.xlsx'; + $zip = new ZipArchive(); + if ($zip->open($infile) !== true) { + self::fail("failed to open $infile"); + } + $num = $zip->numFiles; + $foundPrinter = $foundWorksheet = false; + for ($i = 0; $i < $num; ++$i) { + $filename = (string) $zip->getNameIndex($i); + if (str_contains($filename, 'printer')) { + $foundPrinter = true; + } elseif ($filename === 'xl/worksheets/sheet1.xml') { + $foundWorksheet = true; + } + } + $zip->close(); + self::assertTrue($foundPrinter); + self::assertTrue($foundWorksheet); + + $reader = new XlsxReader(); + $reader->setReadDataOnly(true); + $spreadsheet = $reader->load($infile); + $writer = new XlsxWriter($spreadsheet); + $this->tempfile = File::temporaryFileName(); + $writer->save($this->tempfile); + $spreadsheet->disconnectWorksheets(); + + $zip = new ZipArchive(); + if ($zip->open($this->tempfile) !== true) { + self::fail("failed to open {$infile}"); + } + $num = $zip->numFiles; + $foundPrinter = $foundWorksheet = false; + for ($i = 0; $i < $num; ++$i) { + $filename = (string) $zip->getNameIndex($i); + if (str_contains($filename, 'printer')) { + $foundPrinter = true; + } elseif ($filename === 'xl/worksheets/sheet1.xml') { + $foundWorksheet = true; + } + } + $zip->close(); + self::assertFalse($foundPrinter); + self::assertTrue($foundWorksheet); + } +} diff --git a/tests/data/Reader/XLSX/issue.4477.disclaimer.xlsx b/tests/data/Reader/XLSX/issue.4477.disclaimer.xlsx new file mode 100644 index 000000000..619e8093c Binary files /dev/null and b/tests/data/Reader/XLSX/issue.4477.disclaimer.xlsx differ