ILIAS  release_5-3 Revision v5.3.23-19-g915713cf615
PHPExcel_Writer_Excel5 Class Reference
+ Inheritance diagram for PHPExcel_Writer_Excel5:
+ Collaboration diagram for PHPExcel_Writer_Excel5:

Public Member Functions

 __construct (PHPExcel $phpExcel)
 Create a new PHPExcel_Writer_Excel5. More...
 
 save ($pFilename=null)
 Save PHPExcel to file. More...
 
 setTempDir ($pValue='')
 Set temporary storage directory. More...
 
- Public Member Functions inherited from PHPExcel_Writer_Abstract
 getIncludeCharts ()
 Write charts in workbook? If this is true, then the Writer will write definitions for any charts that exist in the PHPExcel object. More...
 
 setIncludeCharts ($pValue=FALSE)
 Set write charts in workbook Set to true, to advise the Writer to include any charts that exist in the PHPExcel object. More...
 
 getPreCalculateFormulas ()
 Get Pre-Calculate Formulas flag If this is true (the default), then the writer will recalculate all formulae in a workbook when saving, so that the pre-calculated values are immediately available to MS Excel or other office spreadsheet viewer when opening the file If false, then formulae are not calculated on save. More...
 
 setPreCalculateFormulas ($pValue=TRUE)
 Set Pre-Calculate Formulas Set to true (the default) to advise the Writer to calculate all formulae on save Set to false to prevent precalculation of formulae on save. More...
 
 getUseDiskCaching ()
 Get use disk caching where possible? More...
 
 setUseDiskCaching ($pValue=FALSE, $pDirectory=NULL)
 Set use disk caching where possible? More...
 
 getDiskCachingDirectory ()
 Get disk caching directory. More...
 

Private Member Functions

 _buildWorksheetEschers ()
 Build the Worksheet Escher objects. More...
 
 _buildWorkbookEscher ()
 Build the Escher object corresponding to the MSODRAWINGGROUP record. More...
 
 _writeDocumentSummaryInformation ()
 Build the OLE Part for DocumentSummary Information. More...
 
 _writeSummaryInformation ()
 Build the OLE Part for Summary Information. More...
 

Private Attributes

 $_phpExcel
 
 $_str_total = 0
 
 $_str_unique = 0
 
 $_str_table = array()
 
 $_colors
 
 $_parser
 
 $_IDCLs
 
 $_summaryInformation
 
 $_documentSummaryInformation
 

Additional Inherited Members

- Protected Attributes inherited from PHPExcel_Writer_Abstract
 $_includeCharts = FALSE
 
 $_preCalculateFormulas = TRUE
 
 $_useDiskCaching = FALSE
 
 $_diskCachingDirectory = './'
 

Detailed Description

Definition at line 36 of file Excel5.php.

Constructor & Destructor Documentation

◆ __construct()

PHPExcel_Writer_Excel5::__construct ( PHPExcel  $phpExcel)

Create a new PHPExcel_Writer_Excel5.

Parameters
PHPExcel$phpExcelPHPExcel object

Definition at line 106 of file Excel5.php.

106  {
107  $this->_phpExcel = $phpExcel;
108 
109  $this->_parser = new PHPExcel_Writer_Excel5_Parser();
110  }

Member Function Documentation

◆ _buildWorkbookEscher()

PHPExcel_Writer_Excel5::_buildWorkbookEscher ( )
private

Build the Escher object corresponding to the MSODRAWINGGROUP record.

Definition at line 412 of file Excel5.php.

References $filename, PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE\BLIPTYPE_JPEG, PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE\BLIPTYPE_PNG, PHPExcel_Shared_Drawing\imagecreatefrombmp(), PHPExcel_Worksheet_MemoryDrawing\RENDERING_DEFAULT, PHPExcel_Worksheet_MemoryDrawing\RENDERING_GIF, PHPExcel_Worksheet_MemoryDrawing\RENDERING_JPEG, and PHPExcel_Worksheet_MemoryDrawing\RENDERING_PNG.

Referenced by save().

