* @link http://docs.oasis-open.org/office/v1.2/os/OpenDocument-v1.2-os.html */ class PHPExcel_Writer_OpenDocument extends PHPExcel_Writer_Abstract implements PHPExcel_Writer_IWriter { /** * Private writer parts * * @var PHPExcel_Writer_OpenDocument_WriterPart[] */ private $_writerParts = array(); /** * Private PHPExcel * * @var PHPExcel */ private $_spreadSheet; /** * Create a new PHPExcel_Writer_OpenDocument * * @param PHPExcel $pPHPExcel */ public function __construct(PHPExcel $pPHPExcel = null) { $this->setPHPExcel($pPHPExcel); $writerPartsArray = array( 'content' => 'PHPExcel_Writer_OpenDocument_Content', 'meta' => 'PHPExcel_Writer_OpenDocument_Meta', 'meta_inf' => 'PHPExcel_Writer_OpenDocument_MetaInf', 'mimetype' => 'PHPExcel_Writer_OpenDocument_Mimetype', 'settings' => 'PHPExcel_Writer_OpenDocument_Settings', 'styles' => 'PHPExcel_Writer_OpenDocument_Styles', 'thumbnails' => 'PHPExcel_Writer_OpenDocument_Thumbnails' ); foreach ($writerPartsArray as $writer => $class) { $this->_writerParts[$writer] = new $class($this); } } /** * Get writer part * * @param string $pPartName Writer part name * @return PHPExcel_Writer_Excel2007_WriterPart */ public function getWriterPart($pPartName = '') { if ($pPartName != '' && isset($this->_writerParts[strtolower($pPartName)])) { return $this->_writerParts[strtolower($pPartName)]; } else { return null; } } /** * Save PHPExcel to file * * @param string $pFilename * @throws PHPExcel_Writer_Exception */ public function save($pFilename = NULL) { if (!$this->_spreadSheet) { throw new PHPExcel_Writer_Exception('PHPExcel object unassigned.'); } // garbage collect $this->_spreadSheet->garbageCollect(); // If $pFilename is php://output or php://stdout, make it a temporary file... $originalFilename = $pFilename; if (strtolower($pFilename) == 'php://output' || strtolower($pFilename) == 'php://stdout') { $pFilename = @tempnam(PHPExcel_Shared_File::sys_get_temp_dir(), 'phpxltmp'); if ($pFilename == '') { $pFilename = $originalFilename; } } $objZip = $this->_createZip($pFilename); $objZip->addFromString('META-INF/manifest.xml', $this->getWriterPart('meta_inf')->writeManifest()); $objZip->addFromString('Thumbnails/thumbnail.png', $this->getWriterPart('thumbnails')->writeThumbnail()); $objZip->addFromString('content.xml', $this->getWriterPart('content')->write()); $objZip->addFromString('meta.xml', $this->getWriterPart('meta')->write()); $objZip->addFromString('mimetype', $this->getWriterPart('mimetype')->write()); $objZip->addFromString('settings.xml', $this->getWriterPart('settings')->write()); $objZip->addFromString('styles.xml', $this->getWriterPart('styles')->write()); // Close file if ($objZip->close() === false) { throw new PHPExcel_Writer_Exception("Could not close zip file $pFilename."); } // If a temporary file was used, copy it to the correct file stream if ($originalFilename != $pFilename) { if (copy($pFilename, $originalFilename) === false) { throw new PHPExcel_Writer_Exception("Could not copy temporary zip file $pFilename to $originalFilename."); } @unlink($pFilename); } } /** * Create zip object * * @param string $pFilename * @throws PHPExcel_Writer_Exception * @return ZipArchive */ private function _createZip($pFilename) { // Create new ZIP file and open it for writing $zipClass = PHPExcel_Settings::getZipClass(); $objZip = new $zipClass(); // Retrieve OVERWRITE and CREATE constants from the instantiated zip class // This method of accessing constant values from a dynamic class should work with all appropriate versions of PHP $ro = new ReflectionObject($objZip); $zipOverWrite = $ro->getConstant('OVERWRITE'); $zipCreate = $ro->getConstant('CREATE'); if (file_exists($pFilename)) { unlink($pFilename); } // Try opening the ZIP file if ($objZip->open($pFilename, $zipOverWrite) !== true) { if ($objZip->open($pFilename, $zipCreate) !== true) { throw new PHPExcel_Writer_Exception("Could not open $pFilename for writing."); } } return $objZip; } /** * Get PHPExcel object * * @return PHPExcel * @throws PHPExcel_Writer_Exception */ public function getPHPExcel() { if ($this->_spreadSheet !== null) { return $this->_spreadSheet; } else { throw new PHPExcel_Writer_Exception('No PHPExcel assigned.'); } } /** * Set PHPExcel object * * @param PHPExcel $pPHPExcel PHPExcel object * @throws PHPExcel_Writer_Exception * @return PHPExcel_Writer_Excel2007 */ public function setPHPExcel(PHPExcel $pPHPExcel = null) { $this->_spreadSheet = $pPHPExcel; return $this; } }