2
2
3
3
namespace PhpOffice \PhpSpreadsheet \Writer \Ods ;
4
4
5
+ use PhpOffice \PhpSpreadsheet \Cell \CellAddress ;
5
6
use PhpOffice \PhpSpreadsheet \Cell \Coordinate ;
6
7
use PhpOffice \PhpSpreadsheet \Shared \XMLWriter ;
8
+ use PhpOffice \PhpSpreadsheet \Spreadsheet ;
9
+ use PhpOffice \PhpSpreadsheet \Worksheet \Worksheet ;
7
10
8
11
class Settings extends WriterPart
9
12
{
@@ -45,28 +48,9 @@ public function write(): string
45
48
$ objWriter ->text ('view1 ' );
46
49
$ objWriter ->endElement (); // ViewId
47
50
$ 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
+
70
54
$ wstitle = $ spreadsheet ->getActiveSheet ()->getTitle ();
71
55
$ objWriter ->startElement ('config:config-item ' );
72
56
$ objWriter ->writeAttribute ('config:name ' , 'ActiveTable ' );
@@ -85,4 +69,84 @@ public function write(): string
85
69
86
70
return $ objWriter ->getData ();
87
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
+ }
88
152
}
0 commit comments