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