From 68dec61e4ae99c9d3d85f0a6bfc847d34072b98c Mon Sep 17 00:00:00 2001 From: oleibman <10341515+oleibman@users.noreply.github.com> Date: Wed, 27 Dec 2023 18:13:55 -0800 Subject: [PATCH] Html Reader Tolerate Invalid Sheet Title There are different rules for Title between Excel and Html, in particular maximum length and which characters are valid. Html Reader can throw an exception because of this difference. This PR allows it to tolerate an invalid title, retaining the default title if the Html suggests an invalid one. --- CHANGELOG.md | 1 + src/PhpSpreadsheet/Reader/Html.php | 8 +++- .../Writer/Html/LongTitleTest.php | 38 +++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 tests/PhpSpreadsheetTests/Writer/Html/LongTitleTest.php diff --git a/CHANGELOG.md b/CHANGELOG.md index f68cd66ea..051a28ac8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -87,6 +87,7 @@ and this project adheres to [Semantic Versioning](https://semver.org). - Recurse directories searching for font file. [Issue #2809](https://github.com/PHPOffice/PhpSpreadsheet/issues/2809) [PR #3830](https://github.com/PHPOffice/PhpSpreadsheet/pull/3830) - Reduce memory consumption of Worksheet::rangeToArray() when many empty rows are read. [Issue #3814](https://github.com/PHPOffice/PhpSpreadsheet/pull/3814) [PR #3834](https://github.com/PHPOffice/PhpSpreadsheet/pull/3834) - Reduce time used by Worksheet::rangeToArray() when many empty rows are read. [PR #3839](https://github.com/PHPOffice/PhpSpreadsheet/pull/3839) +- Html Reader Tolerate Invalid Sheet Title. [PR #3845](https://github.com/PHPOffice/PhpSpreadsheet/pull/3845) ## 1.29.0 - 2023-06-15 diff --git a/src/PhpSpreadsheet/Reader/Html.php b/src/PhpSpreadsheet/Reader/Html.php index 6fcf31d7d..0dc0f2818 100644 --- a/src/PhpSpreadsheet/Reader/Html.php +++ b/src/PhpSpreadsheet/Reader/Html.php @@ -9,6 +9,7 @@ use DOMText; use PhpOffice\PhpSpreadsheet\Cell\Coordinate; use PhpOffice\PhpSpreadsheet\Cell\DataType; use PhpOffice\PhpSpreadsheet\Document\Properties; +use PhpOffice\PhpSpreadsheet\Exception as SpreadsheetException; use PhpOffice\PhpSpreadsheet\Helper\Dimension as CssDimension; use PhpOffice\PhpSpreadsheet\Reader\Security\XmlScanner; use PhpOffice\PhpSpreadsheet\Spreadsheet; @@ -345,7 +346,12 @@ class Html extends BaseReader { if ($child->nodeName === 'title') { $this->processDomElement($child, $sheet, $row, $column, $cellContent); - $sheet->setTitle($cellContent, true, true); + + try { + $sheet->setTitle($cellContent, true, true); + } catch (SpreadsheetException) { + // leave default title if too long or illegal chars + } $cellContent = ''; } else { $this->processDomElementSpanEtc($sheet, $row, $column, $cellContent, $child, $attributeArray); diff --git a/tests/PhpSpreadsheetTests/Writer/Html/LongTitleTest.php b/tests/PhpSpreadsheetTests/Writer/Html/LongTitleTest.php new file mode 100644 index 000000000..5b73784ed --- /dev/null +++ b/tests/PhpSpreadsheetTests/Writer/Html/LongTitleTest.php @@ -0,0 +1,38 @@ +getProperties() + ->setTitle('PhpSpreadsheet Table Test Document'); + $sheet = $spreadsheet->getActiveSheet(); + $sheet->setCellValue('A1', 1); + + $reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Html'); + $spreadsheet->disconnectWorksheets(); + self::assertSame('Worksheet', $reloadedSpreadsheet->getActiveSheet()->getTitle()); + $reloadedSpreadsheet->disconnectWorksheets(); + } + + public static function providerTitles(): array + { + return [ + ['Worksheet', 'This title is just a bit too long'], + ['Worksheet', 'Invalid * character'], + ['Legitimate Title', 'Legitimate Title'], + ]; + } +}