See Release Notes
Long Term Support Release
Differences Between: [Versions 310 and 401] [Versions 311 and 401] [Versions 39 and 401] [Versions 400 and 401]
1 <?php 2 3 namespace PhpOffice\PhpSpreadsheet\Writer\Ods; 4 5 use PhpOffice\PhpSpreadsheet\Cell\CellAddress; 6 use PhpOffice\PhpSpreadsheet\Cell\Coordinate; 7 use PhpOffice\PhpSpreadsheet\Shared\XMLWriter; 8 use PhpOffice\PhpSpreadsheet\Spreadsheet; 9 use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; 10 11 class Settings extends WriterPart 12 { 13 /** 14 * Write settings.xml to XML format. 15 * 16 * @return string XML Output 17 */ 18 public function write(): string 19 { 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 26 // XML header 27 $objWriter->startDocument('1.0', 'UTF-8'); 28 29 // Settings 30 $objWriter->startElement('office:document-settings'); 31 $objWriter->writeAttribute('xmlns:office', 'urn:oasis:names:tc:opendocument:xmlns:office:1.0'); 32 $objWriter->writeAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink'); 33 $objWriter->writeAttribute('xmlns:config', 'urn:oasis:names:tc:opendocument:xmlns:config:1.0'); 34 $objWriter->writeAttribute('xmlns:ooo', 'http://openoffice.org/2004/office'); 35 $objWriter->writeAttribute('office:version', '1.2'); 36 37 $objWriter->startElement('office:settings'); 38 $objWriter->startElement('config:config-item-set'); 39 $objWriter->writeAttribute('config:name', 'ooo:view-settings'); 40 $objWriter->startElement('config:config-item-map-indexed'); 41 $objWriter->writeAttribute('config:name', 'Views'); 42 $objWriter->startElement('config:config-item-map-entry'); 43 $spreadsheet = $this->getParentWriter()->getSpreadsheet(); 44 45 $objWriter->startElement('config:config-item'); 46 $objWriter->writeAttribute('config:name', 'ViewId'); 47 $objWriter->writeAttribute('config:type', 'string'); 48 $objWriter->text('view1'); 49 $objWriter->endElement(); // ViewId 50 $objWriter->startElement('config:config-item-map-named'); 51 52 $this->writeAllWorksheetSettings($objWriter, $spreadsheet); 53 54 $wstitle = $spreadsheet->getActiveSheet()->getTitle(); 55 $objWriter->startElement('config:config-item'); 56 $objWriter->writeAttribute('config:name', 'ActiveTable'); 57 $objWriter->writeAttribute('config:type', 'string'); 58 $objWriter->text($wstitle); 59 $objWriter->endElement(); // config:config-item ActiveTable 60 61 $objWriter->endElement(); // config:config-item-map-entry 62 $objWriter->endElement(); // config:config-item-map-indexed Views 63 $objWriter->endElement(); // config:config-item-set ooo:view-settings 64 $objWriter->startElement('config:config-item-set'); 65 $objWriter->writeAttribute('config:name', 'ooo:configuration-settings'); 66 $objWriter->endElement(); // config:config-item-set ooo:configuration-settings 67 $objWriter->endElement(); // office:settings 68 $objWriter->endElement(); // office:document-settings 69 70 return $objWriter->getData(); 71 } 72 73 private function writeAllWorksheetSettings(XMLWriter $objWriter, Spreadsheet $spreadsheet): void 74 { 75 $objWriter->writeAttribute('config:name', 'Tables'); 76 77 foreach ($spreadsheet->getWorksheetIterator() as $worksheet) { 78 $this->writeWorksheetSettings($objWriter, $worksheet); 79 } 80 81 $objWriter->endElement(); // config:config-item-map-entry Tables 82 } 83 84 private function writeWorksheetSettings(XMLWriter $objWriter, Worksheet $worksheet): void 85 { 86 $objWriter->startElement('config:config-item-map-entry'); 87 $objWriter->writeAttribute('config:name', $worksheet->getTitle()); 88 89 $this->writeSelectedCells($objWriter, $worksheet); 90 if ($worksheet->getFreezePane() !== null) { 91 $this->writeFreezePane($objWriter, $worksheet); 92 } 93 94 $objWriter->endElement(); // config:config-item-map-entry Worksheet 95 } 96 97 private function writeSelectedCells(XMLWriter $objWriter, Worksheet $worksheet): void 98 { 99 $selected = $worksheet->getSelectedCells(); 100 if (preg_match('/^([a-z]+)([0-9]+)/i', $selected, $matches) === 1) { 101 $colSel = Coordinate::columnIndexFromString($matches[1]) - 1; 102 $rowSel = (int) $matches[2] - 1; 103 $objWriter->startElement('config:config-item'); 104 $objWriter->writeAttribute('config:name', 'CursorPositionX'); 105 $objWriter->writeAttribute('config:type', 'int'); 106 $objWriter->text((string) $colSel); 107 $objWriter->endElement(); 108 $objWriter->startElement('config:config-item'); 109 $objWriter->writeAttribute('config:name', 'CursorPositionY'); 110 $objWriter->writeAttribute('config:type', 'int'); 111 $objWriter->text((string) $rowSel); 112 $objWriter->endElement(); 113 } 114 } 115 116 private function writeSplitValue(XMLWriter $objWriter, string $splitMode, string $type, string $value): void 117 { 118 $objWriter->startElement('config:config-item'); 119 $objWriter->writeAttribute('config:name', $splitMode); 120 $objWriter->writeAttribute('config:type', $type); 121 $objWriter->text($value); 122 $objWriter->endElement(); 123 } 124 125 private function writeFreezePane(XMLWriter $objWriter, Worksheet $worksheet): void 126 { 127 $freezePane = CellAddress::fromCellAddress($worksheet->getFreezePane()); 128 if ($freezePane->cellAddress() === 'A1') { 129 return; 130 } 131 132 $columnId = $freezePane->columnId(); 133 $columnName = $freezePane->columnName(); 134 $row = $freezePane->rowId(); 135 136 $this->writeSplitValue($objWriter, 'HorizontalSplitMode', 'short', '2'); 137 $this->writeSplitValue($objWriter, 'HorizontalSplitPosition', 'int', (string) ($columnId - 1)); 138 $this->writeSplitValue($objWriter, 'PositionLeft', 'short', '0'); 139 $this->writeSplitValue($objWriter, 'PositionRight', 'short', (string) ($columnId - 1)); 140 141 for ($column = 'A'; $column !== $columnName; ++$column) { 142 $worksheet->getColumnDimension($column)->setAutoSize(true); 143 } 144 145 $this->writeSplitValue($objWriter, 'VerticalSplitMode', 'short', '2'); 146 $this->writeSplitValue($objWriter, 'VerticalSplitPosition', 'int', (string) ($row - 1)); 147 $this->writeSplitValue($objWriter, 'PositionTop', 'short', '0'); 148 $this->writeSplitValue($objWriter, 'PositionBottom', 'short', (string) ($row - 1)); 149 150 $this->writeSplitValue($objWriter, 'ActiveSplitRange', 'short', '3'); 151 } 152 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body