From dcccd63ee376805653899c1b6903c6a99d52bd07 Mon Sep 17 00:00:00 2001 From: oleibman <10341515+oleibman@users.noreply.github.com> Date: Thu, 26 Oct 2023 12:06:36 -0700 Subject: [PATCH] Theme File Missing But Referenced in Spreadsheet (#3772) * Theme File Missing But Referenced in Spreadsheet Fix #3770. A rels file points to a non-existent theme file in the spreadsheet. In other similar cases (e.g. PR #3771), Excel opens such a spreadsheet, but with an error pop-up. Not so with this file; it just opens the spreadsheet without the pop-up. PhpSpreadsheet will now account for this unusual situation as well. * Update CHANGELOG.md --- CHANGELOG.md | 1 + src/PhpSpreadsheet/Reader/Xlsx.php | 3 ++ .../Reader/Xlsx/Issue3770Test.php | 47 ++++++++++++++++++ tests/data/Reader/XLSX/issue.3770.xlsx | Bin 0 -> 11946 bytes 4 files changed, 51 insertions(+) create mode 100644 tests/PhpSpreadsheetTests/Reader/Xlsx/Issue3770Test.php create mode 100644 tests/data/Reader/XLSX/issue.3770.xlsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 240454ef75..05dda2d384 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -67,6 +67,7 @@ and this project adheres to [Semantic Versioning](https://semver.org). - Break Some Circular References. [PR #3716](https://github.com/PHPOffice/PhpSpreadsheet/pull/3716) [PR #3707](https://github.com/PHPOffice/PhpSpreadsheet/pull/3707) - Missing Font Index in Some Xls. [PR #3734](https://github.com/PHPOffice/PhpSpreadsheet/pull/3734) - Load Tables even with READ_DATA_ONLY. [PR #3726](https://github.com/PHPOffice/PhpSpreadsheet/pull/3726) +- Theme File Missing but Referenced in Spreadsheet. [Issue #3770](https://github.com/PHPOffice/PhpSpreadsheet/issues/3770) [PR #3772](https://github.com/PHPOffice/PhpSpreadsheet/pull/3772) ## 1.29.0 - 2023-06-15 diff --git a/src/PhpSpreadsheet/Reader/Xlsx.php b/src/PhpSpreadsheet/Reader/Xlsx.php index 3c2b4f244a..99fb3937d5 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx.php +++ b/src/PhpSpreadsheet/Reader/Xlsx.php @@ -427,6 +427,9 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet } switch ($rel['Type']) { case "$xmlNamespaceBase/theme": + if (!$this->fileExistsInArchive($zip, "xl/{$relTarget}")) { + break; // issue3770 + } $themeOrderArray = ['lt1', 'dk1', 'lt2', 'dk2']; $themeOrderAdditional = count($themeOrderArray); diff --git a/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue3770Test.php b/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue3770Test.php new file mode 100644 index 0000000000..469c02e513 --- /dev/null +++ b/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue3770Test.php @@ -0,0 +1,47 @@ +load(self::$testbook); + $sheet = $spreadsheet->getActiveSheet(); + // Assert anything to confirm read succeeded + self::assertSame('Универсальный передаточный документ', $sheet->getCell('A1')->getValue()); + $spreadsheet->disconnectWorksheets(); + } +} diff --git a/tests/data/Reader/XLSX/issue.3770.xlsx b/tests/data/Reader/XLSX/issue.3770.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..415f6691d3457ca28443ecbf32a38d9ea4fa07cf GIT binary patch literal 11946 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 literal 0 HcmV?d00001