From 5b799dbbedb2980b80265eada037ef067afe29f7 Mon Sep 17 00:00:00 2001 From: oleibman <10341515+oleibman@users.noreply.github.com> Date: Thu, 3 Apr 2025 19:55:33 -0700 Subject: [PATCH 1/2] Ods Reader No Datatype for Null Value Issue #4435 was initially described incorrectly. While investigating the original description, I came upon this problem. Ods Reader is trying to set some cells to null without supplying a valid DataType to setValueExplicit, causing that method to throw an exception. Reader is changed to no longer call that method when value is null and DataType is null-string. --- src/PhpSpreadsheet/Reader/Ods.php | 2 +- .../Reader/Ods/Issue4435Test.php | 31 ++++++++++++++++++ tests/data/Reader/Ods/issue.4435b.ods | Bin 0 -> 11104 bytes 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 tests/PhpSpreadsheetTests/Reader/Ods/Issue4435Test.php create mode 100644 tests/data/Reader/Ods/issue.4435b.ods diff --git a/src/PhpSpreadsheet/Reader/Ods.php b/src/PhpSpreadsheet/Reader/Ods.php index 77e0739950..5a98eb9063 100644 --- a/src/PhpSpreadsheet/Reader/Ods.php +++ b/src/PhpSpreadsheet/Reader/Ods.php @@ -617,7 +617,7 @@ public function loadIntoExisting(string $filename, Spreadsheet $spreadsheet): Sp if ($cellDataType === 'array') { $cell->setFormulaAttributes(['t' => 'array', 'ref' => $cellDataRef]); } - } else { + } elseif ($type !== '' || $dataValue !== null) { $cell->setValueExplicit($dataValue, $type); } diff --git a/tests/PhpSpreadsheetTests/Reader/Ods/Issue4435Test.php b/tests/PhpSpreadsheetTests/Reader/Ods/Issue4435Test.php new file mode 100644 index 0000000000..a7445c17e5 --- /dev/null +++ b/tests/PhpSpreadsheetTests/Reader/Ods/Issue4435Test.php @@ -0,0 +1,31 @@ +file . '#content.xml'; + $contents = (string) file_get_contents($zipFile); + self::assertStringContainsString( + '' . "\n" + . '' . "\n" + . '', + $contents + ); + $reader = new OdsReader(); + $spreadsheet = $reader->load($this->file); + $sheet = $spreadsheet->getActiveSheet(); + self::assertNull($sheet->getCell('B1')->getValue()); + $spreadsheet->disconnectWorksheets(); + } +} diff --git a/tests/data/Reader/Ods/issue.4435b.ods b/tests/data/Reader/Ods/issue.4435b.ods new file mode 100644 index 0000000000000000000000000000000000000000..f9cde7b6e58a40d9349d64805740e4075fffeab2 GIT binary patch literal 11104 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 S^iT~G@`{G6QB^b#-~J!TKcQ^^ literal 0 HcmV?d00001 From 70a590b117c1d7b93fa466cf96075a5cbad29d69 Mon Sep 17 00:00:00 2001 From: oleibman <10341515+oleibman@users.noreply.github.com> Date: Sat, 5 Apr 2025 17:28:31 -0700 Subject: [PATCH 2/2] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2ef7366a2..bd4ca14b98 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org). - BIN2DEC, OCT2DEC, and HEX2DEC return numbers rather than strings. [Issue #4383](https://github.com/PHPOffice/PhpSpreadsheet/issues/4383) [PR #4389](https://github.com/PHPOffice/PhpSpreadsheet/pull/4389) - Fix TREND_BEST_FIT_NO_POLY. [Issue #4400](https://github.com/PHPOffice/PhpSpreadsheet/issues/4400) [PR #4339](https://github.com/PHPOffice/PhpSpreadsheet/pull/4339) +- Ods Reader No DataType for Null Value. [Issue #4435](https://github.com/PHPOffice/PhpSpreadsheet/issues/4435) [PR #4436](https://github.com/PHPOffice/PhpSpreadsheet/pull/4436) ## 2025-03-02 - 4.1.0