Skip to content

Commit 02394a3

Browse files
author
MarkBaker
committed
Initial work on supporting Freeze Pane for Ods Writer
1 parent f426889 commit 02394a3

File tree

2 files changed

+115
-23
lines changed

2 files changed

+115
-23
lines changed

src/PhpSpreadsheet/Writer/Ods.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -132,10 +132,10 @@ public function save($filename, int $flags = 0): void
132132

133133
$zip->addFile('META-INF/manifest.xml', $this->getWriterPartMetaInf()->write());
134134
$zip->addFile('Thumbnails/thumbnail.png', $this->getWriterPartthumbnails()->write());
135+
$zip->addFile('settings.xml', $this->getWriterPartsettings()->write());
135136
$zip->addFile('content.xml', $this->getWriterPartcontent()->write());
136137
$zip->addFile('meta.xml', $this->getWriterPartmeta()->write());
137138
$zip->addFile('mimetype', $this->getWriterPartmimetype()->write());
138-
$zip->addFile('settings.xml', $this->getWriterPartsettings()->write());
139139
$zip->addFile('styles.xml', $this->getWriterPartstyles()->write());
140140

141141
// Close file

src/PhpSpreadsheet/Writer/Ods/Settings.php

+114-22
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22

33
namespace PhpOffice\PhpSpreadsheet\Writer\Ods;
44

5+
use PhpOffice\PhpSpreadsheet\Cell\CellAddress;
6+
use PhpOffice\PhpSpreadsheet\Spreadsheet;
57
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
68
use PhpOffice\PhpSpreadsheet\Shared\XMLWriter;
9+
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
710

811
class Settings extends WriterPart
912
{
@@ -45,28 +48,9 @@ public function write(): string
4548
$objWriter->text('view1');
4649
$objWriter->endElement(); // ViewId
4750
$objWriter->startElement('config:config-item-map-named');
48-
$objWriter->writeAttribute('config:name', 'Tables');
49-
foreach ($spreadsheet->getWorksheetIterator() as $ws) {
50-
$objWriter->startElement('config:config-item-map-entry');
51-
$objWriter->writeAttribute('config:name', $ws->getTitle());
52-
$selected = $ws->getSelectedCells();
53-
if (preg_match('/^([a-z]+)([0-9]+)/i', $selected, $matches) === 1) {
54-
$colSel = Coordinate::columnIndexFromString($matches[1]) - 1;
55-
$rowSel = (int) $matches[2] - 1;
56-
$objWriter->startElement('config:config-item');
57-
$objWriter->writeAttribute('config:name', 'CursorPositionX');
58-
$objWriter->writeAttribute('config:type', 'int');
59-
$objWriter->text($colSel);
60-
$objWriter->endElement();
61-
$objWriter->startElement('config:config-item');
62-
$objWriter->writeAttribute('config:name', 'CursorPositionY');
63-
$objWriter->writeAttribute('config:type', 'int');
64-
$objWriter->text($rowSel);
65-
$objWriter->endElement();
66-
}
67-
$objWriter->endElement(); // config:config-item-map-entry
68-
}
69-
$objWriter->endElement(); // config:config-item-map-named
51+
52+
$this->writeAllWorksheetSettings($objWriter, $spreadsheet);
53+
7054
$wstitle = $spreadsheet->getActiveSheet()->getTitle();
7155
$objWriter->startElement('config:config-item');
7256
$objWriter->writeAttribute('config:name', 'ActiveTable');
@@ -85,4 +69,112 @@ public function write(): string
8569

8670
return $objWriter->getData();
8771
}
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($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($rowSel);
112+
$objWriter->endElement();
113+
}
114+
}
115+
116+
private function writeFreezePane(XMLWriter $objWriter, Worksheet $worksheet): void
117+
{
118+
$freezePane = CellAddress::fromCellAddress($worksheet->getFreezePane());
119+
$columnId = $freezePane->columnId();
120+
$columnName = $freezePane->columnName();
121+
$row = $freezePane->rowId();
122+
123+
var_dump($freezePane->cellAddress(), $freezePane->columnName(), $freezePane->columnId(), $freezePane->rowId());
124+
125+
if ($columnId > 1) {
126+
$objWriter->startElement('config:config-item');
127+
$objWriter->writeAttribute('config:name', 'HorizontalSplitMode');
128+
$objWriter->writeAttribute('config:type', 'short');
129+
$objWriter->text(2);
130+
$objWriter->endElement();
131+
$objWriter->startElement('config:config-item');
132+
$objWriter->writeAttribute('config:name', 'HorizontalSplitPosition');
133+
$objWriter->writeAttribute('config:type', 'int');
134+
$objWriter->text($columnId - 1);
135+
$objWriter->endElement();
136+
$objWriter->startElement('config:config-item');
137+
$objWriter->writeAttribute('config:name', 'PositionLeft');
138+
$objWriter->writeAttribute('config:type', 'short');
139+
$objWriter->text(0);
140+
$objWriter->endElement();
141+
$objWriter->startElement('config:config-item');
142+
$objWriter->writeAttribute('config:name', 'PositionRight');
143+
$objWriter->writeAttribute('config:type', 'int');
144+
$objWriter->text($columnId - 1);
145+
$objWriter->endElement();
146+
147+
for ($column = 'A'; $column !== $columnName; ++$column) {
148+
$worksheet->getColumnDimension($column)->setAutoSize(true);
149+
}
150+
}
151+
if ($row > 1) {
152+
$objWriter->startElement('config:config-item');
153+
$objWriter->writeAttribute('config:name', 'VerticalSplitMode');
154+
$objWriter->writeAttribute('config:type', 'short');
155+
$objWriter->text(2);
156+
$objWriter->endElement();
157+
$objWriter->startElement('config:config-item');
158+
$objWriter->writeAttribute('config:name', 'VerticalSplitPosition');
159+
$objWriter->writeAttribute('config:type', 'int');
160+
$objWriter->text($row - 1);
161+
$objWriter->endElement();
162+
$objWriter->startElement('config:config-item');
163+
$objWriter->writeAttribute('config:name', 'PositionTop');
164+
$objWriter->writeAttribute('config:type', 'short');
165+
$objWriter->text(0);
166+
$objWriter->endElement();
167+
$objWriter->startElement('config:config-item');
168+
$objWriter->writeAttribute('config:name', 'PositionBottom');
169+
$objWriter->writeAttribute('config:type', 'int');
170+
$objWriter->text($row - 1);
171+
$objWriter->endElement();
172+
}
173+
174+
$objWriter->startElement('config:config-item');
175+
$objWriter->writeAttribute('config:name', 'ActiveSplitRange');
176+
$objWriter->writeAttribute('config:type', 'short');
177+
$objWriter->text(3);
178+
$objWriter->endElement();
179+
}
88180
}

0 commit comments

Comments
 (0)