Skip to content

Commit 3e003fc

Browse files
author
Thomas Lallement
committed
Fix moving drawing in cell and add more tests
1 parent 72676a3 commit 3e003fc

File tree

3 files changed

+105
-9
lines changed

3 files changed

+105
-9
lines changed

src/PhpSpreadsheet/Cell/DefaultValueBinder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public function bindValue(Cell $cell, mixed $value): bool
3838
$value->setCoordinates($cell->getCoordinate());
3939
$value->setResizeProportional(false);
4040
$value->setInCell(true);
41-
$value->setWorksheet($cell->getWorksheet());
41+
$value->setWorksheet($cell->getWorksheet(), true);
4242
} else {
4343
throw new SpreadsheetException('Unable to bind unstringable ' . gettype($value));
4444
}

src/PhpSpreadsheet/Worksheet/BaseDrawing.php

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -218,17 +218,23 @@ public function setWorksheet(?Worksheet $worksheet = null, bool $overrideOld = f
218218
} else {
219219
if ($overrideOld) {
220220
// Remove drawing from old Worksheet
221-
$iterator = $this->worksheet->getDrawingCollection()->getIterator();
222-
223-
while ($iterator->valid()) {
224-
if ($iterator->current()->getHashCode() === $this->getHashCode()) {
225-
$this->worksheet->getDrawingCollection()->offsetUnset($iterator->key());
226-
$this->worksheet = null;
227-
228-
break;
221+
$collections = [
222+
$this->worksheet->getDrawingCollection(),
223+
$this->worksheet->getInCellDrawingCollection(),
224+
];
225+
226+
foreach ($collections as $collection) {
227+
foreach ($collection as $key => $drawing) {
228+
if ($drawing->getHashCode() === $this->getHashCode()) {
229+
$collection->offsetUnset($key);
230+
$this->worksheet = null;
231+
break 2; // break both loops
232+
}
229233
}
230234
}
231235

236+
237+
232238
// Set new Worksheet
233239
$this->setWorksheet($worksheet);
234240
} else {

tests/PhpSpreadsheetTests/Writer/Xlsx/DrawingInCellTest.php

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,4 +94,94 @@ public function testWriteNewPictureInCell(): void
9494

9595
$reloadedSpreadsheet->disconnectWorksheets();
9696
}
97+
98+
public function testMoveImageInCell(): void
99+
{
100+
$file = 'tests/data/Reader/XLSX/drawing_in_cell.xlsx';
101+
$reader = new Xlsx();
102+
$spreadsheet = $reader->load($file);
103+
$sheet = $spreadsheet->getSheet(1);
104+
105+
/** @var ?Drawing $drawing */
106+
$drawing = $sheet->getCell('D7')->getValue();
107+
if ($drawing === null) {
108+
self::fail('Unexpected null drawing');
109+
}
110+
$originalWidth = $drawing->getWidth();
111+
$originalHeight = $drawing->getHeight();
112+
$sheet->getCell('D7')->setValue(null);
113+
$sheet->getCell('D8')->setValue($drawing);
114+
115+
// Save spreadsheet to file and read it back
116+
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx');
117+
$spreadsheet->disconnectWorksheets();
118+
119+
$sheet = $reloadedSpreadsheet->getSheet(1);
120+
$drawings = $sheet->getInCellDrawingCollection();
121+
self::assertCount(1, $drawings);
122+
123+
/** @var ?Drawing $drawing */
124+
$drawing = $sheet->getCell('D8')->getValue();
125+
126+
if ($drawing === null) {
127+
self::fail('Unexpected null drawing');
128+
} else {
129+
self::assertSame(IMAGETYPE_PNG, $drawing->getType());
130+
self::assertSame('D8', $drawing->getCoordinates());
131+
self::assertSame($originalWidth, $drawing->getWidth());
132+
self::assertSame($originalHeight, $drawing->getHeight());
133+
}
134+
135+
$reloadedSpreadsheet->disconnectWorksheets();
136+
}
137+
138+
public function testWriteSamePictureInCellAndAsFloating(): void
139+
{
140+
$file = 'tests/data/Reader/XLSX/drawing_in_cell.xlsx';
141+
$reader = new Xlsx();
142+
$spreadsheet = $reader->load($file);
143+
144+
$objDrawing = new Drawing();
145+
$objDrawing->setPath('tests/data/Writer/XLSX/blue_square.png');
146+
147+
$sheet = $spreadsheet->getSheet(1);
148+
$sheet->getCell('C10')->setValue($objDrawing);
149+
150+
$objFloatingDrawing = new Drawing();
151+
$objFloatingDrawing->setPath('tests/data/Writer/XLSX/blue_square.png');
152+
153+
$coordinates = $sheet->getCell('B5')->getCoordinate();
154+
$objFloatingDrawing->setCoordinates($coordinates);
155+
$objFloatingDrawing->setOffsetX(1);
156+
$objFloatingDrawing->setOffsetY(1);
157+
$objFloatingDrawing->setWorksheet($sheet);
158+
159+
// Save spreadsheet to file and read it back
160+
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx');
161+
$spreadsheet->disconnectWorksheets();
162+
163+
$sheet = $reloadedSpreadsheet->getSheet(1);
164+
$drawings = $sheet->getInCellDrawingCollection();
165+
self::assertCount(2, $drawings);
166+
167+
/** @var ?Drawing $drawing */
168+
$drawing = $sheet->getCell('C10')->getValue();
169+
170+
if ($drawing === null) {
171+
self::fail('Unexpected null drawing');
172+
} else {
173+
self::assertSame(IMAGETYPE_PNG, $drawing->getType());
174+
self::assertSame('C10', $drawing->getCoordinates());
175+
self::assertSame(100, $drawing->getWidth());
176+
self::assertSame(100, $drawing->getHeight());
177+
}
178+
179+
$floatingDrawings = $sheet->getDrawingCollection();
180+
181+
self::assertCount(1, $floatingDrawings);
182+
self::assertSame('B5', $floatingDrawings->getIterator()->current()->getCoordinates());
183+
self::assertNull($sheet->getCell('B5')->getValue());
184+
185+
$reloadedSpreadsheet->disconnectWorksheets();
186+
}
97187
}

0 commit comments

Comments
 (0)