From 5f40cd3a067c1138c390a6cb12caede41e1c2592 Mon Sep 17 00:00:00 2001 From: oleibman <10341515+oleibman@users.noreply.github.com> Date: Mon, 10 Aug 2026 00:40:26 -0700 Subject: [PATCH] Fix Problem with Multiple Images on Multiple Sheets Sample 25 now provides better coverage. --- samples/Basic2/25_In_memory_image.php | 70 ++++++++++++++++------- src/PhpSpreadsheet/Writer/Ods/Content.php | 10 ++-- 2 files changed, 55 insertions(+), 25 deletions(-) diff --git a/samples/Basic2/25_In_memory_image.php b/samples/Basic2/25_In_memory_image.php index 521275ce9..a18880eae 100644 --- a/samples/Basic2/25_In_memory_image.php +++ b/samples/Basic2/25_In_memory_image.php @@ -11,10 +11,6 @@ require __DIR__ . '/../Header.php'; $helper->log('Create new Spreadsheet object'); $spreadsheet = new Spreadsheet(); $sheet1 = $spreadsheet->getActiveSheet(); -$sheet1->setTitle('SheetWithData'); -$sheet1->getCell('G1')->setValue('X'); -$sheet1->getCell('E5')->setValue('Y'); -$sheet1->getCell('A8')->setValue('Z'); // Set document properties $helper->log('Set document properties'); @@ -26,24 +22,24 @@ $spreadsheet->getProperties()->setCreator('Maarten Balliauw') ->setKeywords('office 2007 openxml php') ->setCategory('Test result file'); -// Generate an image -$helper->log('Generate an image'); +$sheet1->setTitle('JpegWithData'); +$sheet1->getCell('G1')->setValue('X'); +$sheet1->getCell('E5')->setValue('Y'); +$sheet1->getCell('A8')->setValue('Z'); +$helper->log('Generate an image as jpg'); $gdImage = imagecreatetruecolor(150, 20); if (!$gdImage) { throw new Exception('Cannot Initialize new GD image stream'); } - $textColor = imagecolorallocate($gdImage, 255, 255, 255); if ($textColor === false) { throw new Exception('imagecolorallocate failed'); } -imagestring($gdImage, 1, 5, 5, 'Created with PhpSpreadsheet', $textColor); - -// Add a drawing to the worksheet -$helper->log('Add a drawing to the worksheet'); +imagestring($gdImage, 1, 5, 5, 'Jpeg made with PhpSpreadsheet', $textColor); +$helper->log('Add image to the worksheet'); $drawing = new MemoryDrawing(); -$drawing->setName('Sample image'); -$drawing->setDescription('Sample image'); +$drawing->setName('Sample JPEG image'); +$drawing->setDescription('Sample JPEG image'); $drawing->setImageResource($gdImage); $drawing->setRenderingFunction(MemoryDrawing::RENDERING_JPEG); $drawing->setMimeType(MemoryDrawing::MIMETYPE_DEFAULT); @@ -53,20 +49,54 @@ $drawing->setCoordinates('C5'); $helper->log('Create new sheet'); $sheet2 = $spreadsheet->createSheet(); -$sheet2->setTitle('SheetWithoutData'); - +$sheet2->setTitle('Gif'); +$helper->log('Generate a second image as gif'); +$gdImage2 = imagecreatetruecolor(150, 20); +if (!$gdImage2) { + throw new Exception('Cannot Initialize new GD image stream'); +} +$textColor = imagecolorallocate($gdImage, 255, 255, 255); +if ($textColor === false) { + throw new Exception('imagecolorallocate failed'); +} +imagestring($gdImage2, 1, 5, 5, 'Gif made with PhpSpreadsheet', $textColor); // Add a drawing to the new worksheet -$helper->log('Add a drawing to the new worksheet'); +$helper->log('Add image to the new worksheet'); $drawing = new MemoryDrawing(); -$drawing->setName('Sample image'); -$drawing->setDescription('Sample image'); -$drawing->setImageResource($gdImage); -$drawing->setRenderingFunction(MemoryDrawing::RENDERING_JPEG); +$drawing->setName('Sample GIF image'); +$drawing->setDescription('Sample GIF image'); +$drawing->setImageResource($gdImage2); +$drawing->setRenderingFunction(MemoryDrawing::RENDERING_GIF); $drawing->setMimeType(MemoryDrawing::MIMETYPE_DEFAULT); $drawing->setHeight(36); $drawing->setWorksheet($sheet2); $drawing->setCoordinates('C5'); +$helper->log('Create a third sheet'); +$sheet3 = $spreadsheet->createSheet(); +$sheet3->setTitle('Png'); +$helper->log('Generate a third image as png'); +$gdImage3 = imagecreatetruecolor(150, 20); +if (!$gdImage3) { + throw new Exception('Cannot Initialize new GD image stream'); +} +$textColor = imagecolorallocate($gdImage3, 255, 255, 255); +if ($textColor === false) { + throw new Exception('imagecolorallocate failed'); +} +imagestring($gdImage3, 1, 5, 5, 'Png made with PhpSpreadsheet', $textColor); +// Add a drawing to the new worksheet +$helper->log('Add image to the new worksheet'); +$drawing = new MemoryDrawing(); +$drawing->setName('Sample PNG image'); +$drawing->setDescription('Sample PNG image'); +$drawing->setImageResource($gdImage3); +$drawing->setRenderingFunction(MemoryDrawing::RENDERING_PNG); +$drawing->setMimeType(MemoryDrawing::MIMETYPE_DEFAULT); +$drawing->setHeight(36); +$drawing->setWorksheet($sheet3); +$drawing->setCoordinates('C5'); + // Save $helper->write( $spreadsheet, diff --git a/src/PhpSpreadsheet/Writer/Ods/Content.php b/src/PhpSpreadsheet/Writer/Ods/Content.php index 3397e96c2..f623e2037 100644 --- a/src/PhpSpreadsheet/Writer/Ods/Content.php +++ b/src/PhpSpreadsheet/Writer/Ods/Content.php @@ -29,6 +29,8 @@ class Content extends WriterPart private Drawing $drawingWriter; + private int $drawingIndex = 0; + /** * Set parent Ods writer. */ @@ -172,15 +174,14 @@ class Content extends WriterPart // Build a map of drawings by their row position /** @var array> */ $drawingsByRow = []; - $drawingIndex = 0; foreach ($sheet->getDrawingCollection() as $drawing) { - ++$drawingIndex; + ++$this->drawingIndex; $coordinates = Coordinate::coordinateFromString($drawing->getCoordinates()); $row = (int) $coordinates[1]; if (!isset($drawingsByRow[$row])) { $drawingsByRow[$row] = []; } - $drawingsByRow[$row][] = ['drawing' => $drawing, 'index' => $drawingIndex]; + $drawingsByRow[$row][] = ['drawing' => $drawing, 'index' => $this->drawingIndex]; } foreach ($rows as $row) { @@ -446,7 +447,7 @@ class Content extends WriterPart // and would prefer to eliminate the code and have // someone raise an issue rather than have them // execute unpredictable code. - /* + foreach ($drawingsByColumn as $column => $drawingData) { if ($column > $prevColumn) { $this->writeCellSpan($objWriter, $column, $prevColumn); @@ -463,7 +464,6 @@ class Content extends WriterPart $prevColumn = $column; } } - */ } /**