@@ -116,7 +116,7 @@ public function writeToFile($filename)
116
116
$ zip ->close ();
117
117
}
118
118
119
- protected function initializeSheet ($ sheet_name , $ col_widths =array (), $ auto_filter =false , $ freeze_rows =false , $ freeze_columns =false )
119
+ protected function initializeSheet ($ sheet_name , $ col_widths =array (), $ auto_filter =false , $ freeze_rows =false , $ freeze_columns =false , $ page_setup = array () )
120
120
{
121
121
//if already initialized
122
122
if ($ this ->current_sheet ==$ sheet_name || isset ($ this ->sheets [$ sheet_name ]))
@@ -137,6 +137,7 @@ protected function initializeSheet($sheet_name, $col_widths=array(), $auto_filte
137
137
'auto_filter ' => $ auto_filter ,
138
138
'freeze_rows ' => $ freeze_rows ,
139
139
'freeze_columns ' => $ freeze_columns ,
140
+ 'page_setup ' => $ page_setup ,
140
141
'finalized ' => false ,
141
142
);
142
143
$ sheet = &$ this ->sheets [$ sheet_name ];
@@ -145,7 +146,7 @@ protected function initializeSheet($sheet_name, $col_widths=array(), $auto_filte
145
146
$ sheet ->file_writer ->write ('<?xml version="1.0" encoding="UTF-8" standalone="yes"?> ' . "\n" );
146
147
$ sheet ->file_writer ->write ('<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"> ' );
147
148
$ sheet ->file_writer ->write ( '<sheetPr filterMode="false"> ' );
148
- $ sheet ->file_writer ->write ( '<pageSetUpPr fitToPage="false "/> ' );
149
+ $ sheet ->file_writer ->write ( '<pageSetUpPr fitToPage=" ' . ( string )(! empty ( $ page_setup [ ' fit_to_width ' ]) || ! empty ( $ page_setup [ ' fit_to_height ' ])) . ' "/> ' );
149
150
$ sheet ->file_writer ->write ( '</sheetPr> ' );
150
151
$ sheet ->max_cell_tag_start = $ sheet ->file_writer ->ftell ();
151
152
$ sheet ->file_writer ->write ('<dimension ref="A1: ' . $ max_cell . '"/> ' );
@@ -225,7 +226,8 @@ public function writeSheetHeader($sheet_name, array $header_types, $col_options
225
226
$ auto_filter = isset ($ col_options ['auto_filter ' ]) ? intval ($ col_options ['auto_filter ' ]) : false ;
226
227
$ freeze_rows = isset ($ col_options ['freeze_rows ' ]) ? intval ($ col_options ['freeze_rows ' ]) : false ;
227
228
$ freeze_columns = isset ($ col_options ['freeze_columns ' ]) ? intval ($ col_options ['freeze_columns ' ]) : false ;
228
- self ::initializeSheet ($ sheet_name , $ col_widths , $ auto_filter , $ freeze_rows , $ freeze_columns );
229
+ $ page_setup = isset ($ col_options ['page_setup ' ]) ? (array )$ col_options ['page_setup ' ] : array ();
230
+ self ::initializeSheet ($ sheet_name , $ col_widths , $ auto_filter , $ freeze_rows , $ freeze_columns , $ page_setup );
229
231
$ sheet = &$ this ->sheets [$ sheet_name ];
230
232
$ sheet ->columns = $ this ->initializeColumnTypes ($ header_types );
231
233
if (!$ suppress_row )
@@ -311,12 +313,52 @@ protected function finalizeSheet($sheet_name)
311
313
$ sheet ->file_writer ->write ( '<autoFilter ref="A1: ' . $ max_cell . '"/> ' );
312
314
}
313
315
314
- $ sheet ->file_writer ->write ( '<printOptions headings="false" gridLines="false" gridLinesSet="true" horizontalCentered="false" verticalCentered="false"/> ' );
315
- $ sheet ->file_writer ->write ( '<pageMargins left="0.5" right="0.5" top="1.0" bottom="1.0" header="0.5" footer="0.5"/> ' );
316
- $ 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"/> ' );
316
+ $ page_setup = $ sheet ->page_setup ;
317
+ $ set_allowed_value_func = function ($ key , $ alloweed_array , $ default ) use ($ page_setup ) {
318
+ return (isset ($ page_setup [$ key ]) && in_array ($ page_setup [$ key ], $ alloweed_array )) ? $ page_setup [$ key ] : $ default ;
319
+ };
320
+ $ set_boolean_value_func = function ($ key , $ default ) use ($ page_setup ) {
321
+ $ boolval = filter_var ((isset ($ page_setup [$ key ]) ? $ page_setup [$ key ] : $ default ), FILTER_VALIDATE_BOOLEAN );
322
+ return ($ boolval ) ? 'true ' : 'false ' ;
323
+ };
324
+
325
+ $ sheet ->file_writer ->write ( '<printOptions ' );
326
+ $ sheet ->file_writer ->write ( ' headings=" ' . $ set_boolean_value_func ('headings ' , false ) . '" ' );
327
+ $ sheet ->file_writer ->write ( ' gridLines=" ' . $ set_boolean_value_func ('grid_lines ' , false ) . '" ' );
328
+ $ sheet ->file_writer ->write ( ' gridLinesSet=" ' . $ set_boolean_value_func ('grid_lines_set ' , true ) . '" ' );
329
+ $ sheet ->file_writer ->write ( ' horizontalCentered=" ' . $ set_boolean_value_func ('horizontal_centered ' , false ) . '" ' );
330
+ $ sheet ->file_writer ->write ( ' verticalCentered=" ' . $ set_boolean_value_func ('vertical_centered ' , false ) . '" ' );
331
+ $ sheet ->file_writer ->write ( '/> ' );
332
+ $ sheet ->file_writer ->write ( '<pageMargins ' ); // in inches
333
+ $ sheet ->file_writer ->write ( ' left=" ' . (string )(isset ($ page_setup ['margin_left ' ]) ? floatval ($ page_setup ['margin_left ' ]) : 0.5 ) . '" ' );
334
+ $ sheet ->file_writer ->write ( ' right=" ' . (string )(isset ($ page_setup ['margin_right ' ]) ? floatval ($ page_setup ['margin_right ' ]) : 0.5 ) . '" ' );
335
+ $ sheet ->file_writer ->write ( ' top=" ' . (string )(isset ($ page_setup ['margin_top ' ]) ? floatval ($ page_setup ['margin_top ' ]) : 1.0 ) . '" ' );
336
+ $ sheet ->file_writer ->write ( ' bottom=" ' . (string )(isset ($ page_setup ['margin_bottom ' ]) ? floatval ($ page_setup ['margin_bottom ' ]) : 1.0 ) . '" ' );
337
+ $ sheet ->file_writer ->write ( ' header=" ' . (string )(isset ($ page_setup ['margin_header ' ]) ? floatval ($ page_setup ['margin_header ' ]) : 0.5 ) . '" ' );
338
+ $ sheet ->file_writer ->write ( ' footer=" ' . (string )(isset ($ page_setup ['margin_footer ' ]) ? floatval ($ page_setup ['margin_footer ' ]) : 0.5 ) . '" ' );
339
+ $ sheet ->file_writer ->write ( '/> ' );
340
+ $ sheet ->file_writer ->write ( '<pageSetup ' );
341
+ $ sheet ->file_writer ->write ( ' paperSize=" ' . (string )(isset ($ page_setup ['paper_size ' ]) ? intval ($ page_setup ['paper_size ' ]) : 1 ) . '" ' ); // specify XlPaperSize value (1-68)
342
+ $ sheet ->file_writer ->write ( ' scale=" ' . (string )(isset ($ page_setup ['scale ' ]) ? intval ($ page_setup ['scale ' ]) : 100 ) . '" ' );
343
+ $ sheet ->file_writer ->write ( ' firstPageNumber=" ' . (string )(isset ($ page_setup ['first_page_number ' ]) ? intval ($ page_setup ['first_page_number ' ]) : 1 ) . '" ' );
344
+ $ sheet ->file_writer ->write ( ' fitToWidth=" ' . (string )(isset ($ page_setup ['fit_to_width ' ]) ? intval ($ page_setup ['fit_to_width ' ]) : 0 ) . '" ' ); // if set, enables fitToPage
345
+ $ sheet ->file_writer ->write ( ' fitToHeight=" ' . (string )(isset ($ page_setup ['fit_to_height ' ]) ? intval ($ page_setup ['fit_to_height ' ]) : 0 ) . '" ' ); // if set, enables fitToPage
346
+ $ sheet ->file_writer ->write ( ' pageOrder=" ' . $ set_allowed_value_func ('page_order ' , array ('overThenDown ' , 'downThenOver ' ), 'downThenOver ' ) . '" ' );
347
+ $ sheet ->file_writer ->write ( ' orientation=" ' . $ set_allowed_value_func ('orientation ' , array ('landscape ' , 'portrait ' , 'default ' ), 'default ' ) . '" ' );
348
+ $ sheet ->file_writer ->write ( ' usePrinterDefaults=" ' . $ set_boolean_value_func ('use_printer_defaults ' , true ) . '" ' );
349
+ $ sheet ->file_writer ->write ( ' blackAndWhite=" ' . $ set_boolean_value_func ('black_and_white ' , false ) . '" ' );
350
+ $ sheet ->file_writer ->write ( ' draft=" ' . $ set_boolean_value_func ('draft ' , false ) . '" ' );
351
+ $ sheet ->file_writer ->write ( ' cellComments=" ' . $ set_allowed_value_func ('cell_comments ' , array ('asDisplayed ' , 'atEnd ' , 'none ' ), 'none ' ) . '" ' );
352
+ $ sheet ->file_writer ->write ( ' useFirstPageNumber=" ' . $ set_boolean_value_func ('use_first_page_number ' , false ) . '" ' );
353
+ $ sheet ->file_writer ->write ( ' errors=" ' . $ set_allowed_value_func ('errors ' , array ('blank ' , 'dash ' , 'displayed ' , 'NA ' ), 'displayed ' ) . '" ' );
354
+ $ sheet ->file_writer ->write ( ' horizontalDpi=" ' . (string )(isset ($ page_setup ['horizontal_dpi ' ]) ? intval ($ page_setup ['horizontal_dpi ' ]) : 600 ) . '" ' );
355
+ $ sheet ->file_writer ->write ( ' verticalDpi=" ' . (string )(isset ($ page_setup ['vertical_dpi ' ]) ? intval ($ page_setup ['vertical_dpi ' ]) : 600 ) . '" ' );
356
+ $ sheet ->file_writer ->write ( ' copies=" ' . (string )(isset ($ page_setup ['copies ' ]) ? intval ($ page_setup ['copies ' ]) : 1 ) . '" ' );
357
+ $ sheet ->file_writer ->write ( '/> ' );
358
+
317
359
$ sheet ->file_writer ->write ( '<headerFooter differentFirst="false" differentOddEven="false"> ' );
318
- $ sheet ->file_writer ->write ( '<oddHeader>&C&"Times New Roman,Regular"&12&A</oddHeader> ' );
319
- $ sheet ->file_writer ->write ( '<oddFooter>&C&"Times New Roman,Regular"&12Page &P</oddFooter> ' );
360
+ $ sheet ->file_writer ->write ( '<oddHeader> ' . ( string )( isset ( $ page_setup [ ' header ' ]) ? $ page_setup [ ' header ' ] : ' &C&"Times New Roman,Regular"&12&A ' ) . ' </oddHeader> ' );
361
+ $ sheet ->file_writer ->write ( '<oddFooter> ' . ( string )( isset ( $ page_setup [ ' footer ' ]) ? $ page_setup [ ' footer ' ] : ' &C&"Times New Roman,Regular"&12Page &P ' ) . ' </oddFooter> ' );
320
362
$ sheet ->file_writer ->write ( '</headerFooter> ' );
321
363
$ sheet ->file_writer ->write ('</worksheet> ' );
322
364
@@ -663,12 +705,39 @@ protected function buildWorkbookXML()
663
705
}
664
706
$ workbook_xml .='</sheets> ' ;
665
707
$ workbook_xml .='<definedNames> ' ;
708
+ $ i =0 ;
666
709
foreach ($ this ->sheets as $ sheet_name =>$ sheet ) {
667
710
if ($ sheet ->auto_filter ) {
668
711
$ sheetname = self ::sanitize_sheetname ($ sheet ->sheetname );
669
- $ workbook_xml .='<definedName name="_xlnm._FilterDatabase" localSheetId="0" hidden="1"> \'' .self ::xmlspecialchars ($ sheetname ).'\'!$A$1: ' . self ::xlsCell ($ sheet ->row_count - 1 , count ($ sheet ->columns ) - 1 , true ) . '</definedName> ' ;
670
- $ i ++;
712
+ $ workbook_xml .='<definedName name="_xlnm._FilterDatabase" localSheetId=" ' .$ i .'" hidden="1"> \'' .self ::xmlspecialchars ($ sheetname ).'\'!$A$1: ' . self ::xlsCell ($ sheet ->row_count - 1 , count ($ sheet ->columns ) - 1 , true ) . '</definedName> ' ;
713
+ }
714
+ $ i ++;
715
+ }
716
+ $ i =0 ;
717
+ foreach ($ this ->sheets as $ sheet_name =>$ sheet ) {
718
+ if (!empty ($ sheet ->page_setup ['print_area ' ])) {
719
+ $ sheetname = self ::sanitize_sheetname ($ sheet ->sheetname );
720
+ $ workbook_xml .='<definedName name="_xlnm.Print_Area" localSheetId=" ' .$ i .'"> ' ;
721
+ $ print_area = (array )$ sheet ->page_setup ['print_area ' ];
722
+ foreach ($ print_area as $ index => $ range ) {
723
+ $ workbook_xml .=($ index ==0 ? '' : ', ' ) . '\'' .self ::xmlspecialchars ($ sheetname ).'\'! ' . $ range ;
724
+ }
725
+ $ workbook_xml .='</definedName> ' ;
726
+ }
727
+ $ i ++;
728
+ }
729
+ $ i =0 ;
730
+ foreach ($ this ->sheets as $ sheet_name =>$ sheet ) {
731
+ if (!empty ($ sheet ->page_setup ['print_titles ' ])) {
732
+ $ sheetname = self ::sanitize_sheetname ($ sheet ->sheetname );
733
+ $ workbook_xml .='<definedName name="_xlnm.Print_Titles" localSheetId=" ' .$ i .'"> ' ;
734
+ $ print_titles = (array )$ sheet ->page_setup ['print_titles ' ];
735
+ foreach ($ print_titles as $ index => $ range ) {
736
+ $ workbook_xml .=($ index ==0 ? '' : ', ' ) . '\'' .self ::xmlspecialchars ($ sheetname ).'\'! ' . $ range ;
737
+ }
738
+ $ workbook_xml .='</definedName> ' ;
671
739
}
740
+ $ i ++;
672
741
}
673
742
$ workbook_xml .='</definedNames> ' ;
674
743
$ workbook_xml .='<calcPr iterateCount="100" refMode="A1" iterate="false" iterateDelta="0.001"/></workbook> ' ;
0 commit comments