22
33namespace PhpOffice \PhpSpreadsheet \Writer \Ods ;
44
5+ use PhpOffice \PhpSpreadsheet \Cell \CellAddress ;
56use PhpOffice \PhpSpreadsheet \Cell \Coordinate ;
67use PhpOffice \PhpSpreadsheet \Shared \XMLWriter ;
8+ use PhpOffice \PhpSpreadsheet \Spreadsheet ;
9+ use PhpOffice \PhpSpreadsheet \Worksheet \Worksheet ;
710
811class 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,84 @@ 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 ((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+ }
88152}
0 commit comments