From 1829dea91e55e0dcf96f98c81cbd2ecac108366c Mon Sep 17 00:00:00 2001 From: FlameStorm Date: Thu, 16 Jun 2022 00:55:17 +0300 Subject: [PATCH] Ignore square-$-brackets prefix in format string (#2886) * Ignore square-$-brackets prefix in format string * Test for square-$-brackets prefix in format string issue fixed * Fix for phpstan compliance * Additional assert for checking number format of tested source cell --- .../Style/NumberFormat/Formatter.php | 3 ++ .../Reader/Xlsx/Issue2885Test.php | 30 ++++++++++++++++++ tests/data/Reader/XLSX/issue.2885.xlsx | Bin 0 -> 5436 bytes 3 files changed, 33 insertions(+) create mode 100644 tests/PhpSpreadsheetTests/Reader/Xlsx/Issue2885Test.php create mode 100644 tests/data/Reader/XLSX/issue.2885.xlsx diff --git a/src/PhpSpreadsheet/Style/NumberFormat/Formatter.php b/src/PhpSpreadsheet/Style/NumberFormat/Formatter.php index 3e4bdc46..be195a88 100644 --- a/src/PhpSpreadsheet/Style/NumberFormat/Formatter.php +++ b/src/PhpSpreadsheet/Style/NumberFormat/Formatter.php @@ -112,6 +112,9 @@ class Formatter return $value; } + // Ignore square-$-brackets prefix in format string, like "[$-411]ge.m.d", "[$-010419]0%", etc + $format = (string) preg_replace('/^\[\$-[^\]]*\]/', '', $format); + $format = (string) preg_replace_callback( '/(["])(?:(?=(\\\\?))\\2.)*?\\1/u', function ($matches) { diff --git a/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue2885Test.php b/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue2885Test.php new file mode 100644 index 00000000..82727ef8 --- /dev/null +++ b/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue2885Test.php @@ -0,0 +1,30 @@ +load($filename); + $sheet = $spreadsheet->getActiveSheet(); + self::assertSame('[$-809]0%', $sheet->getStyle('A1')->getNumberFormat()->getFormatCode()); + + $finishColumns = $sheet->getHighestColumn(); + $rowsCount = $sheet->getHighestRow(); + $rows = $sheet->rangeToArray("A1:{$finishColumns}{$rowsCount}"); + self::assertSame('8%', $rows[0][0]); + + $spreadsheet->disconnectWorksheets(); + } +} diff --git a/tests/data/Reader/XLSX/issue.2885.xlsx b/tests/data/Reader/XLSX/issue.2885.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d7f4d48901ded48529578065895e60651d79015d GIT binary patch literal 5436 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 F{{w(ZFa7`k literal 0 HcmV?d00001