413  {
414  $escher = null;
415 
416  // any drawings in this workbook?
417  $found = false;
418  foreach ($this->_phpExcel->getAllSheets() as $sheet) {
419  if (count($sheet->getDrawingCollection()) > 0) {
420  $found = true;
421  break;
422  }
423  }
424 
425  // nothing to do if there are no drawings
426  if (!$found) {
427  return;
428  }
429 
430  // if we reach here, then there are drawings in the workbook
431  $escher = new PHPExcel_Shared_Escher();
432 
433  // dggContainer
434  $dggContainer = new PHPExcel_Shared_Escher_DggContainer();
435  $escher->setDggContainer($dggContainer);
436 
437  // set IDCLs (identifier clusters)
438  $dggContainer->setIDCLs($this->_IDCLs);
439 
440  // this loop is for determining maximum shape identifier of all drawing
441  $spIdMax = 0;
442  $totalCountShapes = 0;
443  $countDrawings = 0;
444 
445  foreach ($this->_phpExcel->getAllsheets() as $sheet) {
446  $sheetCountShapes = 0; // count number of shapes (minus group shape), in sheet
447 
448  if (count($sheet->getDrawingCollection()) > 0) {
449  ++$countDrawings;
450 
451  foreach ($sheet->getDrawingCollection() as $drawing) {
452  ++$sheetCountShapes;
453  ++$totalCountShapes;
454 
455  $spId = $sheetCountShapes
456  | ($this->_phpExcel->getIndex($sheet) + 1) << 10;
457  $spIdMax = max($spId, $spIdMax);
458  }
459  }
460  }
461 
462  $dggContainer->setSpIdMax($spIdMax + 1);
463  $dggContainer->setCDgSaved($countDrawings);
464  $dggContainer->setCSpSaved($totalCountShapes + $countDrawings); // total number of shapes incl. one group shapes per drawing
465 
466  // bstoreContainer
468  $dggContainer->setBstoreContainer($bstoreContainer);
469 
470  // the BSE's (all the images)
471  foreach ($this->_phpExcel->getAllsheets() as $sheet) {
472  foreach ($sheet->getDrawingCollection() as $drawing) {
473  if ($drawing instanceof PHPExcel_Worksheet_Drawing) {
474 
475  $filename = $drawing->getPath();
476 
477  list($imagesx, $imagesy, $imageFormat) = getimagesize($filename);
478 
479  switch ($imageFormat) {
480 
481  case 1: // GIF, not supported by BIFF8, we convert to PNG
483  ob_start();
484  imagepng(imagecreatefromgif($filename));
485  $blipData = ob_get_contents();
486  ob_end_clean();
487  break;
488 
489  case 2: // JPEG
491  $blipData = file_get_contents($filename);
492  break;
493 
494  case 3: // PNG
496  $blipData = file_get_contents($filename);
497  break;
498 
499  case 6: // Windows DIB (BMP), we convert to PNG
501  ob_start();
503  $blipData = ob_get_contents();
504  ob_end_clean();
505  break;
506 
507  default: continue 2;
508 
509  }
510 
512  $blip->setData($blipData);
513 
515  $BSE->setBlipType($blipType);
516  $BSE->setBlip($blip);
517 
518  $bstoreContainer->addBSE($BSE);
519 
520  } else if ($drawing instanceof PHPExcel_Worksheet_MemoryDrawing) {
521 
522  switch ($drawing->getRenderingFunction()) {
523 
526  $renderingFunction = 'imagejpeg';
527  break;
528 
533  $renderingFunction = 'imagepng';
534  break;
535 
536  }
537 
538  ob_start();
539  call_user_func($renderingFunction, $drawing->getImageResource());
540  $blipData = ob_get_contents();
541  ob_end_clean();
542 
544  $blip->setData($blipData);
545 
547  $BSE->setBlipType($blipType);
548  $BSE->setBlip($blip);
549 
550  $bstoreContainer->addBSE($BSE);
551  }
552  }
553  }
554 
555  // Set the Escher object
556  $this->_writerWorkbook->setEscher($escher);
557  }
static imagecreatefrombmp($p_sFile)
Create a new image from file.
Definition: Drawing.php:179
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ _buildWorksheetEschers()

PHPExcel_Writer_Excel5::_buildWorksheetEschers ( )
private

Build the Worksheet Escher objects.

Definition at line 248 of file Excel5.php.

References PHPExcel_Shared_Excel5\oneAnchor2twoAnchor(), PHPExcel_Cell\rangeBoundaries(), and PHPExcel_Cell\stringFromColumnIndex().

Referenced by save().

