@@ -121,6 +121,7 @@ protected function initializeSheet($sheet_name)
121
121
'row_count ' => 0 ,
122
122
'file_writer ' => new XLSXWriter_BuffererWriter ($ sheet_filename ),
123
123
'columns ' => array (),
124
+ 'merge_cells ' => array (),
124
125
'max_cell_tag_start ' => 0 ,
125
126
'max_cell_tag_end ' => 0 ,
126
127
'finalized ' => false ,
@@ -162,7 +163,7 @@ private function determineCellType($cell_format)
162
163
if (preg_match ("/0/ " , $ cell_format )) return 'numeric ' ;
163
164
return 'string ' ;
164
165
}
165
-
166
+
166
167
private function escapeCellFormat ($ cell_format )
167
168
{
168
169
$ ignore_until ='' ;
@@ -210,7 +211,7 @@ private function addCellFormat($cell_format)
210
211
return $ position ;
211
212
}
212
213
213
- public function writeSheetHeader ($ sheet_name , array $ header_types )
214
+ public function writeSheetHeader ($ sheet_name , array $ header_types, $ suppress_row = false )
214
215
{
215
216
if (empty ($ sheet_name ) || empty ($ header_types ) || !empty ($ this ->sheets [$ sheet_name ]))
216
217
return ;
@@ -222,14 +223,17 @@ public function writeSheetHeader($sheet_name, array $header_types)
222
223
{
223
224
$ sheet ->columns [] = $ this ->addCellFormat ($ v );
224
225
}
225
- $ header_row = array_keys ($ header_types );
226
+ if (!$ suppress_row )
227
+ {
228
+ $ header_row = array_keys ($ header_types );
226
229
227
- $ sheet ->file_writer ->write ('<row collapsed="false" customFormat="false" customHeight="false" hidden="false" ht="12.1" outlineLevel="0" r=" ' . (1 ) . '"> ' );
228
- foreach ($ header_row as $ k => $ v ) {
229
- $ this ->writeCell ($ sheet ->file_writer , 0 , $ k , $ v , $ cell_format_index = '0 ' );//'0'=>'string'
230
+ $ sheet ->file_writer ->write ('<row collapsed="false" customFormat="false" customHeight="false" hidden="false" ht="12.1" outlineLevel="0" r=" ' . (1 ) . '"> ' );
231
+ foreach ($ header_row as $ k => $ v ) {
232
+ $ this ->writeCell ($ sheet ->file_writer , 0 , $ k , $ v , $ cell_format_index = '0 ' );//'0'=>'string'
233
+ }
234
+ $ sheet ->file_writer ->write ('</row> ' );
235
+ $ sheet ->row_count ++;
230
236
}
231
- $ sheet ->file_writer ->write ('</row> ' );
232
- $ sheet ->row_count ++;
233
237
$ this ->current_sheet = $ sheet_name ;
234
238
}
235
239
@@ -246,9 +250,10 @@ public function writeSheetRow($sheet_name, array $row)
246
250
}
247
251
248
252
$ sheet ->file_writer ->write ('<row collapsed="false" customFormat="false" customHeight="false" hidden="false" ht="12.1" outlineLevel="0" r=" ' . ($ sheet ->row_count + 1 ) . '"> ' );
249
- //$row = array_slice($row, 0, count($sheet->columns) ) ;
253
+ $ column_count = 0 ;
250
254
foreach ($ row as $ k => $ v ) {
251
- $ this ->writeCell ($ sheet ->file_writer , $ sheet ->row_count , $ k , $ v , $ sheet ->columns [$ k ]);
255
+ $ this ->writeCell ($ sheet ->file_writer , $ sheet ->row_count , $ column_count , $ v , $ sheet ->columns [$ column_count ]);
256
+ $ column_count ++;
252
257
}
253
258
$ sheet ->file_writer ->write ('</row> ' );
254
259
$ sheet ->row_count ++;
@@ -263,6 +268,15 @@ protected function finalizeSheet($sheet_name)
263
268
$ sheet = &$ this ->sheets [$ sheet_name ];
264
269
265
270
$ sheet ->file_writer ->write ( '</sheetData> ' );
271
+
272
+ if (!empty ($ sheet ->merge_cells )) {
273
+ $ sheet ->file_writer ->write ( '<mergeCells> ' );
274
+ foreach ($ sheet ->merge_cells as $ range ) {
275
+ $ sheet ->file_writer ->write ( '<mergeCell ref=" ' . $ range . '"/> ' );
276
+ }
277
+ $ sheet ->file_writer ->write ( '</mergeCells> ' );
278
+ }
279
+
266
280
$ sheet ->file_writer ->write ( '<printOptions headings="false" gridLines="false" gridLinesSet="true" horizontalCentered="false" verticalCentered="false"/> ' );
267
281
$ sheet ->file_writer ->write ( '<pageMargins left="0.5" right="0.5" top="1.0" bottom="1.0" header="0.5" footer="0.5"/> ' );
268
282
$ sheet ->file_writer ->write ( '<pageSetup blackAndWhite="false" cellComments="none" copies="1" draft="false" firstPageNumber="1" fitToHeight="1" fitToWidth="1" horizontalDpi="300" orientation="portrait" pageOrder="downThenOver" paperSize="1" scale="100" useFirstPageNumber="true" usePrinterDefaults="false" verticalDpi="300"/> ' );
@@ -280,8 +294,21 @@ protected function finalizeSheet($sheet_name)
280
294
$ sheet ->file_writer ->close ();
281
295
$ sheet ->finalized =true ;
282
296
}
297
+
298
+ public function markMergedCell ($ sheet_name , $ start_cell_row , $ start_cell_column , $ end_cell_row , $ end_cell_column )
299
+ {
300
+ if (empty ($ sheet_name ) || $ this ->sheets [$ sheet_name ]->finalized )
301
+ return ;
283
302
284
- public function writeSheet (array $ data , $ sheet_name ='' , array $ header_types =array () )
303
+ self ::initializeSheet ($ sheet_name );
304
+ $ sheet = &$ this ->sheets [$ sheet_name ];
305
+
306
+ $ startCell = self ::xlsCell ($ start_cell_row , $ start_cell_column );
307
+ $ endCell = self ::xlsCell ($ end_cell_row , $ end_cell_column );
308
+ $ sheet ->merge_cells [] = $ startCell . ": " . $ endCell ;
309
+ }
310
+
311
+ public function writeSheet (array $ data , $ sheet_name ='' , array $ header_types =array ())
285
312
{
286
313
$ sheet_name = empty ($ sheet_name ) ? 'Sheet1 ' : $ sheet_name ;
287
314
$ data = empty ($ data ) ? array (array ('' )) : $ data ;
@@ -300,7 +327,7 @@ protected function writeCell(XLSXWriter_BuffererWriter &$file, $row_number, $col
300
327
{
301
328
$ cell_type = $ this ->cell_types [$ cell_format_index ];
302
329
$ cell_name = self ::xlsCell ($ row_number , $ column_number );
303
-
330
+
304
331
if (!is_scalar ($ value ) || $ value ==='' ) { //objects, array, empty
305
332
$ file ->write ('<c r=" ' .$ cell_name .'" s=" ' .$ cell_format_index .'"/> ' );
306
333
} elseif (is_string ($ value ) && $ value {0 }=='= ' ){
@@ -311,9 +338,9 @@ protected function writeCell(XLSXWriter_BuffererWriter &$file, $row_number, $col
311
338
$ file ->write ('<c r=" ' .$ cell_name .'" s=" ' .$ cell_format_index .'" t="n"><v> ' .self ::convert_date_time ($ value ).'</v></c> ' );
312
339
} elseif ($ cell_type =='currency ' || $ cell_type =='percent ' || $ cell_type =='numeric ' ) {
313
340
$ file ->write ('<c r=" ' .$ cell_name .'" s=" ' .$ cell_format_index .'" t="n"><v> ' .self ::xmlspecialchars ($ value ).'</v></c> ' );//int,float,currency
314
- } else if (!is_string ($ value )){
341
+ } else if (!is_string ($ value )){
315
342
$ file ->write ('<c r=" ' .$ cell_name .'" s=" ' .$ cell_format_index .'" t="n"><v> ' .($ value *1 ).'</v></c> ' );
316
- } else if ($ value {0 }!='0 ' && $ value {0 }!='+ ' && filter_var ($ value , FILTER_VALIDATE_INT , array ('options ' =>array ('max_range ' =>2147483647 )))){
343
+ } else if ($ value {0 }!='0 ' && $ value {0 }!='+ ' && filter_var ($ value , FILTER_VALIDATE_INT , array ('options ' =>array ('max_range ' =>2147483647 )))){
317
344
$ file ->write ('<c r=" ' .$ cell_name .'" s=" ' .$ cell_format_index .'" t="n"><v> ' .($ value *1 ).'</v></c> ' );
318
345
} else { //implied: ($cell_format=='string')
319
346
$ file ->write ('<c r=" ' .$ cell_name .'" s=" ' .$ cell_format_index .'" t="s"><v> ' .self ::xmlspecialchars ($ this ->setSharedString ($ value )).'</v></c> ' );
0 commit comments