Skip to content

Commit a020fb6

Browse files
author
Thomas Lallement
committed
Fix code, CS and add Unit Test
1 parent 54805fa commit a020fb6

File tree

3 files changed

+66
-20
lines changed

3 files changed

+66
-20
lines changed

src/PhpSpreadsheet/Reader/Xlsx.php

Lines changed: 27 additions & 20 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,34 +953,28 @@ protected function loadSpreadsheetFromFile(string $filename): Spreadsheet
940953

941954
break;
942955
case DataType::TYPE_ERROR:
943-
if (isset($cAttr->vm)) {
944-
$cell = $docSheet->getCell($r);
945-
if ($cell) {
946-
947-
$objDrawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
948-
$objDrawing->setName('');
949-
$objDrawing->setDescription('');
950-
$imagePath = 'xl/media/image' . $cAttr->vm . '.png';
951-
$objDrawing->setPath(
952-
'zip://' . File::realpath($filename) . '#' . $imagePath,
953-
false,
954-
$zip
955-
);
956+
if (isset($cAttr->vm) && isset($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+
);
956964

957-
$objDrawing->setCoordinates($r);
958-
$objDrawing->setOffsetX(0);
959-
$objDrawing->setOffsetY(0);
960-
$objDrawing->setResizeProportional(false);
961-
$objDrawing->setWorksheet($docSheet);
962-
}
965+
$objDrawing->setCoordinates($r);
966+
$objDrawing->setOffsetX(0);
967+
$objDrawing->setOffsetY(0);
968+
$objDrawing->setResizeProportional(false);
969+
$objDrawing->setWorksheet($docSheet);
963970

964971
$value = $objDrawing;
965972
$cellDataType = DATATYPE::TYPE_NULL;
966973
$c->t = DATATYPE::TYPE_NULL;
967974

968975
break;
969976
}
970-
977+
971978
if (!$useFormula) {
972979
$value = self::castToError($c);
973980
} else {
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
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\Calculation\Functions\Engineering\ImAbsTest;
9+
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
10+
11+
class DrawingInCell extends AbstractFunctional
12+
{
13+
public function testPictureInCell(): void
14+
{
15+
$file = 'tests/data/Reader/XLSX/drawing_in_cell.xlsx';
16+
$reader = new Xlsx();
17+
$spreadsheet = $reader->load($file);
18+
19+
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx');
20+
$spreadsheet->disconnectWorksheets();
21+
$sheet = $reloadedSpreadsheet->getActiveSheet();
22+
$drawings = $sheet->getDrawingCollection();
23+
self::assertCount(1, $drawings);
24+
if ($drawings[0] === null) {
25+
self::fail('Unexpected null drawing');
26+
} else {
27+
self::assertSame(IMAGETYPE_PNG, $drawings[0]->getType());
28+
self::assertSame('B2', $drawings[0]->getCoordinates());
29+
self::assertSame(0, $drawings[0]->getOffsetX());
30+
self::assertSame(0, $drawings[0]->getOffsetY());
31+
self::assertSame(296, $drawings[0]->getWidth());
32+
self::assertSame(154, $drawings[0]->getHeight());
33+
self::assertSame(296, $drawings[0]->getImageWidth());
34+
self::assertSame(154, $drawings[0]->getImageHeight());
35+
}
36+
37+
$reloadedSpreadsheet->disconnectWorksheets();
38+
}
39+
}
23.5 KB
Binary file not shown.

0 commit comments

Comments
 (0)