Skip to content

PageSetup Support #207

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
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
98 changes: 98 additions & 0 deletions examples/ex12-page-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