Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.

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

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