249  {
250  // 1-based index to BstoreContainer
251  $blipIndex = 0;
252  $lastReducedSpId = 0;
253  $lastSpId = 0;
254 
255  foreach ($this->_phpExcel->getAllsheets() as $sheet) {
256  // sheet index
257  $sheetIndex = $sheet->getParent()->getIndex($sheet);
258 
259  $escher = null;
260 
261  // check if there are any shapes for this sheet
262  $filterRange = $sheet->getAutoFilter()->getRange();
263  if (count($sheet->getDrawingCollection()) == 0 && empty($filterRange)) {
264  continue;
265  }
266 
267  // create intermediate Escher object
268  $escher = new PHPExcel_Shared_Escher();
269 
270  // dgContainer
271  $dgContainer = new PHPExcel_Shared_Escher_DgContainer();
272 
273  // set the drawing index (we use sheet index + 1)
274  $dgId = $sheet->getParent()->getIndex($sheet) + 1;
275  $dgContainer->setDgId($dgId);
276  $escher->setDgContainer($dgContainer);
277 
278  // spgrContainer
280  $dgContainer->setSpgrContainer($spgrContainer);
281 
282  // add one shape which is the group shape
284  $spContainer->setSpgr(true);
285  $spContainer->setSpType(0);
286  $spContainer->setSpId(($sheet->getParent()->getIndex($sheet) + 1) << 10);
287  $spgrContainer->addChild($spContainer);
288 
289  // add the shapes
290 
291  $countShapes[$sheetIndex] = 0; // count number of shapes (minus group shape), in sheet
292 
293  foreach ($sheet->getDrawingCollection() as $drawing) {
294  ++$blipIndex;
295 
296  ++$countShapes[$sheetIndex];
297 
298  // add the shape
300 
301  // set the shape type
302  $spContainer->setSpType(0x004B);
303  // set the shape flag
304  $spContainer->setSpFlag(0x02);
305 
306  // set the shape index (we combine 1-based sheet index and $countShapes to create unique shape index)
307  $reducedSpId = $countShapes[$sheetIndex];
308  $spId = $reducedSpId
309  | ($sheet->getParent()->getIndex($sheet) + 1) << 10;
310  $spContainer->setSpId($spId);
311 
312  // keep track of last reducedSpId
313  $lastReducedSpId = $reducedSpId;
314 
315  // keep track of last spId
316  $lastSpId = $spId;
317 
318  // set the BLIP index
319  $spContainer->setOPT(0x4104, $blipIndex);
320 
321  // set coordinates and offsets, client anchor
322  $coordinates = $drawing->getCoordinates();
323  $offsetX = $drawing->getOffsetX();
324  $offsetY = $drawing->getOffsetY();
325  $width = $drawing->getWidth();
326  $height = $drawing->getHeight();
327 
328  $twoAnchor = PHPExcel_Shared_Excel5::oneAnchor2twoAnchor($sheet, $coordinates, $offsetX, $offsetY, $width, $height);
329 
330  $spContainer->setStartCoordinates($twoAnchor['startCoordinates']);
331  $spContainer->setStartOffsetX($twoAnchor['startOffsetX']);
332  $spContainer->setStartOffsetY($twoAnchor['startOffsetY']);
333  $spContainer->setEndCoordinates($twoAnchor['endCoordinates']);
334  $spContainer->setEndOffsetX($twoAnchor['endOffsetX']);
335  $spContainer->setEndOffsetY($twoAnchor['endOffsetY']);
336 
337  $spgrContainer->addChild($spContainer);
338  }
339 
340  // AutoFilters
341  if(!empty($filterRange)){
342  $rangeBounds = PHPExcel_Cell::rangeBoundaries($filterRange);
343  $iNumColStart = $rangeBounds[0][0];
344  $iNumColEnd = $rangeBounds[1][0];
345 
346  $iInc = $iNumColStart;
347  while($iInc <= $iNumColEnd){
348  ++$countShapes[$sheetIndex];
349 
350  // create an Drawing Object for the dropdown
351  $oDrawing = new PHPExcel_Worksheet_BaseDrawing();
352  // get the coordinates of drawing
353  $cDrawing = PHPExcel_Cell::stringFromColumnIndex($iInc - 1) . $rangeBounds[0][1];
354  $oDrawing->setCoordinates($cDrawing);
355  $oDrawing->setWorksheet($sheet);
356 
357  // add the shape
359  // set the shape type
360  $spContainer->setSpType(0x00C9);
361  // set the shape flag
362  $spContainer->setSpFlag(0x01);
363 
364  // set the shape index (we combine 1-based sheet index and $countShapes to create unique shape index)
365  $reducedSpId = $countShapes[$sheetIndex];
366  $spId = $reducedSpId
367  | ($sheet->getParent()->getIndex($sheet) + 1) << 10;
368  $spContainer->setSpId($spId);
369 
370  // keep track of last reducedSpId
371  $lastReducedSpId = $reducedSpId;
372 
373  // keep track of last spId
374  $lastSpId = $spId;
375 
376  $spContainer->setOPT(0x007F, 0x01040104); // Protection -> fLockAgainstGrouping
377  $spContainer->setOPT(0x00BF, 0x00080008); // Text -> fFitTextToShape
378  $spContainer->setOPT(0x01BF, 0x00010000); // Fill Style -> fNoFillHitTest
379  $spContainer->setOPT(0x01FF, 0x00080000); // Line Style -> fNoLineDrawDash
380  $spContainer->setOPT(0x03BF, 0x000A0000); // Group Shape -> fPrint
381 
382  // set coordinates and offsets, client anchor
384  $endCoordinates .= $rangeBounds[0][1] + 1;
385 
386  $spContainer->setStartCoordinates($cDrawing);
387  $spContainer->setStartOffsetX(0);
388  $spContainer->setStartOffsetY(0);
389  $spContainer->setEndCoordinates($endCoordinates);
390  $spContainer->setEndOffsetX(0);
391  $spContainer->setEndOffsetY(0);
392 
393  $spgrContainer->addChild($spContainer);
394  $iInc++;
395  }
396  }
397 
398  // identifier clusters, used for workbook Escher object
399  $this->_IDCLs[$dgId] = $lastReducedSpId;
400 
401  // set last shape index
402  $dgContainer->setLastSpId($lastSpId);
403 
404  // set the Escher object
405  $this->_writerWorksheets[$sheetIndex]->setEscher($escher);
406  }
407  }
static rangeBoundaries($pRange='A1:A1')
Calculate range boundaries.
Definition: Cell.php:707
static oneAnchor2twoAnchor($sheet, $coordinates, $offsetX, $offsetY, $width, $height)
Convert 1-cell anchor coordinates to 2-cell anchor coordinates This function is ported from PEAR Spre...
Definition: Excel5.php:245
static stringFromColumnIndex($pColumnIndex=0)
String from columnindex.
Definition: Cell.php:825
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ _writeDocumentSummaryInformation()

PHPExcel_Writer_Excel5::_writeDocumentSummaryInformation ( )
private

Build the OLE Part for DocumentSummary Information.

Returns
string

Definition at line 563 of file Excel5.php.

References $data, and array.

Referenced by save().

