Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 3.10.x will end 8 November 2021 (12 months).
  • Bug fixes for security issues in 3.10.x will end 9 May 2022 (18 months).
  • PHP version: minimum PHP 7.2.0 Note: minimum PHP version has increased since Moodle 3.8. PHP 7.3.x and 7.4.x are supported too.

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

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