/** * Write MSODRAWING record */ private function _writeMsoDrawing() { // check if there are any shapes for this sheet if (count($this->_phpSheet->getDrawingCollection()) == 0) { return; } // create intermediate Escher object $escher = new Shared_Escher(); // dgContainer $dgContainer = new Shared_Escher_DgContainer(); // set the drawing index (we use sheet index + 1) $dgContainer->setDgId($this->_phpSheet->getParent()->getIndex($this->_phpSheet) + 1); $escher->setDgContainer($dgContainer); // spgrContainer $spgrContainer = new Shared_Escher_DgContainer_SpgrContainer(); $dgContainer->setSpgrContainer($spgrContainer); // add one shape which is the group shape $spContainer = new Shared_Escher_DgContainer_SpgrContainer_SpContainer(); $spContainer->setSpgr(true); $spContainer->setSpType(0); $spContainer->setSpId($this->_phpSheet->getParent()->getIndex($this->_phpSheet) + 1 << 10); $spgrContainer->addChild($spContainer); // add the shapes // outer loop is for determining BSE index $blipIndex = 0; // 1-based index to BstoreContainer $countShapes = 0; // count number of shapes (minus group shape), in this sheet foreach ($this->_phpSheet->getParent()->getAllsheets() as $sheet) { foreach ($sheet->getDrawingCollection() as $drawing) { ++$blipIndex; if ($sheet === $this->_phpSheet) { ++$countShapes; // add the shape $spContainer = new Shared_Escher_DgContainer_SpgrContainer_SpContainer(); // set the shape type $spContainer->setSpType(0x4b); // set the shape index (we combine 1-based sheet index and $countShapes to create unique shape index) $spId = $countShapes | $this->_phpSheet->getParent()->getIndex($this->_phpSheet) + 1 << 10; $spContainer->setSpId($spId); // keep track of last spId $lastSpId = $spId; // set the BLIP index $spContainer->setOPT(0x4104, $blipIndex); // set coordinates and offsets, client anchor $coordinates = $drawing->getCoordinates(); $offsetX = $drawing->getOffsetX(); $offsetY = $drawing->getOffsetY(); $width = $drawing->getWidth(); $height = $drawing->getHeight(); $twoAnchor = Shared_Excel5::oneAnchor2twoAnchor($this->_phpSheet, $coordinates, $offsetX, $offsetY, $width, $height); $spContainer->setStartCoordinates($twoAnchor['startCoordinates']); $spContainer->setStartOffsetX($twoAnchor['startOffsetX']); $spContainer->setStartOffsetY($twoAnchor['startOffsetY']); $spContainer->setEndCoordinates($twoAnchor['endCoordinates']); $spContainer->setEndOffsetX($twoAnchor['endOffsetX']); $spContainer->setEndOffsetY($twoAnchor['endOffsetY']); $spgrContainer->addChild($spContainer); } } } // set last shape index $dgContainer->setLastSpId($lastSpId); // write the Escher stream $writer = new Writer_Excel5_Escher($escher); $data = $writer->close(); $spOffsets = $writer->getSpOffsets(); // write the neccesary MSODRAWING, OBJ records // split the Escher stream $spOffsets[0] = 0; $nm = count($spOffsets) - 1; // number of shapes excluding first shape for ($i = 1; $i <= $nm; ++$i) { // MSODRAWING record $record = 0xec; // Record identifier // chunk of Escher stream for one shape $dataChunk = substr($data, $spOffsets[$i - 1], $spOffsets[$i] - $spOffsets[$i - 1]); $length = strlen($dataChunk); $header = pack("vv", $record, $length); $this->_append($header . $dataChunk); // OBJ record $record = 0x5d; // record identifier $objData = ''; // ftCmo $objData .= pack('vvvvvVVV', 0x15, 0x12, 0x8, $i, 0x6011, 0, 0, 0); // ftEnd $objData .= pack('vv', 0x0, 0x0); $length = strlen($objData); $header = pack('vv', $record, $length); $this->_append($header . $objData); } }