563  {
564 
565  // offset: 0; size: 2; must be 0xFE 0xFF (UTF-16 LE byte order mark)
566  $data = pack('v', 0xFFFE);
567  // offset: 2; size: 2;
568  $data .= pack('v', 0x0000);
569  // offset: 4; size: 2; OS version
570  $data .= pack('v', 0x0106);
571  // offset: 6; size: 2; OS indicator
572  $data .= pack('v', 0x0002);
573  // offset: 8; size: 16
574  $data .= pack('VVVV', 0x00, 0x00, 0x00, 0x00);
575  // offset: 24; size: 4; section count
576  $data .= pack('V', 0x0001);
577 
578  // offset: 28; size: 16; first section's class id: 02 d5 cd d5 9c 2e 1b 10 93 97 08 00 2b 2c f9 ae
579  $data .= pack('vvvvvvvv', 0xD502, 0xD5CD, 0x2E9C, 0x101B, 0x9793, 0x0008, 0x2C2B, 0xAEF9);
580  // offset: 44; size: 4; offset of the start
581  $data .= pack('V', 0x30);
582 
583  // SECTION
584  $dataSection = array();
585  $dataSection_NumProps = 0;
586  $dataSection_Summary = '';
587  $dataSection_Content = '';
588 
589  // GKPIDDSI_CODEPAGE: CodePage
590  $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x01),
591  'offset' => array('pack' => 'V'),
592  'type' => array('pack' => 'V', 'data' => 0x02), // 2 byte signed integer
593  'data' => array('data' => 1252));
594  $dataSection_NumProps++;
595 
596  // GKPIDDSI_CATEGORY : Category
597  if($this->_phpExcel->getProperties()->getCategory()){
598  $dataProp = $this->_phpExcel->getProperties()->getCategory();
599  $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x02),
600  'offset' => array('pack' => 'V'),
601  'type' => array('pack' => 'V', 'data' => 0x1E),
602  'data' => array('data' => $dataProp, 'length' => strlen($dataProp)));
603  $dataSection_NumProps++;
604  }
605  // GKPIDDSI_VERSION :Version of the application that wrote the property storage
606  $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x17),
607  'offset' => array('pack' => 'V'),
608  'type' => array('pack' => 'V', 'data' => 0x03),
609  'data' => array('pack' => 'V', 'data' => 0x000C0000));
610  $dataSection_NumProps++;
611  // GKPIDDSI_SCALE : FALSE
612  $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0B),
613  'offset' => array('pack' => 'V'),
614  'type' => array('pack' => 'V', 'data' => 0x0B),
615  'data' => array('data' => false));
616  $dataSection_NumProps++;
617  // GKPIDDSI_LINKSDIRTY : True if any of the values for the linked properties have changed outside of the application
618  $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x10),
619  'offset' => array('pack' => 'V'),
620  'type' => array('pack' => 'V', 'data' => 0x0B),
621  'data' => array('data' => false));
622  $dataSection_NumProps++;
623  // GKPIDDSI_SHAREDOC : FALSE
624  $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x13),
625  'offset' => array('pack' => 'V'),
626  'type' => array('pack' => 'V', 'data' => 0x0B),
627  'data' => array('data' => false));
628  $dataSection_NumProps++;
629  // GKPIDDSI_HYPERLINKSCHANGED : True if any of the values for the _PID_LINKS (hyperlink text) have changed outside of the application
630  $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x16),
631  'offset' => array('pack' => 'V'),
632  'type' => array('pack' => 'V', 'data' => 0x0B),
633  'data' => array('data' => false));
634  $dataSection_NumProps++;
635 
636  // GKPIDDSI_DOCSPARTS
637  // MS-OSHARED p75 (2.3.3.2.2.1)
638  // Structure is VtVecUnalignedLpstrValue (2.3.3.1.9)
639  // cElements
640  $dataProp = pack('v', 0x0001);
641  $dataProp .= pack('v', 0x0000);
642  // array of UnalignedLpstr
643  // cch
644  $dataProp .= pack('v', 0x000A);
645  $dataProp .= pack('v', 0x0000);
646  // value
647  $dataProp .= 'Worksheet'.chr(0);
648 
649  $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0D),
650  'offset' => array('pack' => 'V'),
651  'type' => array('pack' => 'V', 'data' => 0x101E),
652  'data' => array('data' => $dataProp, 'length' => strlen($dataProp)));
653  $dataSection_NumProps++;
654 
655  // GKPIDDSI_HEADINGPAIR
656  // VtVecHeadingPairValue
657  // cElements
658  $dataProp = pack('v', 0x0002);
659  $dataProp .= pack('v', 0x0000);
660  // Array of vtHeadingPair
661  // vtUnalignedString - headingString
662  // stringType
663  $dataProp .= pack('v', 0x001E);
664  // padding
665  $dataProp .= pack('v', 0x0000);
666  // UnalignedLpstr
667  // cch
668  $dataProp .= pack('v', 0x0013);
669  $dataProp .= pack('v', 0x0000);
670  // value
671  $dataProp .= 'Feuilles de calcul';
672  // vtUnalignedString - headingParts
673  // wType : 0x0003 = 32 bit signed integer
674  $dataProp .= pack('v', 0x0300);
675  // padding
676  $dataProp .= pack('v', 0x0000);
677  // value
678  $dataProp .= pack('v', 0x0100);
679  $dataProp .= pack('v', 0x0000);
680  $dataProp .= pack('v', 0x0000);
681  $dataProp .= pack('v', 0x0000);
682 
683  $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0C),
684  'offset' => array('pack' => 'V'),
685  'type' => array('pack' => 'V', 'data' => 0x100C),
686  'data' => array('data' => $dataProp, 'length' => strlen($dataProp)));
687  $dataSection_NumProps++;
688 
689  // 4 Section Length
690  // 4 Property count
691  // 8 * $dataSection_NumProps (8 = ID (4) + OffSet(4))
692  $dataSection_Content_Offset = 8 + $dataSection_NumProps * 8;
693  foreach ($dataSection as $dataProp){
694  // Summary
695  $dataSection_Summary .= pack($dataProp['summary']['pack'], $dataProp['summary']['data']);
696  // Offset
697  $dataSection_Summary .= pack($dataProp['offset']['pack'], $dataSection_Content_Offset);
698  // DataType
699  $dataSection_Content .= pack($dataProp['type']['pack'], $dataProp['type']['data']);
700  // Data
701  if($dataProp['type']['data'] == 0x02){ // 2 byte signed integer
702  $dataSection_Content .= pack('V', $dataProp['data']['data']);
703 
704  $dataSection_Content_Offset += 4 + 4;
705  }
706  elseif($dataProp['type']['data'] == 0x03){ // 4 byte signed integer
707  $dataSection_Content .= pack('V', $dataProp['data']['data']);
708 
709  $dataSection_Content_Offset += 4 + 4;
710  }
711  elseif($dataProp['type']['data'] == 0x0B){ // Boolean
712  if($dataProp['data']['data'] == false){
713  $dataSection_Content .= pack('V', 0x0000);
714  } else {
715  $dataSection_Content .= pack('V', 0x0001);
716  }
717  $dataSection_Content_Offset += 4 + 4;
718  }
719  elseif($dataProp['type']['data'] == 0x1E){ // null-terminated string prepended by dword string length
720  // Null-terminated string
721  $dataProp['data']['data'] .= chr(0);
722  $dataProp['data']['length'] += 1;
723  // Complete the string with null string for being a %4
724  $dataProp['data']['length'] = $dataProp['data']['length'] + ((4 - $dataProp['data']['length'] % 4)==4 ? 0 : (4 - $dataProp['data']['length'] % 4));
725  $dataProp['data']['data'] = str_pad($dataProp['data']['data'], $dataProp['data']['length'], chr(0), STR_PAD_RIGHT);
726 
727  $dataSection_Content .= pack('V', $dataProp['data']['length']);
728  $dataSection_Content .= $dataProp['data']['data'];
729 
730  $dataSection_Content_Offset += 4 + 4 + strlen($dataProp['data']['data']);
731  }
732  elseif($dataProp['type']['data'] == 0x40){ // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601)
733  $dataSection_Content .= $dataProp['data']['data'];
734 
735  $dataSection_Content_Offset += 4 + 8;
736  }
737  else {
738  // Data Type Not Used at the moment
739  $dataSection_Content .= $dataProp['data']['data'];
740 
741  $dataSection_Content_Offset += 4 + $dataProp['data']['length'];
742  }
743  }
744  // Now $dataSection_Content_Offset contains the size of the content
745 
746  // section header
747  // offset: $secOffset; size: 4; section length
748  // + x Size of the content (summary + content)
749  $data .= pack('V', $dataSection_Content_Offset);
750  // offset: $secOffset+4; size: 4; property count
751  $data .= pack('V', $dataSection_NumProps);
752  // Section Summary
753  $data .= $dataSection_Summary;
754  // Section Content
755  $data .= $dataSection_Content;
756 
757  return $data;
758  }
Create styles array
The data for the language used.
+ Here is the caller graph for this function:

