From 0cb60a5098094c0bf061a2e9f904470755b6b1f3 Mon Sep 17 00:00:00 2001 From: Thorsten Ho Date: Thu, 24 Feb 2022 05:23:59 +0100 Subject: [PATCH] Fix XLSX broken vertical align font style (#2619) * Fix XLSX broken vertical align font style * Add fix information to changelog * Fix phpcs issues --- CHANGELOG.md | 2 ++ src/PhpSpreadsheet/Reader/Xlsx/Styles.php | 2 +- .../Reader/Xlsx/VerticalAlignTest.php | 25 ++++++++++++++++++ tests/data/Reader/XLSX/verticalAlignTest.xlsx | Bin 0 -> 9739 bytes 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 tests/PhpSpreadsheetTests/Reader/Xlsx/VerticalAlignTest.php create mode 100644 tests/data/Reader/XLSX/verticalAlignTest.xlsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 19995524..b9efbc36 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,8 @@ and this project adheres to [Semantic Versioning](https://semver.org). ### Fixed +- Fixed behaviour of XLSX font style vertical align settings + ## 1.22.0 - 2022-02-18 ### Added diff --git a/src/PhpSpreadsheet/Reader/Xlsx/Styles.php b/src/PhpSpreadsheet/Reader/Xlsx/Styles.php index 65dac529..b4c718d5 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx/Styles.php +++ b/src/PhpSpreadsheet/Reader/Xlsx/Styles.php @@ -119,7 +119,7 @@ class Styles extends BaseParserClass } if (isset($fontStyleXml->vertAlign)) { $attr = $this->getStyleAttributes($fontStyleXml->vertAlign); - if (!isset($attr['val'])) { + if (isset($attr['val'])) { $verticalAlign = strtolower((string) $attr['val']); if ($verticalAlign === 'superscript') { $fontStyle->setSuperscript(true); diff --git a/tests/PhpSpreadsheetTests/Reader/Xlsx/VerticalAlignTest.php b/tests/PhpSpreadsheetTests/Reader/Xlsx/VerticalAlignTest.php new file mode 100644 index 00000000..0d3c0467 --- /dev/null +++ b/tests/PhpSpreadsheetTests/Reader/Xlsx/VerticalAlignTest.php @@ -0,0 +1,25 @@ +load($filename)->getActiveSheet(); + + self::assertTrue($sheet->getCell('A1')->getStyle()->getFont()->getSuperscript()); + self::assertFalse($sheet->getCell('A1')->getStyle()->getFont()->getSubscript()); + + self::assertTrue($sheet->getCell('B1')->getStyle()->getFont()->getSubscript()); + self::assertFalse($sheet->getCell('B1')->getStyle()->getFont()->getSuperscript()); + + self::assertFalse($sheet->getCell('C1')->getStyle()->getFont()->getSubscript()); + self::assertFalse($sheet->getCell('C1')->getStyle()->getFont()->getSuperscript()); + } +} diff --git a/tests/data/Reader/XLSX/verticalAlignTest.xlsx b/tests/data/Reader/XLSX/verticalAlignTest.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..836d6653b3cfb9689ff0f6af22da3c40566a7105 GIT binary patch literal 9739 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 literal 0 HcmV?d00001