From 070bc68514a1aaec6111a7d58b3915107f9b3739 Mon Sep 17 00:00:00 2001
From: oleibman <10341515+oleibman@users.noreply.github.com>
Date: Tue, 10 May 2022 07:33:45 -0700
Subject: [PATCH] Html Reader Converting Cell Containing 0 to Null String
(#2813)
Fix #2810. Repairing some Phpstan diagnostics, used `?:` rather than `??` in a few places.
2 different Html modules are affected. Also, Ods Reader, but its problem is with sheet title rather than cell contents. And, as it turns out, Ods Reader was already not handling sheets with a title of `0` correctly - it made a truthy test before setting sheet title. That is now changed to truthy or numeric. Other readers are not susceptible to this problem. Tests are added.
---
.../Calculation/ArrayEnabled.php | 2 +-
src/PhpSpreadsheet/Helper/Html.php | 2 +-
src/PhpSpreadsheet/Reader/Html.php | 2 +-
src/PhpSpreadsheet/Reader/Ods.php | 4 +-
tests/PhpSpreadsheetTests/Helper/HtmlTest.php | 1 +
.../Reader/Html/Issue2810Test.php | 40 ++++++++++++++++++
.../Reader/Ods/Issue2810Test.php | 20 +++++++++
tests/data/Reader/Ods/issue.2810.ods | Bin 0 -> 8390 bytes
8 files changed, 66 insertions(+), 5 deletions(-)
create mode 100644 tests/PhpSpreadsheetTests/Reader/Html/Issue2810Test.php
create mode 100644 tests/PhpSpreadsheetTests/Reader/Ods/Issue2810Test.php
create mode 100644 tests/data/Reader/Ods/issue.2810.ods
diff --git a/src/PhpSpreadsheet/Calculation/ArrayEnabled.php b/src/PhpSpreadsheet/Calculation/ArrayEnabled.php
index 0ad429ed..1e3f6971 100644
--- a/src/PhpSpreadsheet/Calculation/ArrayEnabled.php
+++ b/src/PhpSpreadsheet/Calculation/ArrayEnabled.php
@@ -20,7 +20,7 @@ trait ArrayEnabled
if (self::$arrayArgumentHelper === null) {
self::$arrayArgumentHelper = new ArrayArgumentHelper();
}
- self::$arrayArgumentHelper->initialise($arguments ?: []);
+ self::$arrayArgumentHelper->initialise(($arguments === false) ? [] : $arguments);
}
/**
diff --git a/src/PhpSpreadsheet/Helper/Html.php b/src/PhpSpreadsheet/Helper/Html.php
index 4737379a..ce5a3d1d 100644
--- a/src/PhpSpreadsheet/Helper/Html.php
+++ b/src/PhpSpreadsheet/Helper/Html.php
@@ -795,7 +795,7 @@ class Html
$domText = preg_replace(
'/\s+/u',
' ',
- str_replace(["\r", "\n"], ' ', $textNode->nodeValue ?: '')
+ str_replace(["\r", "\n"], ' ', $textNode->nodeValue ?? '')
);
$this->stringData .= $domText;
$this->buildTextRun();
diff --git a/src/PhpSpreadsheet/Reader/Html.php b/src/PhpSpreadsheet/Reader/Html.php
index 15c9f625..437d931d 100644
--- a/src/PhpSpreadsheet/Reader/Html.php
+++ b/src/PhpSpreadsheet/Reader/Html.php
@@ -619,7 +619,7 @@ class Html extends BaseReader
{
foreach ($element->childNodes as $child) {
if ($child instanceof DOMText) {
- $domText = preg_replace('/\s+/u', ' ', trim($child->nodeValue ?: ''));
+ $domText = preg_replace('/\s+/u', ' ', trim($child->nodeValue ?? ''));
if (is_string($cellContent)) {
// simply append the text if the cell content is a plain text string
$cellContent .= $domText;
diff --git a/src/PhpSpreadsheet/Reader/Ods.php b/src/PhpSpreadsheet/Reader/Ods.php
index fcafc047..27c58edb 100644
--- a/src/PhpSpreadsheet/Reader/Ods.php
+++ b/src/PhpSpreadsheet/Reader/Ods.php
@@ -325,7 +325,7 @@ class Ods extends BaseReader
}
$spreadsheet->setActiveSheetIndex($worksheetID);
- if ($worksheetName) {
+ if ($worksheetName || is_numeric($worksheetName)) {
// Use false for $updateFormulaCellReferences to prevent adjustment of worksheet references in
// formula cells... during the load, all formulae should be correct, and we're simply
// bringing the worksheet name in line with the formula, not the reverse
@@ -628,7 +628,7 @@ class Ods extends BaseReader
foreach ($settings->getElementsByTagNameNS($configNs, 'config-item') as $t) {
if ($t->getAttributeNs($configNs, 'name') === 'ActiveTable') {
try {
- $spreadsheet->setActiveSheetIndexByName($t->nodeValue ?: '');
+ $spreadsheet->setActiveSheetIndexByName($t->nodeValue ?? '');
} catch (Throwable $e) {
// do nothing
}
diff --git a/tests/PhpSpreadsheetTests/Helper/HtmlTest.php b/tests/PhpSpreadsheetTests/Helper/HtmlTest.php
index b2fadf42..3315771a 100644
--- a/tests/PhpSpreadsheetTests/Helper/HtmlTest.php
+++ b/tests/PhpSpreadsheetTests/Helper/HtmlTest.php
@@ -28,6 +28,7 @@ class HtmlTest extends TestCase
['können', 'können'],
['русский', 'русский'],
["foo\nbar", '
foo
bar
'],
+ 'issue2810' => ['0', '0'],
];
}
}
diff --git a/tests/PhpSpreadsheetTests/Reader/Html/Issue2810Test.php b/tests/PhpSpreadsheetTests/Reader/Html/Issue2810Test.php
new file mode 100644
index 00000000..40ced6ed
--- /dev/null
+++ b/tests/PhpSpreadsheetTests/Reader/Html/Issue2810Test.php
@@ -0,0 +1,40 @@
+
+
+
+
+ Declaracion en Linea
+
+
+
+
+
+
+EOF;
+ $reader = new Html();
+ $spreadsheet = $reader->loadFromString($content);
+ $sheet = $spreadsheet->getActiveSheet();
+ self::assertSame(1, $sheet->getCell('A1')->getValue());
+ self::assertSame(0, $sheet->getCell('B1')->getValue());
+ self::assertSame(2, $sheet->getCell('C1')->getValue());
+ $spreadsheet->disconnectWorksheets();
+ }
+}
diff --git a/tests/PhpSpreadsheetTests/Reader/Ods/Issue2810Test.php b/tests/PhpSpreadsheetTests/Reader/Ods/Issue2810Test.php
new file mode 100644
index 00000000..bbb697b8
--- /dev/null
+++ b/tests/PhpSpreadsheetTests/Reader/Ods/Issue2810Test.php
@@ -0,0 +1,20 @@
+load($filename);
+ $sheet = $spreadsheet->getActiveSheet();
+ self::assertSame('Active', $sheet->getCell('A1')->getValue());
+ $spreadsheet->disconnectWorksheets();
+ }
+}
diff --git a/tests/data/Reader/Ods/issue.2810.ods b/tests/data/Reader/Ods/issue.2810.ods
new file mode 100644
index 0000000000000000000000000000000000000000..ba8d581fb700151df77644be90ab7328ab0d137f
GIT binary patch
literal 8390
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
literal 0
HcmV?d00001