diff --git a/xlsxwriter.class.php b/xlsxwriter.class.php index 427dc4f7ffd61008592fe5c6cd0b39a9acb23d8b..49fb77743d414f2efd803ca23ff73486b6f07db5 100644 --- a/xlsxwriter.class.php +++ b/xlsxwriter.class.php @@ -14,11 +14,16 @@ class XLSXWriter protected $shared_string_count = 0;//count of non-unique references to the unique set protected $temp_files = array(); + protected $file; + protected $row_num; + protected $header_offset; + protected $cell_formats_arr; + public function __construct() { if(!ini_get('date.timezone')) { - //using date functions can kick out warning if this isn't set + //using date functions can kick out warning if this isn't set date_default_timezone_set('UTC'); } } @@ -86,69 +91,86 @@ class XLSXWriter $zip->close(); } - public function writeSheet(array $data, $sheet_name='', array $header_types=array() ) { - $data = empty($data) ? array( array('') ) : $data; - + $data = empty($data) ? array(array('')) : $data; + + $row_count = count($data); + $column_count = count($data[self::array_first_key($data)]); + + $this->writeSheetHead($row_count, $column_count, $sheet_name, $header_types); + + foreach($data as $i=>$row) + { + $this->writeSheetRow($row); + } + + $this->writeSheetFooter(); + } + + public function writeSheetHead($row_count, $column_count, $sheet_name='', array $header_types=array() ) + { $sheet_filename = $this->tempFilename(); - $sheet_default = 'Sheet'.(count($this->sheets_meta)+1); + $sheet_default = 'Sheet' . (count($this->sheets_meta) + 1); $sheet_name = !empty($sheet_name) ? $sheet_name : $sheet_default; - $this->sheets_meta[] = array('filename'=>$sheet_filename, 'sheetname'=>$sheet_name ,'xmlname'=>strtolower($sheet_default).".xml" ); + $this->sheets_meta[] = array('filename' => $sheet_filename, 'sheetname' => $sheet_name, 'xmlname' => strtolower($sheet_default) . ".xml"); - $header_offset = empty($header_types) ? 0 : 1; - $row_count = count($data) + $header_offset; - $column_count = count($data[self::array_first_key($data)]); - $max_cell = self::xlsCell( $row_count-1, $column_count-1 ); + $this->header_offset = empty($header_types) ? 0 : 1; + $row_count = $row_count + $this->header_offset; + $max_cell = self::xlsCell($row_count - 1, $column_count - 1); - $tabselected = count($this->sheets_meta)==1 ? 'true' : 'false';//only first sheet is selected - $cell_formats_arr = empty($header_types) ? array_fill(0, $column_count, 'string') : array_values($header_types); + $tabselected = count($this->sheets_meta) == 1 ? 'true' : 'false';//only first sheet is selected + $this->cell_formats_arr = empty($header_types) ? array_fill(0, $column_count, 'string') : array_values($header_types); $header_row = empty($header_types) ? array() : array_keys($header_types); - $file = new XLSXWriter_BuffererWriter($sheet_filename); - $file->write('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'."\n"); - $file->write('<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">'); - $file->write( '<sheetPr filterMode="false">'); - $file->write( '<pageSetUpPr fitToPage="false"/>'); - $file->write( '</sheetPr>'); - $file->write( '<dimension ref="A1:'.$max_cell.'"/>'); - $file->write( '<sheetViews>'); - $file->write( '<sheetView colorId="64" defaultGridColor="true" rightToLeft="false" showFormulas="false" showGridLines="true" showOutlineSymbols="true" showRowColHeaders="true" showZeros="true" tabSelected="'.$tabselected.'" topLeftCell="A1" view="normal" windowProtection="false" workbookViewId="0" zoomScale="100" zoomScaleNormal="100" zoomScalePageLayoutView="100">'); - $file->write( '<selection activeCell="A1" activeCellId="0" pane="topLeft" sqref="A1"/>'); - $file->write( '</sheetView>'); - $file->write( '</sheetViews>'); - $file->write( '<cols>'); - $file->write( '<col collapsed="false" hidden="false" max="1025" min="1" style="0" width="11.5"/>'); - $file->write( '</cols>'); - $file->write( '<sheetData>'); - if (!empty($header_row)) - { - $file->write('<row collapsed="false" customFormat="false" customHeight="false" hidden="false" ht="12.1" outlineLevel="0" r="'.(1).'">'); - foreach($header_row as $k=>$v) - { - $this->writeCell($file, 0, $k, $v, $cell_format='string'); + $this->file = new XLSXWriter_BuffererWriter($sheet_filename); + $this->file->write('<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' . "\n"); + $this->file->write('<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">'); + $this->file->write('<sheetPr filterMode="false">'); + $this->file->write('<pageSetUpPr fitToPage="false"/>'); + $this->file->write('</sheetPr>'); + $this->file->write('<dimension ref="A1:' . $max_cell . '"/>'); + $this->file->write('<sheetViews>'); + $this->file->write('<sheetView colorId="64" defaultGridColor="true" rightToLeft="false" showFormulas="false" showGridLines="true" showOutlineSymbols="true" showRowColHeaders="true" showZeros="true" tabSelected="' . $tabselected . '" topLeftCell="A1" view="normal" windowProtection="false" workbookViewId="0" zoomScale="100" zoomScaleNormal="100" zoomScalePageLayoutView="100">'); + $this->file->write('<selection activeCell="A1" activeCellId="0" pane="topLeft" sqref="A1"/>'); + $this->file->write('</sheetView>'); + $this->file->write('</sheetViews>'); + $this->file->write('<cols>'); + $this->file->write('<col collapsed="false" hidden="false" max="1025" min="1" style="0" width="11.5"/>'); + $this->file->write('</cols>'); + $this->file->write('<sheetData>'); + if (!empty($header_row)) { + $this->file->write('<row collapsed="false" customFormat="false" customHeight="false" hidden="false" ht="12.1" outlineLevel="0" r="' . (1) . '">'); + foreach ($header_row as $k => $v) { + $this->writeCell($this->file, 0, $k, $v, $cell_format = 'string'); } - $file->write('</row>'); + $this->file->write('</row>'); } - foreach($data as $i=>$row) - { - $file->write('<row collapsed="false" customFormat="false" customHeight="false" hidden="false" ht="12.1" outlineLevel="0" r="'.($i+$header_offset+1).'">'); - foreach($row as $k=>$v) - { - $this->writeCell($file, $i+$header_offset, $k, $v, $cell_formats_arr[$k]); - } - $file->write('</row>'); + $this->row_num = 0; + } + + public function writeSheetRow($row) + { + $this->file->write('<row collapsed="false" customFormat="false" customHeight="false" hidden="false" ht="12.1" outlineLevel="0" r="' . ($this->row_num + $this->header_offset + 1) . '">'); + foreach ($row as $k => $v) { + $this->writeCell($this->file, $this->row_num + $this->header_offset, $k, $v, $this->cell_formats_arr[$k]); } - $file->write( '</sheetData>'); - $file->write( '<printOptions headings="false" gridLines="false" gridLinesSet="true" horizontalCentered="false" verticalCentered="false"/>'); - $file->write( '<pageMargins left="0.5" right="0.5" top="1.0" bottom="1.0" header="0.5" footer="0.5"/>'); - $file->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"/>'); - $file->write( '<headerFooter differentFirst="false" differentOddEven="false">'); - $file->write( '<oddHeader>&C&"Times New Roman,Regular"&12&A</oddHeader>'); - $file->write( '<oddFooter>&C&"Times New Roman,Regular"&12Page &P</oddFooter>'); - $file->write( '</headerFooter>'); - $file->write('</worksheet>'); - $file->close(); + $this->file->write('</row>'); + $this->row_num++; + } + + public function writeSheetFooter() + { + $this->file->write( '</sheetData>'); + $this->file->write( '<printOptions headings="false" gridLines="false" gridLinesSet="true" horizontalCentered="false" verticalCentered="false"/>'); + $this->file->write( '<pageMargins left="0.5" right="0.5" top="1.0" bottom="1.0" header="0.5" footer="0.5"/>'); + $this->file->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"/>'); + $this->file->write( '<headerFooter differentFirst="false" differentOddEven="false">'); + $this->file->write( '<oddHeader>&C&"Times New Roman,Regular"&12&A</oddHeader>'); + $this->file->write( '<oddFooter>&C&"Times New Roman,Regular"&12Page &P</oddFooter>'); + $this->file->write( '</headerFooter>'); + $this->file->write('</worksheet>'); + $this->file->close(); } protected function writeCell(XLSXWriter_BuffererWriter &$file, $row_number, $column_number, $value, $cell_format)