◆ _writeSummaryInformation()

PHPExcel_Writer_Excel5::_writeSummaryInformation ( )
private

Build the OLE Part for Summary Information.

Returns
string

Definition at line 764 of file Excel5.php.

References $data, array, and PHPExcel_Shared_OLE\LocalDate2OLE().

Referenced by save().

764  {
765  // offset: 0; size: 2; must be 0xFE 0xFF (UTF-16 LE byte order mark)
766  $data = pack('v', 0xFFFE);
767  // offset: 2; size: 2;
768  $data .= pack('v', 0x0000);
769  // offset: 4; size: 2; OS version
770  $data .= pack('v', 0x0106);
771  // offset: 6; size: 2; OS indicator
772  $data .= pack('v', 0x0002);
773  // offset: 8; size: 16
774  $data .= pack('VVVV', 0x00, 0x00, 0x00, 0x00);
775  // offset: 24; size: 4; section count
776  $data .= pack('V', 0x0001);
777 
778  // offset: 28; size: 16; first section's class id: e0 85 9f f2 f9 4f 68 10 ab 91 08 00 2b 27 b3 d9
779  $data .= pack('vvvvvvvv', 0x85E0, 0xF29F, 0x4FF9, 0x1068, 0x91AB, 0x0008, 0x272B, 0xD9B3);
780  // offset: 44; size: 4; offset of the start
781  $data .= pack('V', 0x30);
782 
783  // SECTION
784  $dataSection = array();
785  $dataSection_NumProps = 0;
786  $dataSection_Summary = '';
787  $dataSection_Content = '';
788 
789  // CodePage : CP-1252
790  $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x01),
791  'offset' => array('pack' => 'V'),
792  'type' => array('pack' => 'V', 'data' => 0x02), // 2 byte signed integer
793  'data' => array('data' => 1252));
794  $dataSection_NumProps++;
795 
796  // Title
797  if($this->_phpExcel->getProperties()->getTitle()){
798  $dataProp = $this->_phpExcel->getProperties()->getTitle();
799  $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x02),
800  'offset' => array('pack' => 'V'),
801  'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length
802  'data' => array('data' => $dataProp, 'length' => strlen($dataProp)));
803  $dataSection_NumProps++;
804  }
805  // Subject
806  if($this->_phpExcel->getProperties()->getSubject()){
807  $dataProp = $this->_phpExcel->getProperties()->getSubject();
808  $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x03),
809  'offset' => array('pack' => 'V'),
810  'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length
811  'data' => array('data' => $dataProp, 'length' => strlen($dataProp)));
812  $dataSection_NumProps++;
813  }
814  // Author (Creator)
815  if($this->_phpExcel->getProperties()->getCreator()){
816  $dataProp = $this->_phpExcel->getProperties()->getCreator();
817  $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x04),
818  'offset' => array('pack' => 'V'),
819  'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length
820  'data' => array('data' => $dataProp, 'length' => strlen($dataProp)));
821  $dataSection_NumProps++;
822  }
823  // Keywords
824  if($this->_phpExcel->getProperties()->getKeywords()){
825  $dataProp = $this->_phpExcel->getProperties()->getKeywords();
826  $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x05),
827  'offset' => array('pack' => 'V'),
828  'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length
829  'data' => array('data' => $dataProp, 'length' => strlen($dataProp)));
830  $dataSection_NumProps++;
831  }
832  // Comments (Description)
833  if($this->_phpExcel->getProperties()->getDescription()){
834  $dataProp = $this->_phpExcel->getProperties()->getDescription();
835  $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x06),
836  'offset' => array('pack' => 'V'),
837  'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length
838  'data' => array('data' => $dataProp, 'length' => strlen($dataProp)));
839  $dataSection_NumProps++;
840  }
841  // Last Saved By (LastModifiedBy)
842  if($this->_phpExcel->getProperties()->getLastModifiedBy()){
843  $dataProp = $this->_phpExcel->getProperties()->getLastModifiedBy();
844  $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x08),
845  'offset' => array('pack' => 'V'),
846  'type' => array('pack' => 'V', 'data' => 0x1E), // null-terminated string prepended by dword string length
847  'data' => array('data' => $dataProp, 'length' => strlen($dataProp)));
848  $dataSection_NumProps++;
849  }
850  // Created Date/Time
851  if($this->_phpExcel->getProperties()->getCreated()){
852  $dataProp = $this->_phpExcel->getProperties()->getCreated();
853  $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0C),
854  'offset' => array('pack' => 'V'),
855  'type' => array('pack' => 'V', 'data' => 0x40), // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601)
856  'data' => array('data' => PHPExcel_Shared_OLE::LocalDate2OLE($dataProp)));
857  $dataSection_NumProps++;
858  }
859  // Modified Date/Time
860  if($this->_phpExcel->getProperties()->getModified()){
861  $dataProp = $this->_phpExcel->getProperties()->getModified();
862  $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x0D),
863  'offset' => array('pack' => 'V'),
864  'type' => array('pack' => 'V', 'data' => 0x40), // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601)
865  'data' => array('data' => PHPExcel_Shared_OLE::LocalDate2OLE($dataProp)));
866  $dataSection_NumProps++;
867  }
868  // Security
869  $dataSection[] = array('summary'=> array('pack' => 'V', 'data' => 0x13),
870  'offset' => array('pack' => 'V'),
871  'type' => array('pack' => 'V', 'data' => 0x03), // 4 byte signed integer
872  'data' => array('data' => 0x00));
873  $dataSection_NumProps++;
874 
875 
876  // 4 Section Length
877  // 4 Property count
878  // 8 * $dataSection_NumProps (8 = ID (4) + OffSet(4))
879  $dataSection_Content_Offset = 8 + $dataSection_NumProps * 8;
880  foreach ($dataSection as $dataProp){
881  // Summary
882  $dataSection_Summary .= pack($dataProp['summary']['pack'], $dataProp['summary']['data']);
883  // Offset
884  $dataSection_Summary .= pack($dataProp['offset']['pack'], $dataSection_Content_Offset);
885  // DataType
886  $dataSection_Content .= pack($dataProp['type']['pack'], $dataProp['type']['data']);
887  // Data
888  if($dataProp['type']['data'] == 0x02){ // 2 byte signed integer
889  $dataSection_Content .= pack('V', $dataProp['data']['data']);
890 
891  $dataSection_Content_Offset += 4 + 4;
892  }
893  elseif($dataProp['type']['data'] == 0x03){ // 4 byte signed integer
894  $dataSection_Content .= pack('V', $dataProp['data']['data']);
895 
896  $dataSection_Content_Offset += 4 + 4;
897  }
898  elseif($dataProp['type']['data'] == 0x1E){ // null-terminated string prepended by dword string length
899  // Null-terminated string
900  $dataProp['data']['data'] .= chr(0);
901  $dataProp['data']['length'] += 1;
902  // Complete the string with null string for being a %4
903  $dataProp['data']['length'] = $dataProp['data']['length'] + ((4 - $dataProp['data']['length'] % 4)==4 ? 0 : (4 - $dataProp['data']['length'] % 4));
904  $dataProp['data']['data'] = str_pad($dataProp['data']['data'], $dataProp['data']['length'], chr(0), STR_PAD_RIGHT);
905 
906  $dataSection_Content .= pack('V', $dataProp['data']['length']);
907  $dataSection_Content .= $dataProp['data']['data'];
908 
909  $dataSection_Content_Offset += 4 + 4 + strlen($dataProp['data']['data']);
910  }
911  elseif($dataProp['type']['data'] == 0x40){ // Filetime (64-bit value representing the number of 100-nanosecond intervals since January 1, 1601)
912  $dataSection_Content .= $dataProp['data']['data'];
913 
914  $dataSection_Content_Offset += 4 + 8;
915  }
916  else {
917  // Data Type Not Used at the moment
918  }
919  }
920  // Now $dataSection_Content_Offset contains the size of the content
921 
922  // section header
923  // offset: $secOffset; size: 4; section length
924  // + x Size of the content (summary + content)
925  $data .= pack('V', $dataSection_Content_Offset);
926  // offset: $secOffset+4; size: 4; property count
927  $data .= pack('V', $dataSection_NumProps);
928  // Section Summary
929  $data .= $dataSection_Summary;
930  // Section Content
931  $data .= $dataSection_Content;
932 
933  return $data;
934  }
Create styles array
The data for the language used.
static LocalDate2OLE($date=null)
Utility function Returns a string for the OLE container with the date given.
Definition: OLE.php:464
+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ save()

