Skip to content

Commit d1aacc3

Browse files
committed
PageSetup Support
1 parent c4ba602 commit d1aacc3

File tree

2 files changed

+177
-10
lines changed

2 files changed

+177
-10
lines changed

Diff for: examples/ex12-print-setup.php

+98
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
<?php
2+
set_include_path( get_include_path().PATH_SEPARATOR."..");
3+
include_once("xlsxwriter.class.php");
4+
5+
$header = array(
6+
'c1-text'=>'string',//text
7+
'c2-text'=>'@',//text
8+
'c3-integer'=>'integer',
9+
'c4-integer'=>'0',
10+
'c5-price'=>'price',
11+
'c6-price'=>'#,##0.00',//custom
12+
'c7-date'=>'date',
13+
'c8-date'=>'YYYY-MM-DD',
14+
);
15+
$rows = array(
16+
array('x101',102,103,104,105,106,'2018-01-07','2018-01-08'),
17+
array('x201',202,203,204,205,206,'2018-02-07','2018-02-08'),
18+
array('x301',302,303,304,305,306,'2018-03-07','2018-03-08'),
19+
array('x401',402,403,404,405,406,'2018-04-07','2018-04-08'),
20+
array('x501',502,503,504,505,506,'2018-05-07','2018-05-08'),
21+
array('x601',602,603,604,605,606,'2018-06-07','2018-06-08'),
22+
array('x701',702,703,704,705,706,'2018-07-07','2018-07-08'),
23+
);
24+
$writer = new XLSXWriter();
25+
$writer->writeSheetHeader('Sheet1', $header, [
26+
'freeze_rows' => 1,
27+
'freeze_columns' => 2,
28+
// Use the "page_setup' to set up layout and print options of a page. Refer to the "page setup" dialog of Excel.
29+
'page_setup' => [
30+
'orientation' => 'landscape', // choose 'landscape' or 'portrait'
31+
'scale' => 80, // percent
32+
//'fit_to_width' => 0, // When "Fit to page", specify the number of pages
33+
//'fit_to_height' => 0, // When "Fit to page", specify the number of pages
34+
'paper_size' => 9, // 9=xlPaperA4 : specify XlPaperSize value. see https://msdn.microsoft.com/vba/excel-vba/articles/xlpapersize-enumeration-excel
35+
//'horizontal_dpi' => 600,
36+
//'vertical_dpi' => 600,
37+
//'first_page_number' => 1,
38+
//'use_first_page_number' => false,
39+
40+
// Specify margin in inches (not in centimeters)
41+
'margin_left' => 0.1,
42+
'margin_right' => 0.2,
43+
'margin_top' => 0.3,
44+
'margin_bottom' => 0.4,
45+
'margin_header' => 0.5,
46+
'margin_footer' => 0.6,
47+
'horizontal_centered' => true,
48+
'vertical_centered' => true,
49+
50+
// Header\Footer can be customized.
51+
// for details on how to write, refer to 'Remarks' of https://msdn.microsoft.com/library/documentformat.openxml.spreadsheet.evenheader.aspx
52+
'header' => 'Page Title', // ex. fixed-text
53+
'footer' => '&amp;P / &amp;N', // ex. page number
54+
55+
'print_area' => 'A1:F5',
56+
'print_titles' => '$1:$1',
57+
// Note : When setting multiple ranges, specify by array. ex. 'print_titles' => ['$1:$1', '$A:$A'],
58+
59+
'page_order' => 'downThenOver', // choose 'overThenDown' or 'downThenOver'
60+
//'grid_lines' => false,
61+
//'black_and_white' => false,
62+
//'draft' => false,
63+
//'headings' => false,
64+
//'cell_comments' => 'none', // 'asDisplayed', 'atEnd', 'none' can be selected
65+
//'errors' => 'displayed', // 'blank', 'dash', 'displayed', 'NA' can be selected
66+
67+
//'use_printer_defaults' => true,
68+
//'copies' => 1,
69+
]
70+
]);
71+
foreach ($rows as $row) {
72+
$writer->writeSheetRow('Sheet1', $row);
73+
}
74+
$writer->writeSheetHeader('Sheet2', $header, [
75+
'page_setup' => [
76+
'orientation' => 'portrait', // choose 'landscape' or 'portrait'
77+
'fit_to_width' => 2, // When "Fit to page", specify the number of pages
78+
'fit_to_height' => 3, // When "Fit to page", specify the number of pages
79+
'first_page_number' => 4,
80+
'use_first_page_number' => true,
81+
82+
'header' => '', // no header
83+
'footer' => '', // no footer
84+
85+
'print_area' => ['A1:B2', 'C3:D4'], // multiple print area specification
86+
'print_titles' => ['$1:$1', '$A:$A'], // row print title & column print title specification
87+
'page_order' => 'overThenDown', // choose 'overThenDown' or 'downThenOver'
88+
89+
'grid_lines' => true,
90+
'black_and_white' => true,
91+
//'draft' => true,
92+
'headings' => true,
93+
]
94+
]);
95+
foreach ($rows as $row) {
96+
$writer->writeSheetRow('Sheet2', $row);
97+
}
98+
$writer->writeToFile('xlsx-print-setup.xlsx');

