Пример #1
1
 /**
  * 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);
             } else {
                 if ($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);
 }
Пример #2
0
 /**
  * Writes the MSODRAWINGGROUP record if needed. Possibly split using CONTINUE records.
  */
 private function _writeMsoDrawingGroup()
 {
     // any drawings in this workbook?
     $found = false;
     foreach ($this->_phpExcel->getAllSheets() as $sheet) {
         if (count($sheet->getDrawingCollection()) > 0) {
             $found = true;
         }
     }
     // if there are drawings, then we need to write MSODRAWINGGROUP record
     if ($found) {
         // create intermediate Escher object
         $escher = new PHPExcel_Shared_Escher();
         // dggContainer
         $dggContainer = new PHPExcel_Shared_Escher_DggContainer();
         $escher->setDggContainer($dggContainer);
         // 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;
                             $imageResource = imagecreatefromgif($filename);
                             ob_start();
                             imagepng($imageResource);
                             $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;
                             $imageResource = PHPExcel_Shared_Drawing::imagecreatefrombmp($filename);
                             ob_start();
                             imagepng($imageResource);
                             $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);
                 } else {
                     if ($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);
                     }
                 }
             }
         }
         // write the Escher stream from the intermediate Escher object
         $writer = new PHPExcel_Writer_Excel5_Escher($escher);
         $data = $writer->close();
         $record = 0xeb;
         $length = strlen($data);
         $header = pack("vv", $record, $length);
         return $this->writeData($header . $data);
     }
 }