/** * Build the Escher object corresponding to the MSODRAWINGGROUP record */ private function buildWorkbookEscher() { $escher = null; // any drawings in this workbook? $found = false; foreach ($this->phpExcel->getAllSheets() as $sheet) { if (count($sheet->getDrawingCollection()) > 0) { $found = true; break; } } // nothing to do if there are no drawings if (!$found) { return; } // if we reach here, then there are drawings in the workbook $escher = new \PHPExcel\Shared\Escher(); // dggContainer $dggContainer = new \PHPExcel\Shared\Escher\DggContainer(); $escher->setDggContainer($dggContainer); // set IDCLs (identifier clusters) $dggContainer->setIDCLs($this->IDCLs); // this loop is for determining maximum shape identifier of all drawing $spIdMax = 0; $totalCountShapes = 0; $countDrawings = 0; foreach ($this->phpExcel->getAllsheets() as $sheet) { $sheetCountShapes = 0; // count number of shapes (minus group shape), in sheet if (count($sheet->getDrawingCollection()) > 0) { ++$countDrawings; foreach ($sheet->getDrawingCollection() as $drawing) { ++$sheetCountShapes; ++$totalCountShapes; $spId = $sheetCountShapes | $this->phpExcel->getIndex($sheet) + 1 << 10; $spIdMax = max($spId, $spIdMax); } } } $dggContainer->setSpIdMax($spIdMax + 1); $dggContainer->setCDgSaved($countDrawings); $dggContainer->setCSpSaved($totalCountShapes + $countDrawings); // total number of shapes incl. one group shapes per drawing // bstoreContainer $bstoreContainer = new \PHPExcel\Shared\Escher\DggContainer\BstoreContainer(); $dggContainer->setBstoreContainer($bstoreContainer); // the BSE's (all the images) foreach ($this->phpExcel->getAllsheets() as $sheet) { foreach ($sheet->getDrawingCollection() as $drawing) { if ($drawing instanceof \PHPExcel\Worksheet\Drawing) { $filename = $drawing->getPath(); list($imagesx, $imagesy, $imageFormat) = getimagesize($filename); switch ($imageFormat) { case 1: // GIF, not supported by BIFF8, we convert to PNG $blipType = \PHPExcel\Shared\Escher\DggContainer\BstoreContainer\BSE::BLIPTYPE_PNG; ob_start(); imagepng(imagecreatefromgif($filename)); $blipData = ob_get_contents(); ob_end_clean(); break; case 2: // JPEG $blipType = \PHPExcel\Shared\Escher\DggContainer\BstoreContainer\BSE::BLIPTYPE_JPEG; $blipData = file_get_contents($filename); break; case 3: // PNG $blipType = \PHPExcel\Shared\Escher\DggContainer\BstoreContainer\BSE::BLIPTYPE_PNG; $blipData = file_get_contents($filename); break; case 6: // Windows DIB (BMP), we convert to PNG $blipType = \PHPExcel\Shared\Escher\DggContainer\BstoreContainer\BSE::BLIPTYPE_PNG; ob_start(); imagepng(\PHPExcel\Shared\Drawing::imagecreatefrombmp($filename)); $blipData = ob_get_contents(); ob_end_clean(); break; default: continue 2; } $blip = new \PHPExcel\Shared\Escher\DggContainer\BstoreContainer\BSE\Blip(); $blip->setData($blipData); $BSE = new \PHPExcel\Shared\Escher\DggContainer\BstoreContainer\BSE(); $BSE->setBlipType($blipType); $BSE->setBlip($blip); $bstoreContainer->addBSE($BSE); } elseif ($drawing instanceof \PHPExcel\Worksheet\MemoryDrawing) { switch ($drawing->getRenderingFunction()) { case \PHPExcel\Worksheet\MemoryDrawing::RENDERING_JPEG: $blipType = \PHPExcel\Shared\Escher\DggContainer\BstoreContainer\BSE::BLIPTYPE_JPEG; $renderingFunction = 'imagejpeg'; break; case \PHPExcel\Worksheet\MemoryDrawing::RENDERING_GIF: case \PHPExcel\Worksheet\MemoryDrawing::RENDERING_PNG: case \PHPExcel\Worksheet\MemoryDrawing::RENDERING_DEFAULT: $blipType = \PHPExcel\Shared\Escher\DggContainer\BstoreContainer\BSE::BLIPTYPE_PNG; $renderingFunction = 'imagepng'; break; } ob_start(); call_user_func($renderingFunction, $drawing->getImageResource()); $blipData = ob_get_contents(); ob_end_clean(); $blip = new \PHPExcel\Shared\Escher\DggContainer\BstoreContainer\BSE\Blip(); $blip->setData($blipData); $BSE = new \PHPExcel\Shared\Escher\DggContainer\BstoreContainer\BSE(); $BSE->setBlipType($blipType); $BSE->setBlip($blip); $bstoreContainer->addBSE($BSE); } } } // Set the Escher object $this->writerWorkbook->setEscher($escher); }