See Release Notes
Long Term Support Release
Differences Between: [Versions 310 and 401] [Versions 311 and 401] [Versions 39 and 401]
1 <?php 2 3 namespace PhpOffice\PhpSpreadsheet\Writer\Ods; 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 Meta extends WriterPart 11 { 12 /** 13 * Write meta.xml to XML format. 14 * 15 * @return string XML Output 16 */ 17 public function write(): string 18 { 19 $spreadsheet = $this->getParentWriter()->getSpreadsheet(); 20 21 $objWriter = null; 22 if ($this->getParentWriter()->getUseDiskCaching()) { 23 $objWriter = new XMLWriter(XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory()); 24 } else { 25 $objWriter = new XMLWriter(XMLWriter::STORAGE_MEMORY); 26 } 27 28 // XML header 29 $objWriter->startDocument('1.0', 'UTF-8'); 30 31 // Meta 32 $objWriter->startElement('office:document-meta'); 33 34 $objWriter->writeAttribute('xmlns:office', 'urn:oasis:names:tc:opendocument:xmlns:office:1.0'); 35 $objWriter->writeAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink'); 36 $objWriter->writeAttribute('xmlns:dc', 'http://purl.org/dc/elements/1.1/'); 37 $objWriter->writeAttribute('xmlns:meta', 'urn:oasis:names:tc:opendocument:xmlns:meta:1.0'); 38 $objWriter->writeAttribute('xmlns:ooo', 'http://openoffice.org/2004/office'); 39 $objWriter->writeAttribute('xmlns:grddl', 'http://www.w3.org/2003/g/data-view#'); 40 $objWriter->writeAttribute('office:version', '1.2'); 41 42 $objWriter->startElement('office:meta'); 43 44 $objWriter->writeElement('meta:initial-creator', $spreadsheet->getProperties()->getCreator()); 45 $objWriter->writeElement('dc:creator', $spreadsheet->getProperties()->getCreator()); 46 $created = $spreadsheet->getProperties()->getCreated(); 47 $date = Date::dateTimeFromTimestamp("$created"); 48 $date->setTimeZone(Date::getDefaultOrLocalTimeZone()); 49 $objWriter->writeElement('meta:creation-date', $date->format(DATE_W3C)); 50 $created = $spreadsheet->getProperties()->getModified(); 51 $date = Date::dateTimeFromTimestamp("$created"); 52 $date->setTimeZone(Date::getDefaultOrLocalTimeZone()); 53 $objWriter->writeElement('dc:date', $date->format(DATE_W3C)); 54 $objWriter->writeElement('dc:title', $spreadsheet->getProperties()->getTitle()); 55 $objWriter->writeElement('dc:description', $spreadsheet->getProperties()->getDescription()); 56 $objWriter->writeElement('dc:subject', $spreadsheet->getProperties()->getSubject()); 57 $objWriter->writeElement('meta:keyword', $spreadsheet->getProperties()->getKeywords()); 58 // Don't know if this changed over time, but the keywords are all 59 // in a single declaration now. 60 //$keywords = explode(' ', $spreadsheet->getProperties()->getKeywords()); 61 //foreach ($keywords as $keyword) { 62 // $objWriter->writeElement('meta:keyword', $keyword); 63 //} 64 65 //<meta:document-statistic meta:table-count="XXX" meta:cell-count="XXX" meta:object-count="XXX"/> 66 $objWriter->startElement('meta:user-defined'); 67 $objWriter->writeAttribute('meta:name', 'Company'); 68 $objWriter->writeRaw($spreadsheet->getProperties()->getCompany()); 69 $objWriter->endElement(); 70 71 $objWriter->startElement('meta:user-defined'); 72 $objWriter->writeAttribute('meta:name', 'category'); 73 $objWriter->writeRaw($spreadsheet->getProperties()->getCategory()); 74 $objWriter->endElement(); 75 76 self::writeDocPropsCustom($objWriter, $spreadsheet); 77 78 $objWriter->endElement(); 79 80 $objWriter->endElement(); 81 82 return $objWriter->getData(); 83 } 84 85 private static function writeDocPropsCustom(XMLWriter $objWriter, Spreadsheet $spreadsheet): void 86 { 87 $customPropertyList = $spreadsheet->getProperties()->getCustomProperties(); 88 foreach ($customPropertyList as $key => $customProperty) { 89 $propertyValue = $spreadsheet->getProperties()->getCustomPropertyValue($customProperty); 90 $propertyType = $spreadsheet->getProperties()->getCustomPropertyType($customProperty); 91 92 $objWriter->startElement('meta:user-defined'); 93 $objWriter->writeAttribute('meta:name', $customProperty); 94 95 switch ($propertyType) { 96 case Properties::PROPERTY_TYPE_INTEGER: 97 case Properties::PROPERTY_TYPE_FLOAT: 98 $objWriter->writeAttribute('meta:value-type', 'float'); 99 $objWriter->writeRawData($propertyValue); 100 101 break; 102 case Properties::PROPERTY_TYPE_BOOLEAN: 103 $objWriter->writeAttribute('meta:value-type', 'boolean'); 104 $objWriter->writeRawData($propertyValue ? 'true' : 'false'); 105 106 break; 107 case Properties::PROPERTY_TYPE_DATE: 108 $objWriter->writeAttribute('meta:value-type', 'date'); 109 $dtobj = Date::dateTimeFromTimestamp($propertyValue ?? 0); 110 $objWriter->writeRawData($dtobj->format(DATE_W3C)); 111 112 break; 113 default: 114 $objWriter->writeRawData($propertyValue); 115 116 break; 117 } 118 119 $objWriter->endElement(); 120 } 121 } 122 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body