Diff for: xlsxwriter.class.php

+79-10
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ public function writeToFile($filename)
116116
$zip->close();
117117
}
118118

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())
120120
{
121121
//if already initialized
122122
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
137137
'auto_filter' => $auto_filter,
138138
'freeze_rows' => $freeze_rows,
139139
'freeze_columns' => $freeze_columns,
140+
'page_setup' => $page_setup,
140141
'finalized' => false,
141142
);
142143
$sheet = &$this->sheets[$sheet_name];
@@ -145,7 +146,7 @@ protected function initializeSheet($sheet_name, $col_widths=array(), $auto_filte
145146
$sheet->file_writer->write('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' . "\n");
146147
$sheet->file_writer->write('<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">');
147148
$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'])) . '"/>');
149150
$sheet->file_writer->write( '</sheetPr>');
150151
$sheet->max_cell_tag_start = $sheet->file_writer->ftell();
151152
$sheet->file_writer->write('<dimension ref="A1:' . $max_cell . '"/>');
@@ -225,7 +226,8 @@ public function writeSheetHeader($sheet_name, array $header_types, $col_options
225226
$auto_filter = isset($col_options['auto_filter']) ? intval($col_options['auto_filter']) : false;
226227
$freeze_rows = isset($col_options['freeze_rows']) ? intval($col_options['freeze_rows']) : false;
227228
$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);
229231
$sheet = &$this->sheets[$sheet_name];
230232
$sheet->columns = $this->initializeColumnTypes($header_types);
231233
if (!$suppress_row)
@@ -311,12 +313,52 @@ protected function finalizeSheet($sheet_name)
311313
$sheet->file_writer->write( '<autoFilter ref="A1:' . $max_cell . '"/>');
312314
}
313315

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+
317359
$sheet->file_writer->write( '<headerFooter differentFirst="false" differentOddEven="false">');
318-
$sheet->file_writer->write( '<oddHeader>&amp;C&amp;&quot;Times New Roman,Regular&quot;&amp;12&amp;A</oddHeader>');
319-
$sheet->file_writer->write( '<oddFooter>&amp;C&amp;&quot;Times New Roman,Regular&quot;&amp;12Page &amp;P</oddFooter>');
360+
$sheet->file_writer->write( '<oddHeader>' . (string)(isset($page_setup['header']) ? $page_setup['header'] : '&amp;C&amp;&quot;Times New Roman,Regular&quot;&amp;12&amp;A') . '</oddHeader>');
361+
$sheet->file_writer->write( '<oddFooter>' . (string)(isset($page_setup['footer']) ? $page_setup['footer'] : '&amp;C&amp;&quot;Times New Roman,Regular&quot;&amp;12Page &amp;P') . '</oddFooter>');
320362
$sheet->file_writer->write( '</headerFooter>');
321363
$sheet->file_writer->write('</worksheet>');
322364

@@ -663,12 +705,39 @@ protected function buildWorkbookXML()
663705
}
664706
$workbook_xml.='</sheets>';
665707
$workbook_xml.='<definedNames>';
708+
$i=0;
666709
foreach($this->sheets as $sheet_name=>$sheet) {
667710
if ($sheet->auto_filter) {
668711
$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>';
671739
}
740+
$i++;
672741
}
673742
$workbook_xml.='</definedNames>';
674743
$workbook_xml.='<calcPr iterateCount="100" refMode="A1" iterate="false" iterateDelta="0.001"/></workbook>';

0 commit comments

Comments
 (0)