PHPExcel_Writer_Excel5::save (   $pFilename = null)

Save PHPExcel to file.

Parameters
string$pFilename
Exceptions
PHPExcel_Writer_Exception

Implements PHPExcel_Writer_IWriter.

Definition at line 118 of file Excel5.php.

References $i, $res, $style, _buildWorkbookEscher(), _buildWorksheetEschers(), _writeDocumentSummaryInformation(), _writeSummaryInformation(), array, PHPExcel_Shared_OLE\Asc2Ucs(), PHPExcel_Calculation\getInstance(), PHPExcel_Calculation_Functions\getReturnDateType(), PHPExcel_Calculation_Functions\RETURNDATE_EXCEL, PHPExcel_Calculation_Functions\setReturnDateType(), and time.

118  {
119 
120  // garbage collect
121  $this->_phpExcel->garbageCollect();
122 
123  $saveDebugLog = PHPExcel_Calculation::getInstance($this->_phpExcel)->getDebugLog()->getWriteDebugLog();
124  PHPExcel_Calculation::getInstance($this->_phpExcel)->getDebugLog()->setWriteDebugLog(FALSE);
127 
128  // initialize colors array
129  $this->_colors = array();
130 
131  // Initialise workbook writer
132  $this->_writerWorkbook = new PHPExcel_Writer_Excel5_Workbook($this->_phpExcel,
133  $this->_str_total, $this->_str_unique, $this->_str_table,
134  $this->_colors, $this->_parser);
135 
136  // Initialise worksheet writers
137  $countSheets = $this->_phpExcel->getSheetCount();
138  for ($i = 0; $i < $countSheets; ++$i) {
139  $this->_writerWorksheets[$i] = new PHPExcel_Writer_Excel5_Worksheet($this->_str_total, $this->_str_unique,
140  $this->_str_table, $this->_colors,
141  $this->_parser,
142  $this->_preCalculateFormulas,
143  $this->_phpExcel->getSheet($i));
144  }
145 
146  // build Escher objects. Escher objects for workbooks needs to be build before Escher object for workbook.
147  $this->_buildWorksheetEschers();
148  $this->_buildWorkbookEscher();
149 
150  // add 15 identical cell style Xfs
151  // for now, we use the first cellXf instead of cellStyleXf
152  $cellXfCollection = $this->_phpExcel->getCellXfCollection();
153  for ($i = 0; $i < 15; ++$i) {
154  $this->_writerWorkbook->addXfWriter($cellXfCollection[0], true);
155  }
156 
157  // add all the cell Xfs
158  foreach ($this->_phpExcel->getCellXfCollection() as $style) {
159  $this->_writerWorkbook->addXfWriter($style, false);
160  }
161 
162  // add fonts from rich text eleemnts
163  for ($i = 0; $i < $countSheets; ++$i) {
164  foreach ($this->_writerWorksheets[$i]->_phpSheet->getCellCollection() as $cellID) {
165  $cell = $this->_writerWorksheets[$i]->_phpSheet->getCell($cellID);
166  $cVal = $cell->getValue();
167  if ($cVal instanceof PHPExcel_RichText) {
168  $elements = $cVal->getRichTextElements();
169  foreach ($elements as $element) {
170  if ($element instanceof PHPExcel_RichText_Run) {
171  $font = $element->getFont();
172  $this->_writerWorksheets[$i]->_fntHashIndex[$font->getHashCode()] = $this->_writerWorkbook->_addFont($font);
173  }
174  }
175  }
176  }
177  }
178 
179  // initialize OLE file
180  $workbookStreamName = 'Workbook';
181  $OLE = new PHPExcel_Shared_OLE_PPS_File(PHPExcel_Shared_OLE::Asc2Ucs($workbookStreamName));
182 
183  // Write the worksheet streams before the global workbook stream,
184  // because the byte sizes of these are needed in the global workbook stream
185  $worksheetSizes = array();
186  for ($i = 0; $i < $countSheets; ++$i) {
187  $this->_writerWorksheets[$i]->close();
188  $worksheetSizes[] = $this->_writerWorksheets[$i]->_datasize;
189  }
190 
191  // add binary data for global workbook stream
192  $OLE->append($this->_writerWorkbook->writeWorkbook($worksheetSizes));
193 
194  // add binary data for sheet streams
195  for ($i = 0; $i < $countSheets; ++$i) {
196  $OLE->append($this->_writerWorksheets[$i]->getData());
197  }
198 
199  $this->_documentSummaryInformation = $this->_writeDocumentSummaryInformation();
200  // initialize OLE Document Summary Information
201  if(isset($this->_documentSummaryInformation) && !empty($this->_documentSummaryInformation)){
202  $OLE_DocumentSummaryInformation = new PHPExcel_Shared_OLE_PPS_File(PHPExcel_Shared_OLE::Asc2Ucs(chr(5) . 'DocumentSummaryInformation'));
203  $OLE_DocumentSummaryInformation->append($this->_documentSummaryInformation);
204  }
205 
206  $this->_summaryInformation = $this->_writeSummaryInformation();
207  // initialize OLE Summary Information
208  if(isset($this->_summaryInformation) && !empty($this->_summaryInformation)){
209  $OLE_SummaryInformation = new PHPExcel_Shared_OLE_PPS_File(PHPExcel_Shared_OLE::Asc2Ucs(chr(5) . 'SummaryInformation'));
210  $OLE_SummaryInformation->append($this->_summaryInformation);
211  }
212 
213  // define OLE Parts
214  $arrRootData = array($OLE);
215  // initialize OLE Properties file
216  if(isset($OLE_SummaryInformation)){
217  $arrRootData[] = $OLE_SummaryInformation;
218  }
219  // initialize OLE Extended Properties file
220  if(isset($OLE_DocumentSummaryInformation)){
221  $arrRootData[] = $OLE_DocumentSummaryInformation;
222  }
223 
224  $root = new PHPExcel_Shared_OLE_PPS_Root(time(), time(), $arrRootData);
225  // save the OLE file
226  $res = $root->save($pFilename);
227 
229  PHPExcel_Calculation::getInstance($this->_phpExcel)->getDebugLog()->setWriteDebugLog($saveDebugLog);
230  }
static Asc2Ucs($ascii)
Utility function to transform ASCII text to Unicode.
Definition: OLE.php:446
_buildWorksheetEschers()
Build the Worksheet Escher objects.
Definition: Excel5.php:248
$style
Definition: example_012.php:70
foreach($_POST as $key=> $value) $res
Create styles array
The data for the language used.
_buildWorkbookEscher()
Build the Escher object corresponding to the MSODRAWINGGROUP record.
Definition: Excel5.php:412
static setReturnDateType($returnDateType)
Definition: Functions.php:155
static getInstance(PHPExcel $workbook=NULL)
Get an instance of this class.
$i
Definition: disco.tpl.php:19
_writeSummaryInformation()
Build the OLE Part for Summary Information.
Definition: Excel5.php:764
Add data(end) time
Method that wraps PHPs time in order to allow simulations with the workflow.
_writeDocumentSummaryInformation()
Build the OLE Part for DocumentSummary Information.
Definition: Excel5.php:563
+ Here is the call graph for this function:

