Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
PageSetup Support
  • Loading branch information
hnx8 committed Jul 6, 2018
commit d1aacc39aede3ec34e8208d8aaea3b2460bcef27
98 changes: 98 additions & 0 deletions examples/ex12-print-setup.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
<?php
set_include_path( get_include_path().PATH_SEPARATOR."..");
include_once("xlsxwriter.class.php");

$header = array(
'c1-text'=>'string',//text
'c2-text'=>'@',//text
'c3-integer'=>'integer',
'c4-integer'=>'0',
'c5-price'=>'price',
'c6-price'=>'#,##0.00',//custom
'c7-date'=>'date',
'c8-date'=>'YYYY-MM-DD',
);
$rows = array(
array('x101',102,103,104,105,106,'2018-01-07','2018-01-08'),
array('x201',202,203,204,205,206,'2018-02-07','2018-02-08'),
array('x301',302,303,304,305,306,'2018-03-07','2018-03-08'),
array('x401',402,403,404,405,406,'2018-04-07','2018-04-08'),
array('x501',502,503,504,505,506,'2018-05-07','2018-05-08'),
array('x601',602,603,604,605,606,'2018-06-07','2018-06-08'),
array('x701',702,703,704,705,706,'2018-07-07','2018-07-08'),
);
$writer = new XLSXWriter();
$writer->writeSheetHeader('Sheet1', $header, [
'freeze_rows' => 1,
'freeze_columns' => 2,
// Use the "page_setup' to set up layout and print options of a page. Refer to the "page setup" dialog of Excel.
'page_setup' => [
'orientation' => 'landscape', // choose 'landscape' or 'portrait'
'scale' => 80, // percent
//'fit_to_width' => 0, // When "Fit to page", specify the number of pages
//'fit_to_height' => 0, // When "Fit to page", specify the number of pages
'paper_size' => 9, // 9=xlPaperA4 : specify XlPaperSize value. see https://msdn.microsoft.com/vba/excel-vba/articles/xlpapersize-enumeration-excel
//'horizontal_dpi' => 600,
//'vertical_dpi' => 600,
//'first_page_number' => 1,
//'use_first_page_number' => false,

// Specify margin in inches (not in centimeters)
'margin_left' => 0.1,
'margin_right' => 0.2,
'margin_top' => 0.3,
'margin_bottom' => 0.4,
'margin_header' => 0.5,
'margin_footer' => 0.6,
'horizontal_centered' => true,
'vertical_centered' => true,

// Header\Footer can be customized.
// for details on how to write, refer to 'Remarks' of https://msdn.microsoft.com/library/documentformat.openxml.spreadsheet.evenheader.aspx
'header' => 'Page Title', // ex. fixed-text
'footer' => '&amp;P / &amp;N', // ex. page number

'print_area' => 'A1:F5',
'print_titles' => '$1:$1',
// Note : When setting multiple ranges, specify by array. ex. 'print_titles' => ['$1:$1', '$A:$A'],

'page_order' => 'downThenOver', // choose 'overThenDown' or 'downThenOver'
//'grid_lines' => false,
//'black_and_white' => false,
//'draft' => false,
//'headings' => false,
//'cell_comments' => 'none', // 'asDisplayed', 'atEnd', 'none' can be selected
//'errors' => 'displayed', // 'blank', 'dash', 'displayed', 'NA' can be selected

//'use_printer_defaults' => true,
//'copies' => 1,
]
]);
foreach ($rows as $row) {
$writer->writeSheetRow('Sheet1', $row);
}
$writer->writeSheetHeader('Sheet2', $header, [
'page_setup' => [
'orientation' => 'portrait', // choose 'landscape' or 'portrait'
'fit_to_width' => 2, // When "Fit to page", specify the number of pages
'fit_to_height' => 3, // When "Fit to page", specify the number of pages
'first_page_number' => 4,
'use_first_page_number' => true,

'header' => '', // no header
'footer' => '', // no footer

'print_area' => ['A1:B2', 'C3:D4'], // multiple print area specification
'print_titles' => ['$1:$1', '$A:$A'], // row print title & column print title specification
'page_order' => 'overThenDown', // choose 'overThenDown' or 'downThenOver'

'grid_lines' => true,
'black_and_white' => true,
//'draft' => true,
'headings' => true,
]
]);
foreach ($rows as $row) {
$writer->writeSheetRow('Sheet2', $row);
}
$writer->writeToFile('xlsx-print-setup.xlsx');
89 changes: 79 additions & 10 deletions xlsxwriter.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ public function writeToFile($filename)
$zip->close();
}

