From 7b2e10e26ca4dcb31bfa8dc4a9553c37d47c5aa7 Mon Sep 17 00:00:00 2001 From: Owen Leibman Date: Fri, 17 Dec 2021 06:23:29 -0800 Subject: [PATCH 1/3] General Style Specified in Uppercase in Input Xlsx Fix #2450. Treat input style GENERAL as if it were expected upper/lowercase. --- src/PhpSpreadsheet/Reader/Xlsx/Styles.php | 13 +++++-- .../Reader/Xlsx/Issue2450Test.php | 34 ++++++++++++++++++ tests/data/Reader/XLSX/issue.2450.xlsx | Bin 0 -> 4685 bytes 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 tests/PhpSpreadsheetTests/Reader/Xlsx/Issue2450Test.php create mode 100644 tests/data/Reader/XLSX/issue.2450.xlsx diff --git a/src/PhpSpreadsheet/Reader/Xlsx/Styles.php b/src/PhpSpreadsheet/Reader/Xlsx/Styles.php index 550c52c0e9..4ec5c27534 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx/Styles.php +++ b/src/PhpSpreadsheet/Reader/Xlsx/Styles.php @@ -94,7 +94,7 @@ private function readNumberFormat(NumberFormat $numfmtStyle, SimpleXMLElement $n } $numfmt = Xlsx::getAttributes($numfmtStyleXml); if ($numfmt->count() > 0 && isset($numfmt['formatCode'])) { - $numfmtStyle->setFormatCode((string) $numfmt['formatCode']); + $numfmtStyle->setFormatCode(self::formatGeneral((string) $numfmt['formatCode'])); } } @@ -183,6 +183,15 @@ public function readAlignmentStyle(Alignment $alignment, SimpleXMLElement $align ); } + private function formatGeneral(string $formatString): string + { + if ($formatString === 'GENERAL') { + $formatString = NumberFormat::FORMAT_GENERAL; + } + + return $formatString; + } + /** * Read style. * @@ -193,7 +202,7 @@ public function readStyle(Style $docStyle, $style): void if ($style->numFmt instanceof SimpleXMLElement) { $this->readNumberFormat($docStyle->getNumberFormat(), $style->numFmt); } else { - $docStyle->getNumberFormat()->setFormatCode($style->numFmt); + $docStyle->getNumberFormat()->setFormatCode(self::formatGeneral((string) $style->numFmt)); } if (isset($style->font)) { diff --git a/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue2450Test.php b/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue2450Test.php new file mode 100644 index 0000000000..d8327b8360 --- /dev/null +++ b/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue2450Test.php @@ -0,0 +1,34 @@ +load($filename); + $sheet = $spreadsheet->getActiveSheet(); + $sheet = $spreadsheet->getActiveSheet(); + $birthYears = [ + 'C2' => $sheet->getCell('C2')->getFormattedValue(), + 'C3' => $sheet->getCell('C3')->getFormattedValue(), + 'C4' => $sheet->getCell('C4')->getFormattedValue(), + ]; + self::assertSame( + [ + 'C2' => '1932', + 'C3' => '1964', + 'C4' => '1988', + ], + $birthYears + ); + + $spreadsheet->disconnectWorksheets(); + } +} diff --git a/tests/data/Reader/XLSX/issue.2450.xlsx b/tests/data/Reader/XLSX/issue.2450.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b6975e49820e93f6e50b4f959a4faeb0327b30e3 GIT binary patch literal 4685 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 literal 0 HcmV?d00001 From 349b28b9918f22fd853a29ca9759ab1898974081 Mon Sep 17 00:00:00 2001 From: Owen Leibman Date: Fri, 17 Dec 2021 08:23:32 -0800 Subject: [PATCH 2/3] Declare Method as Static Surprised neither Phpstan nor Scrutinizer flagged this. --- src/PhpSpreadsheet/Reader/Xlsx/Styles.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/PhpSpreadsheet/Reader/Xlsx/Styles.php b/src/PhpSpreadsheet/Reader/Xlsx/Styles.php index 4ec5c27534..6f01c7457d 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx/Styles.php +++ b/src/PhpSpreadsheet/Reader/Xlsx/Styles.php @@ -183,7 +183,7 @@ public function readAlignmentStyle(Alignment $alignment, SimpleXMLElement $align ); } - private function formatGeneral(string $formatString): string + private static function formatGeneral(string $formatString): string { if ($formatString === 'GENERAL') { $formatString = NumberFormat::FORMAT_GENERAL; From d5e495ca890a637fdadf7c1b391ea896ca2a2916 Mon Sep 17 00:00:00 2001 From: Owen Leibman Date: Fri, 17 Dec 2021 08:43:48 -0800 Subject: [PATCH 3/3] Remove Duplicated Statement Don't know why Scrutinizer didn't flag this the first time. --- tests/PhpSpreadsheetTests/Reader/Xlsx/Issue2450Test.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue2450Test.php b/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue2450Test.php index d8327b8360..e6cb741bfa 100644 --- a/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue2450Test.php +++ b/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue2450Test.php @@ -14,7 +14,6 @@ public function testIssue2450(): void $reader = IOFactory::createReader('Xlsx'); $spreadsheet = $reader->load($filename); $sheet = $spreadsheet->getActiveSheet(); - $sheet = $spreadsheet->getActiveSheet(); $birthYears = [ 'C2' => $sheet->getCell('C2')->getFormattedValue(), 'C3' => $sheet->getCell('C3')->getFormattedValue(),