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 + + + + + + + + +
102
+ + + +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