protected function initializeSheet($sheet_name, $col_widths=array(), $auto_filter=false, $freeze_rows=false, $freeze_columns=false )
protected function initializeSheet($sheet_name, $col_widths=array(), $auto_filter=false, $freeze_rows=false, $freeze_columns=false, $page_setup=array())
{
//if already initialized
if ($this->current_sheet==$sheet_name || isset($this->sheets[$sheet_name]))
Expand All @@ -137,6 +137,7 @@ protected function initializeSheet($sheet_name, $col_widths=array(), $auto_filte
'auto_filter' => $auto_filter,
'freeze_rows' => $freeze_rows,
'freeze_columns' => $freeze_columns,
'page_setup' => $page_setup,
'finalized' => false,
);
$sheet = &$this->sheets[$sheet_name];
Expand All @@ -145,7 +146,7 @@ protected function initializeSheet($sheet_name, $col_widths=array(), $auto_filte
$sheet->file_writer->write('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' . "\n");
$sheet->file_writer->write('<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">');
$sheet->file_writer->write( '<sheetPr filterMode="false">');
$sheet->file_writer->write( '<pageSetUpPr fitToPage="false"/>');
$sheet->file_writer->write( '<pageSetUpPr fitToPage="' . (string)(!empty($page_setup['fit_to_width']) || !empty($page_setup['fit_to_height'])) . '"/>');
$sheet->file_writer->write( '</sheetPr>');
$sheet->max_cell_tag_start = $sheet->file_writer->ftell();
$sheet->file_writer->write('<dimension ref="A1:' . $max_cell . '"/>');
Expand Down Expand Up @@ -225,7 +226,8 @@ public function writeSheetHeader($sheet_name, array $header_types, $col_options
$auto_filter = isset($col_options['auto_filter']) ? intval($col_options['auto_filter']) : false;
$freeze_rows = isset($col_options['freeze_rows']) ? intval($col_options['freeze_rows']) : false;
$freeze_columns = isset($col_options['freeze_columns']) ? intval($col_options['freeze_columns']) : false;
self::initializeSheet($sheet_name, $col_widths, $auto_filter, $freeze_rows, $freeze_columns);
$page_setup = isset($col_options['page_setup']) ? (array)$col_options['page_setup'] : array();
self::initializeSheet($sheet_name, $col_widths, $auto_filter, $freeze_rows, $freeze_columns, $page_setup);
$sheet = &$this->sheets[$sheet_name];
$sheet->columns = $this->initializeColumnTypes($header_types);
if (!$suppress_row)
Expand Down Expand Up @@ -311,12 +313,52 @@ protected function finalizeSheet($sheet_name)
$sheet->file_writer->write( '<autoFilter ref="A1:' . $max_cell . '"/>');
}

$sheet->file_writer->write( '<printOptions headings="false" gridLines="false" gridLinesSet="true" horizontalCentered="false" verticalCentered="false"/>');
$sheet->file_writer->write( '<pageMargins left="0.5" right="0.5" top="1.0" bottom="1.0" header="0.5" footer="0.5"/>');
$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"/>');
$page_setup = $sheet->page_setup;
$set_allowed_value_func = function($key, $alloweed_array, $default) use ($page_setup) {
return (isset($page_setup[$key]) && in_array($page_setup[$key], $alloweed_array)) ? $page_setup[$key] : $default;
};
$set_boolean_value_func = function($key, $default) use ($page_setup) {
$boolval = filter_var((isset($page_setup[$key]) ? $page_setup[$key] : $default), FILTER_VALIDATE_BOOLEAN);
return ($boolval) ? 'true' : 'false';
};

$sheet->file_writer->write( '<printOptions');
$sheet->file_writer->write( ' headings="' . $set_boolean_value_func('headings', false) . '"');
$sheet->file_writer->write( ' gridLines="' . $set_boolean_value_func('grid_lines', false) . '"');
$sheet->file_writer->write( ' gridLinesSet="' . $set_boolean_value_func('grid_lines_set', true) . '"');
$sheet->file_writer->write( ' horizontalCentered="' . $set_boolean_value_func('horizontal_centered', false) . '"');
$sheet->file_writer->write( ' verticalCentered="' . $set_boolean_value_func('vertical_centered', false) . '"');
$sheet->file_writer->write( '/>');
$sheet->file_writer->write( '<pageMargins'); // in inches
$sheet->file_writer->write( ' left="' . (string)(isset($page_setup['margin_left']) ? floatval($page_setup['margin_left']) : 0.5) . '"');
$sheet->file_writer->write( ' right="' . (string)(isset($page_setup['margin_right']) ? floatval($page_setup['margin_right']) : 0.5) . '"');
$sheet->file_writer->write( ' top="' . (string)(isset($page_setup['margin_top']) ? floatval($page_setup['margin_top']) : 1.0) . '"');
$sheet->file_writer->write( ' bottom="' . (string)(isset($page_setup['margin_bottom']) ? floatval($page_setup['margin_bottom']) : 1.0) . '"');
$sheet->file_writer->write( ' header="' . (string)(isset($page_setup['margin_header']) ? floatval($page_setup['margin_header']) : 0.5) . '"');
$sheet->file_writer->write( ' footer="' . (string)(isset($page_setup['margin_footer']) ? floatval($page_setup['margin_footer']) : 0.5) . '"');
$sheet->file_writer->write( '/>');
$sheet->file_writer->write( '<pageSetup');
$sheet->file_writer->write( ' paperSize="' . (string)(isset($page_setup['paper_size']) ? intval($page_setup['paper_size']) : 1) . '"'); // specify XlPaperSize value (1-68)
$sheet->file_writer->write( ' scale="' . (string)(isset($page_setup['scale']) ? intval($page_setup['scale']) : 100) . '"');
$sheet->file_writer->write( ' firstPageNumber="' . (string)(isset($page_setup['first_page_number']) ? intval($page_setup['first_page_number']) : 1) . '"');
$sheet->file_writer->write( ' fitToWidth="' . (string)(isset($page_setup['fit_to_width']) ? intval($page_setup['fit_to_width']) : 0) . '"'); // if set, enables fitToPage
$sheet->file_writer->write( ' fitToHeight="' . (string)(isset($page_setup['fit_to_height']) ? intval($page_setup['fit_to_height']) : 0) . '"'); // if set, enables fitToPage
$sheet->file_writer->write( ' pageOrder="' . $set_allowed_value_func('page_order', array('overThenDown', 'downThenOver'), 'downThenOver') . '"');
$sheet->file_writer->write( ' orientation="' . $set_allowed_value_func('orientation', array('landscape', 'portrait', 'default'), 'default') . '"');
$sheet->file_writer->write( ' usePrinterDefaults="' . $set_boolean_value_func('use_printer_defaults', true) . '"');
$sheet->file_writer->write( ' blackAndWhite="' . $set_boolean_value_func('black_and_white', false) . '"');
$sheet->file_writer->write( ' draft="' . $set_boolean_value_func('draft', false) . '"');
$sheet->file_writer->write( ' cellComments="' . $set_allowed_value_func('cell_comments', array('asDisplayed', 'atEnd', 'none'), 'none') . '"');
$sheet->file_writer->write( ' useFirstPageNumber="' . $set_boolean_value_func('use_first_page_number', false) . '"');
$sheet->file_writer->write( ' errors="' . $set_allowed_value_func('errors', array('blank', 'dash', 'displayed', 'NA'), 'displayed') . '"');
$sheet->file_writer->write( ' horizontalDpi="' . (string)(isset($page_setup['horizontal_dpi']) ? intval($page_setup['horizontal_dpi']) : 600) . '"');
$sheet->file_writer->write( ' verticalDpi="' . (string)(isset($page_setup['vertical_dpi']) ? intval($page_setup['vertical_dpi']) : 600) . '"');
$sheet->file_writer->write( ' copies="' . (string)(isset($page_setup['copies']) ? intval($page_setup['copies']) : 1) . '"');
$sheet->file_writer->write( '/>');

$sheet->file_writer->write( '<headerFooter differentFirst="false" differentOddEven="false">');
$sheet->file_writer->write( '<oddHeader>&amp;C&amp;&quot;Times New Roman,Regular&quot;&amp;12&amp;A</oddHeader>');
$sheet->file_writer->write( '<oddFooter>&amp;C&amp;&quot;Times New Roman,Regular&quot;&amp;12Page &amp;P</oddFooter>');
$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>');
$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>');
$sheet->file_writer->write( '</headerFooter>');
$sheet->file_writer->write('</worksheet>');

Expand Down Expand Up @@ -663,12 +705,39 @@ protected function buildWorkbookXML()
}
$workbook_xml.='</sheets>';
$workbook_xml.='<definedNames>';
$i=0;
foreach($this->sheets as $sheet_name=>$sheet) {
if ($sheet->auto_filter) {
$sheetname = self::sanitize_sheetname($sheet->sheetname);
$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>';
$i++;
$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>';
}
$i++;
}
$i=0;
foreach($this->sheets as $sheet_name=>$sheet) {
if (!empty($sheet->page_setup['print_area'])) {
$sheetname = self::sanitize_sheetname($sheet->sheetname);
$workbook_xml.='<definedName name="_xlnm.Print_Area" localSheetId="'.$i.'">';
$print_area = (array)$sheet->page_setup['print_area'];
foreach($print_area as $index => $range) {
$workbook_xml.=($index==0 ? '' : ',') . '\''.self::xmlspecialchars($sheetname).'\'!' . $range;
}
$workbook_xml.='</definedName>';
}
$i++;
}
$i=0;
foreach($this->sheets as $sheet_name=>$sheet) {
if (!empty($sheet->page_setup['print_titles'])) {
$sheetname = self::sanitize_sheetname($sheet->sheetname);
$workbook_xml.='<definedName name="_xlnm.Print_Titles" localSheetId="'.$i.'">';
$print_titles = (array)$sheet->page_setup['print_titles'];
foreach($print_titles as $index => $range) {
$workbook_xml.=($index==0 ? '' : ',') . '\''.self::xmlspecialchars($sheetname).'\'!' . $range;
}
$workbook_xml.='</definedName>';
}
$i++;
}
$workbook_xml.='</definedNames>';
$workbook_xml.='<calcPr iterateCount="100" refMode="A1" iterate="false" iterateDelta="0.001"/></workbook>';
Expand Down