◆ setTempDir()

PHPExcel_Writer_Excel5::setTempDir (   $pValue = '')

Set temporary storage directory.

Deprecated:
Parameters
string$pValueTemporary storage directory
Exceptions
PHPExcel_Writer_Exceptionwhen directory does not exist
Returns
PHPExcel_Writer_Excel5

Definition at line 240 of file Excel5.php.

240  {
241  return $this;
242  }

Field Documentation

◆ $_colors

PHPExcel_Writer_Excel5::$_colors
private

Definition at line 71 of file Excel5.php.

◆ $_documentSummaryInformation

PHPExcel_Writer_Excel5::$_documentSummaryInformation
private

Definition at line 99 of file Excel5.php.

◆ $_IDCLs

PHPExcel_Writer_Excel5::$_IDCLs
private

Definition at line 85 of file Excel5.php.

◆ $_parser

PHPExcel_Writer_Excel5::$_parser
private

Definition at line 78 of file Excel5.php.

◆ $_phpExcel

PHPExcel_Writer_Excel5::$_phpExcel
private

Definition at line 43 of file Excel5.php.

◆ $_str_table

PHPExcel_Writer_Excel5::$_str_table = array()
private

Definition at line 64 of file Excel5.php.

◆ $_str_total

PHPExcel_Writer_Excel5::$_str_total = 0
private

Definition at line 50 of file Excel5.php.

◆ $_str_unique

PHPExcel_Writer_Excel5::$_str_unique = 0
private

Definition at line 57 of file Excel5.php.

◆ $_summaryInformation

PHPExcel_Writer_Excel5::$_summaryInformation
private

Definition at line 92 of file Excel5.php.


The documentation for this class was generated from the following file: