DocProps.php 8.5 KB

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