diff --git a/src/PhpSpreadsheet/Reader/Xlsx.php b/src/PhpSpreadsheet/Reader/Xlsx.php index 2e1ea196b..ffb6c34dc 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx.php +++ b/src/PhpSpreadsheet/Reader/Xlsx.php @@ -1492,7 +1492,13 @@ class Xlsx extends BaseReader $shadow->setAlignment(self::getArrayItemString(self::getAttributes($outerShdw), 'algn')); $clr = $outerShdw->srgbClr ?? $outerShdw->prstClr; $shadow->getColor()->setRGB(self::getArrayItemString(self::getAttributes($clr), 'val')); - $shadow->setAlpha(self::getArrayItem(self::getAttributes($clr->alpha), 'val') / 1000); // @phpstan-ignore-line + if ($clr->alpha) { + $alpha = StringHelper::convertToString(self::getArrayItem(self::getAttributes($clr->alpha), 'val')); + if (is_numeric($alpha)) { + $alpha = (int) ($alpha / 1000); + $shadow->setAlpha($alpha); + } + } } $this->readHyperLinkDrawing($objDrawing, $oneCellAnchor, $hyperlinks); @@ -1597,7 +1603,13 @@ class Xlsx extends BaseReader $shadow->setAlignment(self::getArrayItemString(self::getAttributes($outerShdw), 'algn')); $clr = $outerShdw->srgbClr ?? $outerShdw->prstClr; $shadow->getColor()->setRGB(self::getArrayItemString(self::getAttributes($clr), 'val')); - $shadow->setAlpha(self::getArrayItem(self::getAttributes($clr->alpha), 'val') / 1000); // @phpstan-ignore-line + if ($clr->alpha) { + $alpha = StringHelper::convertToString(self::getArrayItem(self::getAttributes($clr->alpha), 'val')); + if (is_numeric($alpha)) { + $alpha = (int) ($alpha / 1000); + $shadow->setAlpha($alpha); + } + } } $this->readHyperLinkDrawing($objDrawing, $twoCellAnchor, $hyperlinks); diff --git a/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue4415Test.php b/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue4415Test.php new file mode 100644 index 000000000..2417e9f22 --- /dev/null +++ b/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue4415Test.php @@ -0,0 +1,47 @@ +'; + self::assertStringContainsString($expected, $data); + $expected = ''; + self::assertStringContainsString($expected, $data); + self::assertSame(2, substr_count($data, ''), 'first 2 drawings'); + self::assertSame(1, substr_count($data, ''), 'third drawings'); + } + + public function testFractionalAlpha(): void + { + $file = self::$file; + $reader = new XlsxReader(); + $spreadsheet = $reader->load($file); + $sheet = $spreadsheet->getActiveSheet(); + $drawings = $sheet->getDrawingCollection(); + self::assertCount(3, $drawings); + self::assertNotNull($drawings[0]); + self::assertNotNull($drawings[1]); + self::assertNotNull($drawings[2]); + self::assertSame(50, $drawings[0]->getShadow()->getAlpha()); + self::assertSame(72, $drawings[1]->getShadow()->getAlpha()); + self::assertSame('', $drawings[1]->getCoordinates2(), 'one cell anchor'); + self::assertSame(90, $drawings[2]->getShadow()->getAlpha()); + self::assertNotEquals('', $drawings[2]->getCoordinates2(), 'two cell anchor'); + $spreadsheet->disconnectWorksheets(); + } +} diff --git a/tests/data/Reader/XLSX/issue.4415.xlsx b/tests/data/Reader/XLSX/issue.4415.xlsx new file mode 100644 index 000000000..2b970b318 Binary files /dev/null and b/tests/data/Reader/XLSX/issue.4415.xlsx differ