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