Allow writing Drawing in Cell

This commit is contained in:
tlallement
2025-10-06 17:57:42 +02:00
parent a9581496b4
commit 75286c3e88
2 changed files with 45 additions and 0 deletions
@@ -9,6 +9,7 @@ use PhpOffice\PhpSpreadsheet\Calculation\Exception as CalculationException;
use PhpOffice\PhpSpreadsheet\Exception as SpreadsheetException;
use PhpOffice\PhpSpreadsheet\RichText\RichText;
use PhpOffice\PhpSpreadsheet\Shared\StringHelper;
use PhpOffice\PhpSpreadsheet\Worksheet\BaseDrawing;
use Stringable;
class DefaultValueBinder implements IValueBinder
@@ -33,6 +34,11 @@ class DefaultValueBinder implements IValueBinder
$value = $value->format('Y-m-d H:i:s');
} elseif ($value instanceof Stringable) {
$value = (string) $value;
} elseif ($value instanceof BaseDrawing) {
$value->setCoordinates($cell->getCoordinate());
$value->setResizeProportional(false);
$value->setInCell(true);
$value->setWorksheet($cell->getWorksheet());
} else {
throw new SpreadsheetException('Unable to bind unstringable ' . gettype($value));
}
@@ -68,6 +74,9 @@ class DefaultValueBinder implements IValueBinder
if ($value instanceof RichText) {
return DataType::TYPE_INLINE;
}
if ($value instanceof BaseDrawing) {
return DataType::TYPE_DRAWING_IN_CELL;
}
if ($value instanceof Stringable) {
$value = (string) $value;
}
@@ -5,6 +5,7 @@ declare(strict_types=1);
namespace PhpOffice\PhpSpreadsheetTests\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Reader\Xlsx;
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
use PhpOffice\PhpSpreadsheetTests\Functional\AbstractFunctional;
class DrawingInCellTest extends AbstractFunctional
@@ -58,4 +59,39 @@ class DrawingInCellTest extends AbstractFunctional
$reloadedSpreadsheet->disconnectWorksheets();
}
public function testWriteNewPictureInCell(): void
{
$file = 'tests/data/Writer/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);
// 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());
}
$reloadedSpreadsheet->disconnectWorksheets();
}
}