Skip to content

Commit cadeb88

Browse files
committed
Xlsx Reader Do Not Process Printer Settings for Dataonly
Fix #4477. Xlsx Spreadsheet could be loaded and saved normally, but, when the load specified Dataonly, the output file was corrupt. Reader is changed to not process Printer Settings when Dataonly is in effect.
1 parent 85a9a39 commit cadeb88

File tree

3 files changed

+76
-0
lines changed

3 files changed

+76
-0
lines changed

src/PhpSpreadsheet/Reader/Xlsx.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2231,6 +2231,9 @@ private function readFormControlProperties(Spreadsheet $excel, string $dir, stri
22312231
/** @param mixed[][][][] $unparsedLoadedData */
22322232
private function readPrinterSettings(Spreadsheet $excel, string $dir, string $fileWorksheet, Worksheet $docSheet, array &$unparsedLoadedData): void
22332233
{
2234+
if ($this->readDataOnly) {
2235+
return;
2236+
}
22342237
$zip = $this->zip;
22352238
if ($zip->locateName(dirname("$dir/$fileWorksheet") . '/_rels/' . basename($fileWorksheet) . '.rels') === false) {
22362239
return;
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpOffice\PhpSpreadsheetTests\Reader\Xlsx;
6+
7+
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;
8+
use PhpOffice\PhpSpreadsheet\Shared\File;
9+
use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter;
10+
use PHPUnit\Framework\TestCase;
11+
use ZipArchive;
12+
13+
class Issue4477Test extends TestCase
14+
{
15+
private string $tempfile = '';
16+
17+
protected function tearDown(): void
18+
{
19+
if ($this->tempfile !== '') {
20+
unlink($this->tempfile);
21+
$this->tempfile = '';
22+
}
23+
}
24+
25+
public function testDataonlyNoPrinter(): void
26+
{
27+
// Need to ignore printer settings when Read Dataonly
28+
$infile = 'tests/data/Reader/XLSX/issue.4477.disclaimer.xlsx';
29+
$zip = new ZipArchive();
30+
if ($zip->open($infile) !== true) {
31+
self::fail("failed to open $infile");
32+
}
33+
$num = $zip->numFiles;
34+
$foundPrinter = $foundWorksheet = false;
35+
for ($i = 0; $i < $num; ++$i) {
36+
$filename = (string) $zip->getNameIndex($i);
37+
if (str_contains($filename, 'printer')) {
38+
$foundPrinter = true;
39+
} elseif ($filename === 'xl/worksheets/sheet1.xml') {
40+
$foundWorksheet = true;
41+
}
42+
}
43+
$zip->close();
44+
self::assertTrue($foundPrinter);
45+
self::assertTrue($foundWorksheet);
46+
47+
$reader = new XlsxReader();
48+
$reader->setReadDataOnly(true);
49+
$spreadsheet = $reader->load($infile);
50+
$writer = new XlsxWriter($spreadsheet);
51+
$this->tempfile = File::temporaryFileName();
52+
$writer->save($this->tempfile);
53+
$spreadsheet->disconnectWorksheets();
54+
55+
$zip = new ZipArchive();
56+
if ($zip->open($this->tempfile) !== true) {
57+
self::fail("failed to open {$infile}");
58+
}
59+
$num = $zip->numFiles;
60+
$foundPrinter = $foundWorksheet = false;
61+
for ($i = 0; $i < $num; ++$i) {
62+
$filename = (string) $zip->getNameIndex($i);
63+
if (str_contains($filename, 'printer')) {
64+
$foundPrinter = true;
65+
} elseif ($filename === 'xl/worksheets/sheet1.xml') {
66+
$foundWorksheet = true;
67+
}
68+
}
69+
$zip->close();
70+
self::assertFalse($foundPrinter);
71+
self::assertTrue($foundWorksheet);
72+
}
73+
}
Binary file not shown.

0 commit comments

Comments
 (0)