@@ -117,6 +117,108 @@ public function testMarkMergedCells() {
117117 @unlink ($ filename );
118118 }
119119
120+ /**
121+ * @dataProvider getFreezeCellsScenarios
122+ */
123+ public function testFreezeCells ($ freeze_cols , $ freeze_rows , $ expected_active_cells , $ expected_pane ) {
124+ $ filename = tempnam ("/tmp " , "xlsx_writer " );
125+
126+ $ header = ['0 ' =>'string ' ,'1 ' =>'string ' ,'2 ' =>'string ' ,'3 ' =>'string ' ];
127+ $ sheet = [
128+ ['55 ' ,'66 ' ,'77 ' ,'88 ' ],
129+ ['10 ' ,'11 ' ,'12 ' ,'13 ' ],
130+ ];
131+
132+ $ col_options = ['freeze_columns ' => $ freeze_cols , 'freeze_rows ' => $ freeze_rows ];
133+
134+ $ xlsx_writer = new XLSXWriter ();
135+ $ xlsx_writer ->writeSheetHeader ('mysheet ' , $ header , $ format = 'xlsx ' , $ delimiter = '; ' , $ subheader = NULL , $ col_options );
136+ $ xlsx_writer ->writeSheetRow ('mysheet ' , $ sheet [0 ]);
137+ $ xlsx_writer ->writeSheetRow ('mysheet ' , $ sheet [1 ]);
138+ $ xlsx_writer ->writeToFile ($ filename );
139+
140+ $ zip = new ZipArchive ();
141+ $ r = $ zip ->open ($ filename );
142+ $ this ->assertTrue ($ r );
143+
144+ $ this ->assertNotEmpty (($ zip ->numFiles ));
145+
146+ for ($ z =0 ; $ z < $ zip ->numFiles ; $ z ++) {
147+ $ inside_zip_filename = $ zip ->getNameIndex ($ z );
148+ $ sheet_xml = $ zip ->getFromName ($ inside_zip_filename );
149+ if (preg_match ("/sheet(\d+).xml/ " , basename ($ inside_zip_filename ))) {
150+ $ xml = new SimpleXMLElement ($ sheet_xml );
151+ $ sheet_view = $ xml ->sheetViews ->sheetView ;
152+
153+ if (!empty ($ expected_pane )) {
154+ $ pane = $ sheet_view ->pane ;
155+ foreach ($ expected_pane as $ expected_key => $ expected_value ) {
156+ $ attribute = (string ) $ pane [0 ][$ expected_key ];
157+ $ this ->assertEquals ($ expected_value , $ attribute );
158+ }
159+ }
160+
161+ $ selections = $ sheet_view ->selection ;
162+ for ($ i = 0 ; $ i < count ($ expected_active_cells ); $ i ++) {
163+ $ this ->assertNotEmpty ($ selections [$ i ]);
164+ $ this ->assertEquals ($ expected_active_cells [$ i ]['cell ' ], $ selections [$ i ]['activeCell ' ]);
165+ $ this ->assertEquals ($ expected_active_cells [$ i ]['cell ' ], $ selections [$ i ]['sqref ' ]);
166+ $ this ->assertEquals ($ expected_active_cells [$ i ]['pane ' ], $ selections [$ i ]['pane ' ]);
167+ }
168+ }
169+ }
170+
171+ $ zip ->close ();
172+ @unlink ($ filename );
173+ }
174+
175+ public static function getFreezeCellsScenarios () {
176+ return [
177+ "Not frozen " => [
178+ $ freeze_cols = false ,
179+ $ freeze_rows = false ,
180+ $ expected_active_cells = [["cell " => "A1 " , "pane " => "topLeft " ]],
181+ $ expected_pane = [],
182+ ],
183+ "Frozen Col B and Row 2 " => [
184+ $ freeze_cols = 1 ,
185+ $ freeze_rows = 1 ,
186+ $ expected_active_cells = [["cell " => "A2 " , "pane " => "topRight " ], ["cell " => "B1 " , "pane " => "bottomLeft " ], ["cell " => "B2 " , "pane " => "bottomRight " ]],
187+ $ expected_pane = ["ySplit " => $ freeze_rows , "xSplit " => $ freeze_cols , "topLeftCell " => "B2 " , "activePane " => "bottomRight " ],
188+ ],
189+ "Frozen Col B " => [
190+ $ freeze_cols = 1 ,
191+ $ freeze_rows = false ,
192+ $ expected_active_cells = [["cell " => "B1 " , "pane " => "topRight " ]],
193+ $ expected_pane = ["xSplit " => $ freeze_cols , "topLeftCell " => "B1 " , "activePane " => "topRight " ],
194+ ],
195+ "Frozen Row 2 " => [
196+ $ freeze_cols = false ,
197+ $ freeze_rows = 1 ,
198+ $ expected_active_cells = [["cell " => "A2 " , "pane " => "bottomLeft " ]],
199+ $ expected_pane = ["ySplit " => $ freeze_rows , "topLeftCell " => "A2 " , "activePane " => "bottomLeft " ],
200+ ],
201+ "Frozen Col A and Row 1 " => [
202+ $ freeze_cols = 0 ,
203+ $ freeze_rows = 0 ,
204+ $ expected_active_cells = [["cell " => "A1 " , "pane " => "topRight " ], ["cell " => "A1 " , "pane " => "bottomLeft " ], ["cell " => "A1 " , "pane " => "bottomRight " ]],
205+ $ expected_pane = ["ySplit " => $ freeze_rows , "xSplit " => $ freeze_cols , "topLeftCell " => "A1 " , "activePane " => "bottomRight " ],
206+ ],
207+ "Frozen Col A " => [
208+ $ freeze_cols = 0 ,
209+ $ freeze_rows = false ,
210+ $ expected_active_cells = [["cell " => "A1 " , "pane " => "topRight " ]],
211+ $ expected_pane = ["xSplit " => $ freeze_cols , "topLeftCell " => "A1 " , "activePane " => "topRight " ],
212+ ],
213+ "Frozen Row 1 " => [
214+ $ freeze_cols = false ,
215+ $ freeze_rows = 0 ,
216+ $ expected_active_cells = [["cell " => "A1 " , "pane " => "bottomLeft " ]],
217+ $ expected_pane = ["ySplit " => $ freeze_rows , "topLeftCell " => "A1 " , "activePane " => "bottomLeft " ],
218+ ],
219+ ];
220+ }
221+
120222 private function stripCellsFromSheetXML ($ sheet_xml ) {
121223 $ output = [];
122224
0 commit comments