mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-09-13 03:26:26 +00:00
Fix moving drawing in cell and add more tests
This commit is contained in:
@@ -38,7 +38,7 @@ class DefaultValueBinder implements IValueBinder
|
||||
$value->setCoordinates($cell->getCoordinate());
|
||||
$value->setResizeProportional(false);
|
||||
$value->setInCell(true);
|
||||
$value->setWorksheet($cell->getWorksheet());
|
||||
$value->setWorksheet($cell->getWorksheet(), true);
|
||||
} else {
|
||||
throw new SpreadsheetException('Unable to bind unstringable ' . gettype($value));
|
||||
}
|
||||
|
||||
@@ -218,14 +218,19 @@ class BaseDrawing implements IComparable
|
||||
} else {
|
||||
if ($overrideOld) {
|
||||
// Remove drawing from old Worksheet
|
||||
$iterator = $this->worksheet->getDrawingCollection()->getIterator();
|
||||
$collections = [
|
||||
$this->worksheet->getDrawingCollection(),
|
||||
$this->worksheet->getInCellDrawingCollection(),
|
||||
];
|
||||
|
||||
while ($iterator->valid()) {
|
||||
if ($iterator->current()->getHashCode() === $this->getHashCode()) {
|
||||
$this->worksheet->getDrawingCollection()->offsetUnset($iterator->key());
|
||||
$this->worksheet = null;
|
||||
foreach ($collections as $collection) {
|
||||
foreach ($collection as $key => $drawing) {
|
||||
if ($drawing->getHashCode() === $this->getHashCode()) {
|
||||
$collection->offsetUnset($key);
|
||||
$this->worksheet = null;
|
||||
|
||||
break;
|
||||
break 2; // break both loops
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -94,4 +94,94 @@ class DrawingInCellTest extends AbstractFunctional
|
||||
|
||||
$reloadedSpreadsheet->disconnectWorksheets();
|
||||
}
|
||||
|
||||
public function testMoveImageInCell(): void
|
||||
{
|
||||
$file = 'tests/data/Reader/XLSX/drawing_in_cell.xlsx';
|
||||
$reader = new Xlsx();
|
||||
$spreadsheet = $reader->load($file);
|
||||
$sheet = $spreadsheet->getSheet(1);
|
||||
|
||||
/** @var ?Drawing $drawing */
|
||||
$drawing = $sheet->getCell('D7')->getValue();
|
||||
if ($drawing === null) {
|
||||
self::fail('Unexpected null drawing');
|
||||
}
|
||||
$originalWidth = $drawing->getWidth();
|
||||
$originalHeight = $drawing->getHeight();
|
||||
$sheet->getCell('D7')->setValue(null);
|
||||
$sheet->getCell('D8')->setValue($drawing);
|
||||
|
||||
// Save spreadsheet to file and read it back
|
||||
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx');
|
||||
$spreadsheet->disconnectWorksheets();
|
||||
|
||||
$sheet = $reloadedSpreadsheet->getSheet(1);
|
||||
$drawings = $sheet->getInCellDrawingCollection();
|
||||
self::assertCount(1, $drawings);
|
||||
|
||||
/** @var ?Drawing $drawing */
|
||||
$drawing = $sheet->getCell('D8')->getValue();
|
||||
|
||||
if ($drawing === null) {
|
||||
self::fail('Unexpected null drawing');
|
||||
} else {
|
||||
self::assertSame(IMAGETYPE_PNG, $drawing->getType());
|
||||
self::assertSame('D8', $drawing->getCoordinates());
|
||||
self::assertSame($originalWidth, $drawing->getWidth());
|
||||
self::assertSame($originalHeight, $drawing->getHeight());
|
||||
}
|
||||
|
||||
$reloadedSpreadsheet->disconnectWorksheets();
|
||||
}
|
||||
|
||||
public function testWriteSamePictureInCellAndAsFloating(): void
|
||||
{
|
||||
$file = 'tests/data/Reader/XLSX/drawing_in_cell.xlsx';
|
||||
$reader = new Xlsx();
|
||||
$spreadsheet = $reader->load($file);
|
||||
|
||||
$objDrawing = new Drawing();
|
||||
$objDrawing->setPath('tests/data/Writer/XLSX/blue_square.png');
|
||||
|
||||
$sheet = $spreadsheet->getSheet(1);
|
||||
$sheet->getCell('C10')->setValue($objDrawing);
|
||||
|
||||
$objFloatingDrawing = new Drawing();
|
||||
$objFloatingDrawing->setPath('tests/data/Writer/XLSX/blue_square.png');
|
||||
|
||||
$coordinates = $sheet->getCell('B5')->getCoordinate();
|
||||
$objFloatingDrawing->setCoordinates($coordinates);
|
||||
$objFloatingDrawing->setOffsetX(1);
|
||||
$objFloatingDrawing->setOffsetY(1);
|
||||
$objFloatingDrawing->setWorksheet($sheet);
|
||||
|
||||
// Save spreadsheet to file and read it back
|
||||
$reloadedSpreadsheet = $this->writeAndReload($spreadsheet, 'Xlsx');
|
||||
$spreadsheet->disconnectWorksheets();
|
||||
|
||||
$sheet = $reloadedSpreadsheet->getSheet(1);
|
||||
$drawings = $sheet->getInCellDrawingCollection();
|
||||
self::assertCount(2, $drawings);
|
||||
|
||||
/** @var ?Drawing $drawing */
|
||||
$drawing = $sheet->getCell('C10')->getValue();
|
||||
|
||||
if ($drawing === null) {
|
||||
self::fail('Unexpected null drawing');
|
||||
} else {
|
||||
self::assertSame(IMAGETYPE_PNG, $drawing->getType());
|
||||
self::assertSame('C10', $drawing->getCoordinates());
|
||||
self::assertSame(100, $drawing->getWidth());
|
||||
self::assertSame(100, $drawing->getHeight());
|
||||
}
|
||||
|
||||
$floatingDrawings = $sheet->getDrawingCollection();
|
||||
|
||||
self::assertCount(1, $floatingDrawings);
|
||||
self::assertSame('B5', $floatingDrawings->getIterator()->current()->getCoordinates());
|
||||
self::assertNull($sheet->getCell('B5')->getValue());
|
||||
|
||||
$reloadedSpreadsheet->disconnectWorksheets();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user