[ Index ] |
PHP Cross Reference of moodle-2.8 |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * PHPExcel 4 * 5 * Copyright (c) 2006 - 2014 PHPExcel 6 * 7 * This library is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * This library is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with this library; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 * 21 * @category PHPExcel 22 * @package PHPExcel_Writer_Excel2007 23 * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel) 24 * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL 25 * @version ##VERSION##, ##DATE## 26 */ 27 28 29 /** 30 * PHPExcel_Writer_Excel2007 31 * 32 * @category PHPExcel 33 * @package PHPExcel_Writer_2007 34 * @copyright Copyright (c) 2006 - 2014 PHPExcel (http://www.codeplex.com/PHPExcel) 35 */ 36 class PHPExcel_Writer_Excel2007 extends PHPExcel_Writer_Abstract implements PHPExcel_Writer_IWriter 37 { 38 /** 39 * Pre-calculate formulas 40 * Forces PHPExcel to recalculate all formulae in a workbook when saving, so that the pre-calculated values are 41 * immediately available to MS Excel or other office spreadsheet viewer when opening the file 42 * 43 * Overrides the default TRUE for this specific writer for performance reasons 44 * 45 * @var boolean 46 */ 47 protected $_preCalculateFormulas = FALSE; 48 49 /** 50 * Office2003 compatibility 51 * 52 * @var boolean 53 */ 54 private $_office2003compatibility = false; 55 56 /** 57 * Private writer parts 58 * 59 * @var PHPExcel_Writer_Excel2007_WriterPart[] 60 */ 61 private $_writerParts = array(); 62 63 /** 64 * Private PHPExcel 65 * 66 * @var PHPExcel 67 */ 68 private $_spreadSheet; 69 70 /** 71 * Private string table 72 * 73 * @var string[] 74 */ 75 private $_stringTable = array(); 76 77 /** 78 * Private unique PHPExcel_Style_Conditional HashTable 79 * 80 * @var PHPExcel_HashTable 81 */ 82 private $_stylesConditionalHashTable; 83 84 /** 85 * Private unique PHPExcel_Style HashTable 86 * 87 * @var PHPExcel_HashTable 88 */ 89 private $_styleHashTable; 90 91 /** 92 * Private unique PHPExcel_Style_Fill HashTable 93 * 94 * @var PHPExcel_HashTable 95 */ 96 private $_fillHashTable; 97 98 /** 99 * Private unique PHPExcel_Style_Font HashTable 100 * 101 * @var PHPExcel_HashTable 102 */ 103 private $_fontHashTable; 104 105 /** 106 * Private unique PHPExcel_Style_Borders HashTable 107 * 108 * @var PHPExcel_HashTable 109 */ 110 private $_bordersHashTable ; 111 112 /** 113 * Private unique PHPExcel_Style_NumberFormat HashTable 114 * 115 * @var PHPExcel_HashTable 116 */ 117 private $_numFmtHashTable; 118 119 /** 120 * Private unique PHPExcel_Worksheet_BaseDrawing HashTable 121 * 122 * @var PHPExcel_HashTable 123 */ 124 private $_drawingHashTable; 125 126 /** 127 * Create a new PHPExcel_Writer_Excel2007 128 * 129 * @param PHPExcel $pPHPExcel 130 */ 131 public function __construct(PHPExcel $pPHPExcel = null) 132 { 133 // Assign PHPExcel 134 $this->setPHPExcel($pPHPExcel); 135 136 $writerPartsArray = array( 'stringtable' => 'PHPExcel_Writer_Excel2007_StringTable', 137 'contenttypes' => 'PHPExcel_Writer_Excel2007_ContentTypes', 138 'docprops' => 'PHPExcel_Writer_Excel2007_DocProps', 139 'rels' => 'PHPExcel_Writer_Excel2007_Rels', 140 'theme' => 'PHPExcel_Writer_Excel2007_Theme', 141 'style' => 'PHPExcel_Writer_Excel2007_Style', 142 'workbook' => 'PHPExcel_Writer_Excel2007_Workbook', 143 'worksheet' => 'PHPExcel_Writer_Excel2007_Worksheet', 144 'drawing' => 'PHPExcel_Writer_Excel2007_Drawing', 145 'comments' => 'PHPExcel_Writer_Excel2007_Comments', 146 'chart' => 'PHPExcel_Writer_Excel2007_Chart', 147 'relsvba' => 'PHPExcel_Writer_Excel2007_RelsVBA', 148 'relsribbonobjects' => 'PHPExcel_Writer_Excel2007_RelsRibbon' 149 ); 150 151 // Initialise writer parts 152 // and Assign their parent IWriters 153 foreach ($writerPartsArray as $writer => $class) { 154 $this->_writerParts[$writer] = new $class($this); 155 } 156 157 $hashTablesArray = array( '_stylesConditionalHashTable', '_fillHashTable', '_fontHashTable', 158 '_bordersHashTable', '_numFmtHashTable', '_drawingHashTable', 159 '_styleHashTable' 160 ); 161 162 // Set HashTable variables 163 foreach ($hashTablesArray as $tableName) { 164 $this->$tableName = new PHPExcel_HashTable(); 165 } 166 } 167 168 /** 169 * Get writer part 170 * 171 * @param string $pPartName Writer part name 172 * @return PHPExcel_Writer_Excel2007_WriterPart 173 */ 174 public function getWriterPart($pPartName = '') { 175 if ($pPartName != '' && isset($this->_writerParts[strtolower($pPartName)])) { 176 return $this->_writerParts[strtolower($pPartName)]; 177 } else { 178 return null; 179 } 180 } 181 182 /** 183 * Save PHPExcel to file 184 * 185 * @param string $pFilename 186 * @throws PHPExcel_Writer_Exception 187 */ 188 public function save($pFilename = null) 189 { 190 if ($this->_spreadSheet !== NULL) { 191 // garbage collect 192 $this->_spreadSheet->garbageCollect(); 193 194 // If $pFilename is php://output or php://stdout, make it a temporary file... 195 $originalFilename = $pFilename; 196 if (strtolower($pFilename) == 'php://output' || strtolower($pFilename) == 'php://stdout') { 197 $pFilename = @tempnam(PHPExcel_Shared_File::sys_get_temp_dir(), 'phpxltmp'); 198 if ($pFilename == '') { 199 $pFilename = $originalFilename; 200 } 201 } 202 203 $saveDebugLog = PHPExcel_Calculation::getInstance($this->_spreadSheet)->getDebugLog()->getWriteDebugLog(); 204 PHPExcel_Calculation::getInstance($this->_spreadSheet)->getDebugLog()->setWriteDebugLog(FALSE); 205 $saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType(); 206 PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL); 207 208 // Create string lookup table 209 $this->_stringTable = array(); 210 for ($i = 0; $i < $this->_spreadSheet->getSheetCount(); ++$i) { 211 $this->_stringTable = $this->getWriterPart('StringTable')->createStringTable($this->_spreadSheet->getSheet($i), $this->_stringTable); 212 } 213 214 // Create styles dictionaries 215 $this->_styleHashTable->addFromSource( $this->getWriterPart('Style')->allStyles($this->_spreadSheet) ); 216 $this->_stylesConditionalHashTable->addFromSource( $this->getWriterPart('Style')->allConditionalStyles($this->_spreadSheet) ); 217 $this->_fillHashTable->addFromSource( $this->getWriterPart('Style')->allFills($this->_spreadSheet) ); 218 $this->_fontHashTable->addFromSource( $this->getWriterPart('Style')->allFonts($this->_spreadSheet) ); 219 $this->_bordersHashTable->addFromSource( $this->getWriterPart('Style')->allBorders($this->_spreadSheet) ); 220 $this->_numFmtHashTable->addFromSource( $this->getWriterPart('Style')->allNumberFormats($this->_spreadSheet) ); 221 222 // Create drawing dictionary 223 $this->_drawingHashTable->addFromSource( $this->getWriterPart('Drawing')->allDrawings($this->_spreadSheet) ); 224 225 // Create new ZIP file and open it for writing 226 $zipClass = PHPExcel_Settings::getZipClass(); 227 $objZip = new $zipClass(); 228 229 // Retrieve OVERWRITE and CREATE constants from the instantiated zip class 230 // This method of accessing constant values from a dynamic class should work with all appropriate versions of PHP 231 $ro = new ReflectionObject($objZip); 232 $zipOverWrite = $ro->getConstant('OVERWRITE'); 233 $zipCreate = $ro->getConstant('CREATE'); 234 235 if (file_exists($pFilename)) { 236 unlink($pFilename); 237 } 238 // Try opening the ZIP file 239 if ($objZip->open($pFilename, $zipOverWrite) !== true) { 240 if ($objZip->open($pFilename, $zipCreate) !== true) { 241 throw new PHPExcel_Writer_Exception("Could not open " . $pFilename . " for writing."); 242 } 243 } 244 245 // Add [Content_Types].xml to ZIP file 246 $objZip->addFromString('[Content_Types].xml', $this->getWriterPart('ContentTypes')->writeContentTypes($this->_spreadSheet, $this->_includeCharts)); 247 248 //if hasMacros, add the vbaProject.bin file, Certificate file(if exists) 249 if($this->_spreadSheet->hasMacros()){ 250 $macrosCode=$this->_spreadSheet->getMacrosCode(); 251 if(!is_null($macrosCode)){// we have the code ? 252 $objZip->addFromString('xl/vbaProject.bin', $macrosCode);//allways in 'xl', allways named vbaProject.bin 253 if($this->_spreadSheet->hasMacrosCertificate()){//signed macros ? 254 // Yes : add the certificate file and the related rels file 255 $objZip->addFromString('xl/vbaProjectSignature.bin', $this->_spreadSheet->getMacrosCertificate()); 256 $objZip->addFromString('xl/_rels/vbaProject.bin.rels', 257 $this->getWriterPart('RelsVBA')->writeVBARelationships($this->_spreadSheet)); 258 } 259 } 260 } 261 //a custom UI in this workbook ? add it ("base" xml and additional objects (pictures) and rels) 262 if($this->_spreadSheet->hasRibbon()){ 263 $tmpRibbonTarget=$this->_spreadSheet->getRibbonXMLData('target'); 264 $objZip->addFromString($tmpRibbonTarget, $this->_spreadSheet->getRibbonXMLData('data')); 265 if($this->_spreadSheet->hasRibbonBinObjects()){ 266 $tmpRootPath=dirname($tmpRibbonTarget).'/'; 267 $ribbonBinObjects=$this->_spreadSheet->getRibbonBinObjects('data');//the files to write 268 foreach($ribbonBinObjects as $aPath=>$aContent){ 269 $objZip->addFromString($tmpRootPath.$aPath, $aContent); 270 } 271 //the rels for files 272 $objZip->addFromString($tmpRootPath.'_rels/'.basename($tmpRibbonTarget).'.rels', 273 $this->getWriterPart('RelsRibbonObjects')->writeRibbonRelationships($this->_spreadSheet)); 274 } 275 } 276 277 // Add relationships to ZIP file 278 $objZip->addFromString('_rels/.rels', $this->getWriterPart('Rels')->writeRelationships($this->_spreadSheet)); 279 $objZip->addFromString('xl/_rels/workbook.xml.rels', $this->getWriterPart('Rels')->writeWorkbookRelationships($this->_spreadSheet)); 280 281 // Add document properties to ZIP file 282 $objZip->addFromString('docProps/app.xml', $this->getWriterPart('DocProps')->writeDocPropsApp($this->_spreadSheet)); 283 $objZip->addFromString('docProps/core.xml', $this->getWriterPart('DocProps')->writeDocPropsCore($this->_spreadSheet)); 284 $customPropertiesPart = $this->getWriterPart('DocProps')->writeDocPropsCustom($this->_spreadSheet); 285 if ($customPropertiesPart !== NULL) { 286 $objZip->addFromString('docProps/custom.xml', $customPropertiesPart); 287 } 288 289 // Add theme to ZIP file 290 $objZip->addFromString('xl/theme/theme1.xml', $this->getWriterPart('Theme')->writeTheme($this->_spreadSheet)); 291 292 // Add string table to ZIP file 293 $objZip->addFromString('xl/sharedStrings.xml', $this->getWriterPart('StringTable')->writeStringTable($this->_stringTable)); 294 295 // Add styles to ZIP file 296 $objZip->addFromString('xl/styles.xml', $this->getWriterPart('Style')->writeStyles($this->_spreadSheet)); 297 298 // Add workbook to ZIP file 299 $objZip->addFromString('xl/workbook.xml', $this->getWriterPart('Workbook')->writeWorkbook($this->_spreadSheet, $this->_preCalculateFormulas)); 300 301 $chartCount = 0; 302 // Add worksheets 303 for ($i = 0; $i < $this->_spreadSheet->getSheetCount(); ++$i) { 304 $objZip->addFromString('xl/worksheets/sheet' . ($i + 1) . '.xml', $this->getWriterPart('Worksheet')->writeWorksheet($this->_spreadSheet->getSheet($i), $this->_stringTable, $this->_includeCharts)); 305 if ($this->_includeCharts) { 306 $charts = $this->_spreadSheet->getSheet($i)->getChartCollection(); 307 if (count($charts) > 0) { 308 foreach($charts as $chart) { 309 $objZip->addFromString('xl/charts/chart' . ($chartCount + 1) . '.xml', $this->getWriterPart('Chart')->writeChart($chart)); 310 $chartCount++; 311 } 312 } 313 } 314 } 315 316 $chartRef1 = $chartRef2 = 0; 317 // Add worksheet relationships (drawings, ...) 318 for ($i = 0; $i < $this->_spreadSheet->getSheetCount(); ++$i) { 319 320 // Add relationships 321 $objZip->addFromString('xl/worksheets/_rels/sheet' . ($i + 1) . '.xml.rels', $this->getWriterPart('Rels')->writeWorksheetRelationships($this->_spreadSheet->getSheet($i), ($i + 1), $this->_includeCharts)); 322 323 $drawings = $this->_spreadSheet->getSheet($i)->getDrawingCollection(); 324 $drawingCount = count($drawings); 325 if ($this->_includeCharts) { 326 $chartCount = $this->_spreadSheet->getSheet($i)->getChartCount(); 327 } 328 329 // Add drawing and image relationship parts 330 if (($drawingCount > 0) || ($chartCount > 0)) { 331 // Drawing relationships 332 $objZip->addFromString('xl/drawings/_rels/drawing' . ($i + 1) . '.xml.rels', $this->getWriterPart('Rels')->writeDrawingRelationships($this->_spreadSheet->getSheet($i),$chartRef1, $this->_includeCharts)); 333 334 // Drawings 335 $objZip->addFromString('xl/drawings/drawing' . ($i + 1) . '.xml', $this->getWriterPart('Drawing')->writeDrawings($this->_spreadSheet->getSheet($i),$chartRef2,$this->_includeCharts)); 336 } 337 338 // Add comment relationship parts 339 if (count($this->_spreadSheet->getSheet($i)->getComments()) > 0) { 340 // VML Comments 341 $objZip->addFromString('xl/drawings/vmlDrawing' . ($i + 1) . '.vml', $this->getWriterPart('Comments')->writeVMLComments($this->_spreadSheet->getSheet($i))); 342 343 // Comments 344 $objZip->addFromString('xl/comments' . ($i + 1) . '.xml', $this->getWriterPart('Comments')->writeComments($this->_spreadSheet->getSheet($i))); 345 } 346 347 // Add header/footer relationship parts 348 if (count($this->_spreadSheet->getSheet($i)->getHeaderFooter()->getImages()) > 0) { 349 // VML Drawings 350 $objZip->addFromString('xl/drawings/vmlDrawingHF' . ($i + 1) . '.vml', $this->getWriterPart('Drawing')->writeVMLHeaderFooterImages($this->_spreadSheet->getSheet($i))); 351 352 // VML Drawing relationships 353 $objZip->addFromString('xl/drawings/_rels/vmlDrawingHF' . ($i + 1) . '.vml.rels', $this->getWriterPart('Rels')->writeHeaderFooterDrawingRelationships($this->_spreadSheet->getSheet($i))); 354 355 // Media 356 foreach ($this->_spreadSheet->getSheet($i)->getHeaderFooter()->getImages() as $image) { 357 $objZip->addFromString('xl/media/' . $image->getIndexedFilename(), file_get_contents($image->getPath())); 358 } 359 } 360 } 361 362 // Add media 363 for ($i = 0; $i < $this->getDrawingHashTable()->count(); ++$i) { 364 if ($this->getDrawingHashTable()->getByIndex($i) instanceof PHPExcel_Worksheet_Drawing) { 365 $imageContents = null; 366 $imagePath = $this->getDrawingHashTable()->getByIndex($i)->getPath(); 367 if (strpos($imagePath, 'zip://') !== false) { 368 $imagePath = substr($imagePath, 6); 369 $imagePathSplitted = explode('#', $imagePath); 370 371 $imageZip = new ZipArchive(); 372 $imageZip->open($imagePathSplitted[0]); 373 $imageContents = $imageZip->getFromName($imagePathSplitted[1]); 374 $imageZip->close(); 375 unset($imageZip); 376 } else { 377 $imageContents = file_get_contents($imagePath); 378 } 379 380 $objZip->addFromString('xl/media/' . str_replace(' ', '_', $this->getDrawingHashTable()->getByIndex($i)->getIndexedFilename()), $imageContents); 381 } else if ($this->getDrawingHashTable()->getByIndex($i) instanceof PHPExcel_Worksheet_MemoryDrawing) { 382 ob_start(); 383 call_user_func( 384 $this->getDrawingHashTable()->getByIndex($i)->getRenderingFunction(), 385 $this->getDrawingHashTable()->getByIndex($i)->getImageResource() 386 ); 387 $imageContents = ob_get_contents(); 388 ob_end_clean(); 389 390 $objZip->addFromString('xl/media/' . str_replace(' ', '_', $this->getDrawingHashTable()->getByIndex($i)->getIndexedFilename()), $imageContents); 391 } 392 } 393 394 PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType); 395 PHPExcel_Calculation::getInstance($this->_spreadSheet)->getDebugLog()->setWriteDebugLog($saveDebugLog); 396 397 // Close file 398 if ($objZip->close() === false) { 399 throw new PHPExcel_Writer_Exception("Could not close zip file $pFilename."); 400 } 401 402 // If a temporary file was used, copy it to the correct file stream 403 if ($originalFilename != $pFilename) { 404 if (copy($pFilename, $originalFilename) === false) { 405 throw new PHPExcel_Writer_Exception("Could not copy temporary zip file $pFilename to $originalFilename."); 406 } 407 @unlink($pFilename); 408 } 409 } else { 410 throw new PHPExcel_Writer_Exception("PHPExcel object unassigned."); 411 } 412 } 413 414 /** 415 * Get PHPExcel object 416 * 417 * @return PHPExcel 418 * @throws PHPExcel_Writer_Exception 419 */ 420 public function getPHPExcel() { 421 if ($this->_spreadSheet !== null) { 422 return $this->_spreadSheet; 423 } else { 424 throw new PHPExcel_Writer_Exception("No PHPExcel assigned."); 425 } 426 } 427 428 /** 429 * Set PHPExcel object 430 * 431 * @param PHPExcel $pPHPExcel PHPExcel object 432 * @throws PHPExcel_Writer_Exception 433 * @return PHPExcel_Writer_Excel2007 434 */ 435 public function setPHPExcel(PHPExcel $pPHPExcel = null) { 436 $this->_spreadSheet = $pPHPExcel; 437 return $this; 438 } 439 440 /** 441 * Get string table 442 * 443 * @return string[] 444 */ 445 public function getStringTable() { 446 return $this->_stringTable; 447 } 448 449 /** 450 * Get PHPExcel_Style HashTable 451 * 452 * @return PHPExcel_HashTable 453 */ 454 public function getStyleHashTable() { 455 return $this->_styleHashTable; 456 } 457 458 /** 459 * Get PHPExcel_Style_Conditional HashTable 460 * 461 * @return PHPExcel_HashTable 462 */ 463 public function getStylesConditionalHashTable() { 464 return $this->_stylesConditionalHashTable; 465 } 466 467 /** 468 * Get PHPExcel_Style_Fill HashTable 469 * 470 * @return PHPExcel_HashTable 471 */ 472 public function getFillHashTable() { 473 return $this->_fillHashTable; 474 } 475 476 /** 477 * Get PHPExcel_Style_Font HashTable 478 * 479 * @return PHPExcel_HashTable 480 */ 481 public function getFontHashTable() { 482 return $this->_fontHashTable; 483 } 484 485 /** 486 * Get PHPExcel_Style_Borders HashTable 487 * 488 * @return PHPExcel_HashTable 489 */ 490 public function getBordersHashTable() { 491 return $this->_bordersHashTable; 492 } 493 494 /** 495 * Get PHPExcel_Style_NumberFormat HashTable 496 * 497 * @return PHPExcel_HashTable 498 */ 499 public function getNumFmtHashTable() { 500 return $this->_numFmtHashTable; 501 } 502 503 /** 504 * Get PHPExcel_Worksheet_BaseDrawing HashTable 505 * 506 * @return PHPExcel_HashTable 507 */ 508 public function getDrawingHashTable() { 509 return $this->_drawingHashTable; 510 } 511 512 /** 513 * Get Office2003 compatibility 514 * 515 * @return boolean 516 */ 517 public function getOffice2003Compatibility() { 518 return $this->_office2003compatibility; 519 } 520 521 /** 522 * Set Office2003 compatibility 523 * 524 * @param boolean $pValue Office2003 compatibility? 525 * @return PHPExcel_Writer_Excel2007 526 */ 527 public function setOffice2003Compatibility($pValue = false) { 528 $this->_office2003compatibility = $pValue; 529 return $this; 530 } 531 532 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 20:29:05 2014 | Cross-referenced by PHPXref 0.7.1 |