Skip to content

Commit 9920935

Browse files
raziel057Thomas Lallement
authored andcommitted
Support Read Image in Cell
1 parent 4fc82f4 commit 9920935

File tree

3 files changed

+73
-0
lines changed

3 files changed

+73
-0
lines changed

src/PhpSpreadsheet/Reader/Xlsx.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -784,6 +784,19 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet
784784

785785
$charts = $chartDetails = [];
786786

787+
// Add richData (contains relation of in-cell images)
788+
$richData = [];
789+
$relationsFileName = $dir . '/richData/_rels/richValueRel.xml.rels';
790+
if ($zip->locateName($relationsFileName)) {
791+
$relsWorksheet = $this->loadZip($relationsFileName, Namespaces::RELATIONSHIPS);
792+
foreach ($relsWorksheet->Relationship as $elex) {
793+
$ele = self::getAttributes($elex);
794+
if ($ele['Type'] == Namespaces::IMAGE) {
795+
$richData['image'][(string) $ele['Id']] = (string) $ele['Target'];
796+
}
797+
}
798+
}
799+
787800
$sheetCreated = false;
788801
if ($xmlWorkbookNS->sheets) {
789802
foreach ($xmlWorkbookNS->sheets->sheet as $eleSheet) {
@@ -940,6 +953,28 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet
940953

941954
break;
942955
case DataType::TYPE_ERROR:
956+
if (isset($cAttr->vm, $richData['image']['rId' . $cAttr->vm]) && !$useFormula) {
957+
$imagePath = $dir . '/' . str_replace('../', '', $richData['image']['rId' . $cAttr->vm]);
958+
$objDrawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
959+
$objDrawing->setPath(
960+
'zip://' . File::realpath($filename) . '#' . $imagePath,
961+
false,
962+
$zip
963+
);
964+
965+
$objDrawing->setCoordinates($r);
966+
$objDrawing->setOffsetX(0);
967+
$objDrawing->setOffsetY(0);
968+
$objDrawing->setResizeProportional(false);
969+
$objDrawing->setWorksheet($docSheet);
970+
971+
$value = $objDrawing;
972+
$cellDataType = DataType::TYPE_NULL;
973+
$c->t = DataType::TYPE_NULL;
974+
975+
break;
976+
}
977+
943978
if (!$useFormula) {
944979
$value = self::castToError($c);
945980
} else {
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpOffice\PhpSpreadsheetTests\Reader\Xlsx;
6+
7+
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
8+
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
9+
10+
class DrawingInCell extends AbstractFunctional
11+
{
12+
public function testPictureInCell(): void
13+
{
14+
$file = 'tests/data/Reader/XLSX/drawing_in_cell.xlsx';
15+
$reader = new Xlsx();
16+
$spreadsheet = $reader->load($file);
17+
18+
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx');
19+
$spreadsheet->disconnectWorksheets();
20+
$sheet = $reloadedSpreadsheet->getActiveSheet();
21+
$drawings = $sheet->getDrawingCollection();
22+
self::assertCount(1, $drawings);
23+
if ($drawings[0] === null) {
24+
self::fail('Unexpected null drawing');
25+
} else {
26+
self::assertSame(IMAGETYPE_PNG, $drawings[0]->getType());
27+
self::assertSame('B2', $drawings[0]->getCoordinates());
28+
self::assertSame(0, $drawings[0]->getOffsetX());
29+
self::assertSame(0, $drawings[0]->getOffsetY());
30+
self::assertSame(296, $drawings[0]->getWidth());
31+
self::assertSame(154, $drawings[0]->getHeight());
32+
self::assertSame(296, $drawings[0]->getImageWidth());
33+
self::assertSame(154, $drawings[0]->getImageHeight());
34+
}
35+
36+
$reloadedSpreadsheet->disconnectWorksheets();
37+
}
38+
}
23.5 KB
Binary file not shown.

0 commit comments

Comments
 (0)