Skip to content

Commit 75286c3

Browse files
author
tlallement
committed
Allow writing Drawing in Cell
1 parent a958149 commit 75286c3

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

src/PhpSpreadsheet/Cell/DefaultValueBinder.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use PhpOffice\PhpSpreadsheet\Exception as SpreadsheetException;
1010
use PhpOffice\PhpSpreadsheet\RichText\RichText;
1111
use PhpOffice\PhpSpreadsheet\Shared\StringHelper;
12+
use PhpOffice\PhpSpreadsheet\Worksheet\BaseDrawing;
1213
use Stringable;
1314

1415
class DefaultValueBinder implements IValueBinder
@@ -33,6 +34,11 @@ public function bindValue(Cell $cell, mixed $value): bool
3334
$value = $value->format('Y-m-d H:i:s');
3435
} elseif ($value instanceof Stringable) {
3536
$value = (string) $value;
37+
} elseif ($value instanceof BaseDrawing) {
38+
$value->setCoordinates($cell->getCoordinate());
39+
$value->setResizeProportional(false);
40+
$value->setInCell(true);
41+
$value->setWorksheet($cell->getWorksheet());
3642
} else {
3743
throw new SpreadsheetException('Unable to bind unstringable ' . gettype($value));
3844
}
@@ -68,6 +74,9 @@ public static function dataTypeForValue(mixed $value): string
6874
if ($value instanceof RichText) {
6975
return DataType::TYPE_INLINE;
7076
}
77+
if ($value instanceof BaseDrawing) {
78+
return DataType::TYPE_DRAWING_IN_CELL;
79+
}
7180
if ($value instanceof Stringable) {
7281
$value = (string) $value;
7382
}

tests/PhpSpreadsheetTests/Writer/Xlsx/DrawingInCellTest.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace PhpOffice\PhpSpreadsheetTests\Writer\Xlsx;
66

77
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
8+
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
89
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
910

1011
class DrawingInCellTest extends AbstractFunctional
@@ -58,4 +59,39 @@ public function testPictureInCell(): void
5859

5960
$reloadedSpreadsheet->disconnectWorksheets();
6061
}
62+
63+
public function testWriteNewPictureInCell(): void
64+
{
65+
$file = 'tests/data/Writer/XLSX/drawing_in_cell.xlsx';
66+
$reader = new Xlsx();
67+
$spreadsheet = $reader->load($file);
68+
69+
$objDrawing = new Drawing();
70+
$objDrawing->setPath('tests/data/Writer/XLSX/blue_square.png');
71+
72+
$sheet = $spreadsheet->getSheet(1);
73+
$sheet->getCell('C10')->setValue($objDrawing);
74+
75+
// Save spreadsheet to file and read it back
76+
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx');
77+
$spreadsheet->disconnectWorksheets();
78+
79+
$sheet = $reloadedSpreadsheet->getSheet(1);
80+
$drawings = $sheet->getInCellDrawingCollection();
81+
self::assertCount(2, $drawings);
82+
83+
/** @var ?Drawing $drawing */
84+
$drawing = $sheet->getCell('C10')->getValue();
85+
86+
if ($drawing === null) {
87+
self::fail('Unexpected null drawing');
88+
} else {
89+
self::assertSame(IMAGETYPE_PNG, $drawing->getType());
90+
self::assertSame('C10', $drawing->getCoordinates());
91+
self::assertSame(100, $drawing->getWidth());
92+
self::assertSame(100, $drawing->getHeight());
93+
}
94+
95+
$reloadedSpreadsheet->disconnectWorksheets();
96+
}
6197
}

0 commit comments

Comments
 (0)