mirror of
https://github.com/PHPOffice/PhpSpreadsheet.git
synced 2026-09-18 14:06:34 +00:00
Allow writing Drawing in Cell
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user