Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.11.x will end 14 Nov 2022 (12 months plus 6 months extension).
  • Bug fixes for security issues in 3.11.x will end 13 Nov 2023 (18 months plus 12 months extension).
  • PHP version: minimum PHP 7.3.0 Note: minimum PHP version has increased since Moodle 3.10. PHP 7.4.x is supported too.

Differences Between: [Versions 310 and 311] [Versions 311 and 400] [Versions 311 and 401] [Versions 311 and 402] [Versions 311 and 403] [Versions 39 and 311]

   1  <?php
   2  
   3  namespace PhpOffice\PhpSpreadsheet\Writer\Xlsx;
   4  
   5  use PhpOffice\PhpSpreadsheet\Shared\XMLWriter;
   6  use PhpOffice\PhpSpreadsheet\Spreadsheet;
   7  
   8  class DocProps extends WriterPart
   9  {
  10      /**
  11       * Write docProps/app.xml to XML format.
  12       *
  13       * @return string XML Output
  14       */
  15      public function writeDocPropsApp(Spreadsheet $spreadsheet)
  16      {
  17          // Create XML writer
  18          $objWriter = null;
  19          if ($this->getParentWriter()->getUseDiskCaching()) {
  20              $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
  21          } else {
  22              $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
  23          }
  24  
  25          // XML header
  26          $objWriter->startDocument('1.0', 'UTF-8', 'yes');
  27  
  28          // Properties
  29          $objWriter->startElement('Properties');
  30          $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/officeDocument/2006/extended-properties');
  31          $objWriter->writeAttribute('xmlns:vt', 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes');
  32  
  33          // Application
  34          $objWriter->writeElement('Application', 'Microsoft Excel');
  35  
  36          // DocSecurity
  37          $objWriter->writeElement('DocSecurity', '0');
  38  
  39          // ScaleCrop
  40          $objWriter->writeElement('ScaleCrop', 'false');
  41  
  42          // HeadingPairs
  43          $objWriter->startElement('HeadingPairs');
  44  
  45          // Vector
  46          $objWriter->startElement('vt:vector');
  47          $objWriter->writeAttribute('size', '2');
  48          $objWriter->writeAttribute('baseType', 'variant');
  49  
  50          // Variant
  51          $objWriter->startElement('vt:variant');
  52          $objWriter->writeElement('vt:lpstr', 'Worksheets');
  53          $objWriter->endElement();
  54  
  55          // Variant
  56          $objWriter->startElement('vt:variant');
  57          $objWriter->writeElement('vt:i4', $spreadsheet->getSheetCount());
  58          $objWriter->endElement();
  59  
  60          $objWriter->endElement();
  61  
  62          $objWriter->endElement();
  63  
  64          // TitlesOfParts
  65          $objWriter->startElement('TitlesOfParts');
  66  
  67          // Vector
  68          $objWriter->startElement('vt:vector');
  69          $objWriter->writeAttribute('size', $spreadsheet->getSheetCount());
  70          $objWriter->writeAttribute('baseType', 'lpstr');
  71  
  72          $sheetCount = $spreadsheet->getSheetCount();
  73          for ($i = 0; $i < $sheetCount; ++$i) {
  74              $objWriter->writeElement('vt:lpstr', $spreadsheet->getSheet($i)->getTitle());
  75          }
  76  
  77          $objWriter->endElement();
  78  
  79          $objWriter->endElement();
  80  
  81          // Company
  82          $objWriter->writeElement('Company', $spreadsheet->getProperties()->getCompany());
  83  
  84          // Company
  85          $objWriter->writeElement('Manager', $spreadsheet->getProperties()->getManager());
  86  
  87          // LinksUpToDate
  88          $objWriter->writeElement('LinksUpToDate', 'false');
  89  
  90          // SharedDoc
  91          $objWriter->writeElement('SharedDoc', 'false');
  92  
  93          // HyperlinksChanged
  94          $objWriter->writeElement('HyperlinksChanged', 'false');
  95  
  96          // AppVersion
  97          $objWriter->writeElement('AppVersion', '12.0000');
  98  
  99          $objWriter->endElement();
 100  
 101          // Return
 102          return $objWriter->getData();
 103      }
 104  
 105      /**
 106       * Write docProps/core.xml to XML format.
 107       *
 108       * @return string XML Output
 109       */
 110      public function writeDocPropsCore(Spreadsheet $spreadsheet)
 111      {
 112          // Create XML writer
 113          $objWriter = null;
 114          if ($this->getParentWriter()->getUseDiskCaching()) {
 115              $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
 116          } else {
 117              $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
 118          }
 119  
 120          // XML header
 121          $objWriter->startDocument('1.0', 'UTF-8', 'yes');
 122  
 123          // cp:coreProperties
 124          $objWriter->startElement('cp:coreProperties');
 125          $objWriter->writeAttribute('xmlns:cp', 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties');
 126          $objWriter->writeAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/');
 127          $objWriter->writeAttribute('xmlns:dcterms', 'http://purl.org/dc/terms/');
 128          $objWriter->writeAttribute('xmlns:dcmitype', 'http://purl.org/dc/dcmitype/');
 129          $objWriter->writeAttribute('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance');
 130  
 131          // dc:creator
 132          $objWriter->writeElement('dc:creator', $spreadsheet->getProperties()->getCreator());
 133  
 134          // cp:lastModifiedBy
 135          $objWriter->writeElement('cp:lastModifiedBy', $spreadsheet->getProperties()->getLastModifiedBy());
 136  
 137          // dcterms:created
 138          $objWriter->startElement('dcterms:created');
 139          $objWriter->writeAttribute('xsi:type', 'dcterms:W3CDTF');
 140          $objWriter->writeRawData(date(DATE_W3C, $spreadsheet->getProperties()->getCreated()));
 141          $objWriter->endElement();
 142  
 143          // dcterms:modified
 144          $objWriter->startElement('dcterms:modified');
 145          $objWriter->writeAttribute('xsi:type', 'dcterms:W3CDTF');
 146          $objWriter->writeRawData(date(DATE_W3C, $spreadsheet->getProperties()->getModified()));
 147          $objWriter->endElement();
 148  
 149          // dc:title
 150          $objWriter->writeElement('dc:title', $spreadsheet->getProperties()->getTitle());
 151  
 152          // dc:description
 153          $objWriter->writeElement('dc:description', $spreadsheet->getProperties()->getDescription());
 154  
 155          // dc:subject
 156          $objWriter->writeElement('dc:subject', $spreadsheet->getProperties()->getSubject());
 157  
 158          // cp:keywords
 159          $objWriter->writeElement('cp:keywords', $spreadsheet->getProperties()->getKeywords());
 160  
 161          // cp:category
 162          $objWriter->writeElement('cp:category', $spreadsheet->getProperties()->getCategory());
 163  
 164          $objWriter->endElement();
 165  
 166          // Return
 167          return $objWriter->getData();
 168      }
 169  
 170      /**
 171       * Write docProps/custom.xml to XML format.
 172       *
 173       * @return string XML Output
 174       */
 175      public function writeDocPropsCustom(Spreadsheet $spreadsheet)
 176      {
 177          $customPropertyList = $spreadsheet->getProperties()->getCustomProperties();
 178          if (empty($customPropertyList)) {
 179              return;
 180          }
 181  
 182          // Create XML writer
 183          $objWriter = null;
 184          if ($this->getParentWriter()->getUseDiskCaching()) {
 185              $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
 186          } else {
 187              $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY);
 188          }
 189  
 190          // XML header
 191          $objWriter->startDocument('1.0', 'UTF-8', 'yes');
 192  
 193          // cp:coreProperties
 194          $objWriter->startElement('Properties');
 195          $objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/officeDocument/2006/custom-properties');
 196          $objWriter->writeAttribute('xmlns:vt', 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes');
 197  
 198          foreach ($customPropertyList as $key => $customProperty) {
 199              $propertyValue = $spreadsheet->getProperties()->getCustomPropertyValue($customProperty);
 200              $propertyType = $spreadsheet->getProperties()->getCustomPropertyType($customProperty);
 201  
 202              $objWriter->startElement('property');
 203              $objWriter->writeAttribute('fmtid', '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}');
 204              $objWriter->writeAttribute('pid', $key + 2);
 205              $objWriter->writeAttribute('name', $customProperty);
 206  
 207              switch ($propertyType) {
 208                  case 'i':
 209                      $objWriter->writeElement('vt:i4', $propertyValue);
 210  
 211                      break;
 212                  case 'f':
 213                      $objWriter->writeElement('vt:r8', $propertyValue);
 214  
 215                      break;
 216                  case 'b':
 217                      $objWriter->writeElement('vt:bool', ($propertyValue) ? 'true' : 'false');
 218  
 219                      break;
 220                  case 'd':
 221                      $objWriter->startElement('vt:filetime');
 222                      $objWriter->writeRawData(date(DATE_W3C, $propertyValue));
 223                      $objWriter->endElement();
 224  
 225                      break;
 226                  default:
 227                      $objWriter->writeElement('vt:lpwstr', $propertyValue);
 228  
 229                      break;
 230              }
 231  
 232              $objWriter->endElement();
 233          }
 234  
 235          $objWriter->endElement();
 236  
 237          return $objWriter->getData();
 238      }
 239  }