diff --git a/src/PhpSpreadsheet/Reader/Xlsx.php b/src/PhpSpreadsheet/Reader/Xlsx.php index f8a0b11324..9b3bac4374 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx.php +++ b/src/PhpSpreadsheet/Reader/Xlsx.php @@ -784,6 +784,19 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet $charts = $chartDetails = []; + // Add richData (contains relation of in-cell images) + $richData = []; + $relationsFileName = $dir . '/richData/_rels/richValueRel.xml.rels'; + if ($zip->locateName($relationsFileName)) { + $relsWorksheet = $this->loadZip($relationsFileName, Namespaces::RELATIONSHIPS); + foreach ($relsWorksheet->Relationship as $elex) { + $ele = self::getAttributes($elex); + if ($ele['Type'] == Namespaces::IMAGE) { + $richData['image'][(string) $ele['Id']] = (string) $ele['Target']; + } + } + } + $sheetCreated = false; if ($xmlWorkbookNS->sheets) { foreach ($xmlWorkbookNS->sheets->sheet as $eleSheet) { @@ -940,6 +953,28 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet break; case DataType::TYPE_ERROR: + if (isset($cAttr->vm, $richData['image']['rId' . $cAttr->vm]) && !$useFormula) { + $imagePath = $dir . '/' . str_replace('../', '', $richData['image']['rId' . $cAttr->vm]); + $objDrawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing(); + $objDrawing->setPath( + 'zip://' . File::realpath($filename) . '#' . $imagePath, + false, + $zip + ); + + $objDrawing->setCoordinates($r); + $objDrawing->setOffsetX(0); + $objDrawing->setOffsetY(0); + $objDrawing->setResizeProportional(false); + $objDrawing->setWorksheet($docSheet); + + $value = $objDrawing; + $cellDataType = DataType::TYPE_NULL; + $c->t = DataType::TYPE_NULL; + + break; + } + if (!$useFormula) { $value = self::castToError($c); } else { diff --git a/tests/PhpSpreadsheetTests/Reader/Xlsx/DrawingInCellTest.php b/tests/PhpSpreadsheetTests/Reader/Xlsx/DrawingInCellTest.php new file mode 100644 index 0000000000..79beb08325 --- /dev/null +++ b/tests/PhpSpreadsheetTests/Reader/Xlsx/DrawingInCellTest.php @@ -0,0 +1,36 @@ +load($file); + $sheet = $spreadsheet->getActiveSheet(); + $drawings = $sheet->getDrawingCollection(); + self::assertCount(1, $drawings); + + if ($drawings[0] === null) { + self::fail('Unexpected null drawing'); + } else { + self::assertSame(IMAGETYPE_PNG, $drawings[0]->getType()); + self::assertSame('B2', $drawings[0]->getCoordinates()); + self::assertSame(0, $drawings[0]->getOffsetX()); + self::assertSame(0, $drawings[0]->getOffsetY()); + self::assertSame(296, $drawings[0]->getWidth()); + self::assertSame(154, $drawings[0]->getHeight()); + self::assertSame(296, $drawings[0]->getImageWidth()); + self::assertSame(154, $drawings[0]->getImageHeight()); + } + + $spreadsheet->disconnectWorksheets(); + } +} diff --git a/tests/data/Reader/XLSX/drawing_in_cell.xlsx b/tests/data/Reader/XLSX/drawing_in_cell.xlsx new file mode 100644 index 0000000000..7ba1881fa1 Binary files /dev/null and b/tests/data/Reader/XLSX/drawing_in_cell.xlsx differ