3886c47ebe
Refactoring of calculation engine for improved performance and memory usage Refactoring of cell object to eliminate data duplication and reduce memory
1215 lines
44 KiB
PHP
1215 lines
44 KiB
PHP
<?php
|
|
/**
|
|
* PHPExcel
|
|
*
|
|
* Copyright (c) 2006 - 2012 PHPExcel
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*
|
|
* @category PHPExcel
|
|
* @package PHPExcel_Writer_Excel2007
|
|
* @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
|
|
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
|
|
* @version ##VERSION##, ##DATE##
|
|
*/
|
|
|
|
|
|
/**
|
|
* PHPExcel_Writer_Excel2007_Worksheet
|
|
*
|
|
* @category PHPExcel
|
|
* @package PHPExcel_Writer_Excel2007
|
|
* @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
|
|
*/
|
|
class PHPExcel_Writer_Excel2007_Worksheet extends PHPExcel_Writer_Excel2007_WriterPart
|
|
{
|
|
/**
|
|
* Write worksheet to XML format
|
|
*
|
|
* @param PHPExcel_Worksheet $pSheet
|
|
* @param string[] $pStringTable
|
|
* @param boolean $includeCharts Flag indicating if we should write charts
|
|
* @return string XML Output
|
|
* @throws PHPExcel_Writer_Exception
|
|
*/
|
|
public function writeWorksheet($pSheet = null, $pStringTable = null, $includeCharts = FALSE)
|
|
{
|
|
if (!is_null($pSheet)) {
|
|
// Create XML writer
|
|
$objWriter = null;
|
|
if ($this->getParentWriter()->getUseDiskCaching()) {
|
|
$objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_DISK, $this->getParentWriter()->getDiskCachingDirectory());
|
|
} else {
|
|
$objWriter = new PHPExcel_Shared_XMLWriter(PHPExcel_Shared_XMLWriter::STORAGE_MEMORY);
|
|
}
|
|
|
|
// XML header
|
|
$objWriter->startDocument('1.0','UTF-8','yes');
|
|
|
|
// Worksheet
|
|
$objWriter->startElement('worksheet');
|
|
$objWriter->writeAttribute('xml:space', 'preserve');
|
|
$objWriter->writeAttribute('xmlns', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main');
|
|
$objWriter->writeAttribute('xmlns:r', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships');
|
|
|
|
// sheetPr
|
|
$this->_writeSheetPr($objWriter, $pSheet);
|
|
|
|
// Dimension
|
|
$this->_writeDimension($objWriter, $pSheet);
|
|
|
|
// sheetViews
|
|
$this->_writeSheetViews($objWriter, $pSheet);
|
|
|
|
// sheetFormatPr
|
|
$this->_writeSheetFormatPr($objWriter, $pSheet);
|
|
|
|
// cols
|
|
$this->_writeCols($objWriter, $pSheet);
|
|
|
|
// sheetData
|
|
$this->_writeSheetData($objWriter, $pSheet, $pStringTable);
|
|
|
|
// sheetProtection
|
|
$this->_writeSheetProtection($objWriter, $pSheet);
|
|
|
|
// protectedRanges
|
|
$this->_writeProtectedRanges($objWriter, $pSheet);
|
|
|
|
// autoFilter
|
|
$this->_writeAutoFilter($objWriter, $pSheet);
|
|
|
|
// mergeCells
|
|
$this->_writeMergeCells($objWriter, $pSheet);
|
|
|
|
// conditionalFormatting
|
|
$this->_writeConditionalFormatting($objWriter, $pSheet);
|
|
|
|
// dataValidations
|
|
$this->_writeDataValidations($objWriter, $pSheet);
|
|
|
|
// hyperlinks
|
|
$this->_writeHyperlinks($objWriter, $pSheet);
|
|
|
|
// Print options
|
|
$this->_writePrintOptions($objWriter, $pSheet);
|
|
|
|
// Page margins
|
|
$this->_writePageMargins($objWriter, $pSheet);
|
|
|
|
// Page setup
|
|
$this->_writePageSetup($objWriter, $pSheet);
|
|
|
|
// Header / footer
|
|
$this->_writeHeaderFooter($objWriter, $pSheet);
|
|
|
|
// Breaks
|
|
$this->_writeBreaks($objWriter, $pSheet);
|
|
|
|
// Drawings and/or Charts
|
|
$this->_writeDrawings($objWriter, $pSheet, $includeCharts);
|
|
|
|
// LegacyDrawing
|
|
$this->_writeLegacyDrawing($objWriter, $pSheet);
|
|
|
|
// LegacyDrawingHF
|
|
$this->_writeLegacyDrawingHF($objWriter, $pSheet);
|
|
|
|
$objWriter->endElement();
|
|
|
|
// Return
|
|
return $objWriter->getData();
|
|
} else {
|
|
throw new PHPExcel_Writer_Exception("Invalid PHPExcel_Worksheet object passed.");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Write SheetPr
|
|
*
|
|
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
|
|
* @param PHPExcel_Worksheet $pSheet Worksheet
|
|
* @throws PHPExcel_Writer_Exception
|
|
*/
|
|
private function _writeSheetPr(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
|
|
{
|
|
// sheetPr
|
|
$objWriter->startElement('sheetPr');
|
|
//$objWriter->writeAttribute('codeName', $pSheet->getTitle());
|
|
$autoFilterRange = $pSheet->getAutoFilter()->getRange();
|
|
if (!empty($autoFilterRange)) {
|
|
$objWriter->writeAttribute('filterMode', 1);
|
|
$pSheet->getAutoFilter()->showHideRows();
|
|
}
|
|
|
|
// tabColor
|
|
if ($pSheet->isTabColorSet()) {
|
|
$objWriter->startElement('tabColor');
|
|
$objWriter->writeAttribute('rgb', $pSheet->getTabColor()->getARGB());
|
|
$objWriter->endElement();
|
|
}
|
|
|
|
// outlinePr
|
|
$objWriter->startElement('outlinePr');
|
|
$objWriter->writeAttribute('summaryBelow', ($pSheet->getShowSummaryBelow() ? '1' : '0'));
|
|
$objWriter->writeAttribute('summaryRight', ($pSheet->getShowSummaryRight() ? '1' : '0'));
|
|
$objWriter->endElement();
|
|
|
|
// pageSetUpPr
|
|
if ($pSheet->getPageSetup()->getFitToPage()) {
|
|
$objWriter->startElement('pageSetUpPr');
|
|
$objWriter->writeAttribute('fitToPage', '1');
|
|
$objWriter->endElement();
|
|
}
|
|
|
|
$objWriter->endElement();
|
|
}
|
|
|
|
/**
|
|
* Write Dimension
|
|
*
|
|
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
|
|
* @param PHPExcel_Worksheet $pSheet Worksheet
|
|
* @throws PHPExcel_Writer_Exception
|
|
*/
|
|
private function _writeDimension(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
|
|
{
|
|
// dimension
|
|
$objWriter->startElement('dimension');
|
|
$objWriter->writeAttribute('ref', $pSheet->calculateWorksheetDimension());
|
|
$objWriter->endElement();
|
|
}
|
|
|
|
/**
|
|
* Write SheetViews
|
|
*
|
|
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
|
|
* @param PHPExcel_Worksheet $pSheet Worksheet
|
|
* @throws PHPExcel_Writer_Exception
|
|
*/
|
|
private function _writeSheetViews(PHPExcel_Shared_XMLWriter $objWriter = NULL, PHPExcel_Worksheet $pSheet = NULL)
|
|
{
|
|
// sheetViews
|
|
$objWriter->startElement('sheetViews');
|
|
|
|
// Sheet selected?
|
|
$sheetSelected = false;
|
|
if ($this->getParentWriter()->getPHPExcel()->getIndex($pSheet) == $this->getParentWriter()->getPHPExcel()->getActiveSheetIndex())
|
|
$sheetSelected = true;
|
|
|
|
|
|
// sheetView
|
|
$objWriter->startElement('sheetView');
|
|
$objWriter->writeAttribute('tabSelected', $sheetSelected ? '1' : '0');
|
|
$objWriter->writeAttribute('workbookViewId', '0');
|
|
|
|
// Zoom scales
|
|
if ($pSheet->getSheetView()->getZoomScale() != 100) {
|
|
$objWriter->writeAttribute('zoomScale', $pSheet->getSheetView()->getZoomScale());
|
|
}
|
|
if ($pSheet->getSheetView()->getZoomScaleNormal() != 100) {
|
|
$objWriter->writeAttribute('zoomScaleNormal', $pSheet->getSheetView()->getZoomScaleNormal());
|
|
}
|
|
|
|
// View Layout Type
|
|
if ($pSheet->getSheetView()->getView() !== PHPExcel_Worksheet_SheetView::SHEETVIEW_NORMAL) {
|
|
$objWriter->writeAttribute('view', $pSheet->getSheetView()->getView());
|
|
}
|
|
|
|
// Gridlines
|
|
if ($pSheet->getShowGridlines()) {
|
|
$objWriter->writeAttribute('showGridLines', 'true');
|
|
} else {
|
|
$objWriter->writeAttribute('showGridLines', 'false');
|
|
}
|
|
|
|
// Row and column headers
|
|
if ($pSheet->getShowRowColHeaders()) {
|
|
$objWriter->writeAttribute('showRowColHeaders', '1');
|
|
} else {
|
|
$objWriter->writeAttribute('showRowColHeaders', '0');
|
|
}
|
|
|
|
// Right-to-left
|
|
if ($pSheet->getRightToLeft()) {
|
|
$objWriter->writeAttribute('rightToLeft', 'true');
|
|
}
|
|
|
|
$activeCell = $pSheet->getActiveCell();
|
|
|
|
// Pane
|
|
$pane = '';
|
|
$topLeftCell = $pSheet->getFreezePane();
|
|
if (($topLeftCell != '') && ($topLeftCell != 'A1')) {
|
|
$activeCell = $topLeftCell;
|
|
// Calculate freeze coordinates
|
|
$xSplit = $ySplit = 0;
|
|
|
|
list($xSplit, $ySplit) = PHPExcel_Cell::coordinateFromString($topLeftCell);
|
|
$xSplit = PHPExcel_Cell::columnIndexFromString($xSplit);
|
|
|
|
// pane
|
|
$pane = 'topRight';
|
|
$objWriter->startElement('pane');
|
|
if ($xSplit > 1)
|
|
$objWriter->writeAttribute('xSplit', $xSplit - 1);
|
|
if ($ySplit > 1) {
|
|
$objWriter->writeAttribute('ySplit', $ySplit - 1);
|
|
$pane = ($xSplit > 1) ? 'bottomRight' : 'bottomLeft';
|
|
}
|
|
$objWriter->writeAttribute('topLeftCell', $topLeftCell);
|
|
$objWriter->writeAttribute('activePane', $pane);
|
|
$objWriter->writeAttribute('state', 'frozen');
|
|
$objWriter->endElement();
|
|
|
|
if (($xSplit > 1) && ($ySplit > 1)) {
|
|
// Write additional selections if more than two panes (ie both an X and a Y split)
|
|
$objWriter->startElement('selection'); $objWriter->writeAttribute('pane', 'topRight'); $objWriter->endElement();
|
|
$objWriter->startElement('selection'); $objWriter->writeAttribute('pane', 'bottomLeft'); $objWriter->endElement();
|
|
}
|
|
}
|
|
|
|
// Selection
|
|
// if ($pane != '') {
|
|
// Only need to write selection element if we have a split pane
|
|
// We cheat a little by over-riding the active cell selection, setting it to the split cell
|
|
$objWriter->startElement('selection');
|
|
if ($pane != '') {
|
|
$objWriter->writeAttribute('pane', $pane);
|
|
}
|
|
$objWriter->writeAttribute('activeCell', $activeCell);
|
|
$objWriter->writeAttribute('sqref', $activeCell);
|
|
$objWriter->endElement();
|
|
// }
|
|
|
|
$objWriter->endElement();
|
|
|
|
$objWriter->endElement();
|
|
}
|
|
|
|
/**
|
|
* Write SheetFormatPr
|
|
*
|
|
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
|
|
* @param PHPExcel_Worksheet $pSheet Worksheet
|
|
* @throws PHPExcel_Writer_Exception
|
|
*/
|
|
private function _writeSheetFormatPr(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
|
|
{
|
|
// sheetFormatPr
|
|
$objWriter->startElement('sheetFormatPr');
|
|
|
|
// Default row height
|
|
if ($pSheet->getDefaultRowDimension()->getRowHeight() >= 0) {
|
|
$objWriter->writeAttribute('customHeight', 'true');
|
|
$objWriter->writeAttribute('defaultRowHeight', PHPExcel_Shared_String::FormatNumber($pSheet->getDefaultRowDimension()->getRowHeight()));
|
|
} else {
|
|
$objWriter->writeAttribute('defaultRowHeight', '14.4');
|
|
}
|
|
|
|
// Set Zero Height row
|
|
if ((string)$pSheet->getDefaultRowDimension()->getzeroHeight() == '1' ||
|
|
strtolower((string)$pSheet->getDefaultRowDimension()->getzeroHeight()) == 'true' ) {
|
|
$objWriter->writeAttribute('zeroHeight', '1');
|
|
}
|
|
|
|
// Default column width
|
|
if ($pSheet->getDefaultColumnDimension()->getWidth() >= 0) {
|
|
$objWriter->writeAttribute('defaultColWidth', PHPExcel_Shared_String::FormatNumber($pSheet->getDefaultColumnDimension()->getWidth()));
|
|
}
|
|
|
|
// Outline level - row
|
|
$outlineLevelRow = 0;
|
|
foreach ($pSheet->getRowDimensions() as $dimension) {
|
|
if ($dimension->getOutlineLevel() > $outlineLevelRow) {
|
|
$outlineLevelRow = $dimension->getOutlineLevel();
|
|
}
|
|
}
|
|
$objWriter->writeAttribute('outlineLevelRow', (int)$outlineLevelRow);
|
|
|
|
// Outline level - column
|
|
$outlineLevelCol = 0;
|
|
foreach ($pSheet->getColumnDimensions() as $dimension) {
|
|
if ($dimension->getOutlineLevel() > $outlineLevelCol) {
|
|
$outlineLevelCol = $dimension->getOutlineLevel();
|
|
}
|
|
}
|
|
$objWriter->writeAttribute('outlineLevelCol', (int)$outlineLevelCol);
|
|
|
|
$objWriter->endElement();
|
|
}
|
|
|
|
/**
|
|
* Write Cols
|
|
*
|
|
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
|
|
* @param PHPExcel_Worksheet $pSheet Worksheet
|
|
* @throws PHPExcel_Writer_Exception
|
|
*/
|
|
private function _writeCols(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
|
|
{
|
|
// cols
|
|
if (count($pSheet->getColumnDimensions()) > 0) {
|
|
$objWriter->startElement('cols');
|
|
|
|
$pSheet->calculateColumnWidths();
|
|
|
|
// Loop through column dimensions
|
|
foreach ($pSheet->getColumnDimensions() as $colDimension) {
|
|
// col
|
|
$objWriter->startElement('col');
|
|
$objWriter->writeAttribute('min', PHPExcel_Cell::columnIndexFromString($colDimension->getColumnIndex()));
|
|
$objWriter->writeAttribute('max', PHPExcel_Cell::columnIndexFromString($colDimension->getColumnIndex()));
|
|
|
|
if ($colDimension->getWidth() < 0) {
|
|
// No width set, apply default of 10
|
|
$objWriter->writeAttribute('width', '9.10');
|
|
} else {
|
|
// Width set
|
|
$objWriter->writeAttribute('width', PHPExcel_Shared_String::FormatNumber($colDimension->getWidth()));
|
|
}
|
|
|
|
// Column visibility
|
|
if ($colDimension->getVisible() == false) {
|
|
$objWriter->writeAttribute('hidden', 'true');
|
|
}
|
|
|
|
// Auto size?
|
|
if ($colDimension->getAutoSize()) {
|
|
$objWriter->writeAttribute('bestFit', 'true');
|
|
}
|
|
|
|
// Custom width?
|
|
if ($colDimension->getWidth() != $pSheet->getDefaultColumnDimension()->getWidth()) {
|
|
$objWriter->writeAttribute('customWidth', 'true');
|
|
}
|
|
|
|
// Collapsed
|
|
if ($colDimension->getCollapsed() == true) {
|
|
$objWriter->writeAttribute('collapsed', 'true');
|
|
}
|
|
|
|
// Outline level
|
|
if ($colDimension->getOutlineLevel() > 0) {
|
|
$objWriter->writeAttribute('outlineLevel', $colDimension->getOutlineLevel());
|
|
}
|
|
|
|
// Style
|
|
$objWriter->writeAttribute('style', $colDimension->getXfIndex());
|
|
|
|
$objWriter->endElement();
|
|
}
|
|
|
|
$objWriter->endElement();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Write SheetProtection
|
|
*
|
|
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
|
|
* @param PHPExcel_Worksheet $pSheet Worksheet
|
|
* @throws PHPExcel_Writer_Exception
|
|
*/
|
|
private function _writeSheetProtection(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
|
|
{
|
|
// sheetProtection
|
|
$objWriter->startElement('sheetProtection');
|
|
|
|
if ($pSheet->getProtection()->getPassword() != '') {
|
|
$objWriter->writeAttribute('password', $pSheet->getProtection()->getPassword());
|
|
}
|
|
|
|
$objWriter->writeAttribute('sheet', ($pSheet->getProtection()->getSheet() ? 'true' : 'false'));
|
|
$objWriter->writeAttribute('objects', ($pSheet->getProtection()->getObjects() ? 'true' : 'false'));
|
|
$objWriter->writeAttribute('scenarios', ($pSheet->getProtection()->getScenarios() ? 'true' : 'false'));
|
|
$objWriter->writeAttribute('formatCells', ($pSheet->getProtection()->getFormatCells() ? 'true' : 'false'));
|
|
$objWriter->writeAttribute('formatColumns', ($pSheet->getProtection()->getFormatColumns() ? 'true' : 'false'));
|
|
$objWriter->writeAttribute('formatRows', ($pSheet->getProtection()->getFormatRows() ? 'true' : 'false'));
|
|
$objWriter->writeAttribute('insertColumns', ($pSheet->getProtection()->getInsertColumns() ? 'true' : 'false'));
|
|
$objWriter->writeAttribute('insertRows', ($pSheet->getProtection()->getInsertRows() ? 'true' : 'false'));
|
|
$objWriter->writeAttribute('insertHyperlinks', ($pSheet->getProtection()->getInsertHyperlinks() ? 'true' : 'false'));
|
|
$objWriter->writeAttribute('deleteColumns', ($pSheet->getProtection()->getDeleteColumns() ? 'true' : 'false'));
|
|
$objWriter->writeAttribute('deleteRows', ($pSheet->getProtection()->getDeleteRows() ? 'true' : 'false'));
|
|
$objWriter->writeAttribute('selectLockedCells', ($pSheet->getProtection()->getSelectLockedCells() ? 'true' : 'false'));
|
|
$objWriter->writeAttribute('sort', ($pSheet->getProtection()->getSort() ? 'true' : 'false'));
|
|
$objWriter->writeAttribute('autoFilter', ($pSheet->getProtection()->getAutoFilter() ? 'true' : 'false'));
|
|
$objWriter->writeAttribute('pivotTables', ($pSheet->getProtection()->getPivotTables() ? 'true' : 'false'));
|
|
$objWriter->writeAttribute('selectUnlockedCells', ($pSheet->getProtection()->getSelectUnlockedCells() ? 'true' : 'false'));
|
|
$objWriter->endElement();
|
|
}
|
|
|
|
/**
|
|
* Write ConditionalFormatting
|
|
*
|
|
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
|
|
* @param PHPExcel_Worksheet $pSheet Worksheet
|
|
* @throws PHPExcel_Writer_Exception
|
|
*/
|
|
private function _writeConditionalFormatting(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
|
|
{
|
|
// Conditional id
|
|
$id = 1;
|
|
|
|
// Loop through styles in the current worksheet
|
|
foreach ($pSheet->getConditionalStylesCollection() as $cellCoordinate => $conditionalStyles) {
|
|
foreach ($conditionalStyles as $conditional) {
|
|
// WHY was this again?
|
|
// if ($this->getParentWriter()->getStylesConditionalHashTable()->getIndexForHashCode( $conditional->getHashCode() ) == '') {
|
|
// continue;
|
|
// }
|
|
if ($conditional->getConditionType() != PHPExcel_Style_Conditional::CONDITION_NONE) {
|
|
// conditionalFormatting
|
|
$objWriter->startElement('conditionalFormatting');
|
|
$objWriter->writeAttribute('sqref', $cellCoordinate);
|
|
|
|
// cfRule
|
|
$objWriter->startElement('cfRule');
|
|
$objWriter->writeAttribute('type', $conditional->getConditionType());
|
|
$objWriter->writeAttribute('dxfId', $this->getParentWriter()->getStylesConditionalHashTable()->getIndexForHashCode( $conditional->getHashCode() ));
|
|
$objWriter->writeAttribute('priority', $id++);
|
|
|
|
if (($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CELLIS
|
|
||
|
|
$conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT)
|
|
&& $conditional->getOperatorType() != PHPExcel_Style_Conditional::OPERATOR_NONE) {
|
|
$objWriter->writeAttribute('operator', $conditional->getOperatorType());
|
|
}
|
|
|
|
if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT
|
|
&& !is_null($conditional->getText())) {
|
|
$objWriter->writeAttribute('text', $conditional->getText());
|
|
}
|
|
|
|
if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT
|
|
&& $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_CONTAINSTEXT
|
|
&& !is_null($conditional->getText())) {
|
|
$objWriter->writeElement('formula', 'NOT(ISERROR(SEARCH("' . $conditional->getText() . '",' . $cellCoordinate . ')))');
|
|
} else if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT
|
|
&& $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_BEGINSWITH
|
|
&& !is_null($conditional->getText())) {
|
|
$objWriter->writeElement('formula', 'LEFT(' . $cellCoordinate . ',' . strlen($conditional->getText()) . ')="' . $conditional->getText() . '"');
|
|
} else if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT
|
|
&& $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_ENDSWITH
|
|
&& !is_null($conditional->getText())) {
|
|
$objWriter->writeElement('formula', 'RIGHT(' . $cellCoordinate . ',' . strlen($conditional->getText()) . ')="' . $conditional->getText() . '"');
|
|
} else if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT
|
|
&& $conditional->getOperatorType() == PHPExcel_Style_Conditional::OPERATOR_NOTCONTAINS
|
|
&& !is_null($conditional->getText())) {
|
|
$objWriter->writeElement('formula', 'ISERROR(SEARCH("' . $conditional->getText() . '",' . $cellCoordinate . '))');
|
|
} else if ($conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CELLIS
|
|
|| $conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_CONTAINSTEXT
|
|
|| $conditional->getConditionType() == PHPExcel_Style_Conditional::CONDITION_EXPRESSION) {
|
|
foreach ($conditional->getConditions() as $formula) {
|
|
// Formula
|
|
$objWriter->writeElement('formula', $formula);
|
|
}
|
|
}
|
|
|
|
$objWriter->endElement();
|
|
|
|
$objWriter->endElement();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Write DataValidations
|
|
*
|
|
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
|
|
* @param PHPExcel_Worksheet $pSheet Worksheet
|
|
* @throws PHPExcel_Writer_Exception
|
|
*/
|
|
private function _writeDataValidations(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
|
|
{
|
|
// Datavalidation collection
|
|
$dataValidationCollection = $pSheet->getDataValidationCollection();
|
|
|
|
// Write data validations?
|
|
if (!empty($dataValidationCollection)) {
|
|
$objWriter->startElement('dataValidations');
|
|
$objWriter->writeAttribute('count', count($dataValidationCollection));
|
|
|
|
foreach ($dataValidationCollection as $coordinate => $dv) {
|
|
$objWriter->startElement('dataValidation');
|
|
|
|
if ($dv->getType() != '') {
|
|
$objWriter->writeAttribute('type', $dv->getType());
|
|
}
|
|
|
|
if ($dv->getErrorStyle() != '') {
|
|
$objWriter->writeAttribute('errorStyle', $dv->getErrorStyle());
|
|
}
|
|
|
|
if ($dv->getOperator() != '') {
|
|
$objWriter->writeAttribute('operator', $dv->getOperator());
|
|
}
|
|
|
|
$objWriter->writeAttribute('allowBlank', ($dv->getAllowBlank() ? '1' : '0'));
|
|
$objWriter->writeAttribute('showDropDown', (!$dv->getShowDropDown() ? '1' : '0'));
|
|
$objWriter->writeAttribute('showInputMessage', ($dv->getShowInputMessage() ? '1' : '0'));
|
|
$objWriter->writeAttribute('showErrorMessage', ($dv->getShowErrorMessage() ? '1' : '0'));
|
|
|
|
if ($dv->getErrorTitle() !== '') {
|
|
$objWriter->writeAttribute('errorTitle', $dv->getErrorTitle());
|
|
}
|
|
if ($dv->getError() !== '') {
|
|
$objWriter->writeAttribute('error', $dv->getError());
|
|
}
|
|
if ($dv->getPromptTitle() !== '') {
|
|
$objWriter->writeAttribute('promptTitle', $dv->getPromptTitle());
|
|
}
|
|
if ($dv->getPrompt() !== '') {
|
|
$objWriter->writeAttribute('prompt', $dv->getPrompt());
|
|
}
|
|
|
|
$objWriter->writeAttribute('sqref', $coordinate);
|
|
|
|
if ($dv->getFormula1() !== '') {
|
|
$objWriter->writeElement('formula1', $dv->getFormula1());
|
|
}
|
|
if ($dv->getFormula2() !== '') {
|
|
$objWriter->writeElement('formula2', $dv->getFormula2());
|
|
}
|
|
|
|
$objWriter->endElement();
|
|
}
|
|
|
|
$objWriter->endElement();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Write Hyperlinks
|
|
*
|
|
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
|
|
* @param PHPExcel_Worksheet $pSheet Worksheet
|
|
* @throws PHPExcel_Writer_Exception
|
|
*/
|
|
private function _writeHyperlinks(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
|
|
{
|
|
// Hyperlink collection
|
|
$hyperlinkCollection = $pSheet->getHyperlinkCollection();
|
|
|
|
// Relation ID
|
|
$relationId = 1;
|
|
|
|
// Write hyperlinks?
|
|
if (!empty($hyperlinkCollection)) {
|
|
$objWriter->startElement('hyperlinks');
|
|
|
|
foreach ($hyperlinkCollection as $coordinate => $hyperlink) {
|
|
$objWriter->startElement('hyperlink');
|
|
|
|
$objWriter->writeAttribute('ref', $coordinate);
|
|
if (!$hyperlink->isInternal()) {
|
|
$objWriter->writeAttribute('r:id', 'rId_hyperlink_' . $relationId);
|
|
++$relationId;
|
|
} else {
|
|
$objWriter->writeAttribute('location', str_replace('sheet://', '', $hyperlink->getUrl()));
|
|
}
|
|
|
|
if ($hyperlink->getTooltip() != '') {
|
|
$objWriter->writeAttribute('tooltip', $hyperlink->getTooltip());
|
|
}
|
|
|
|
$objWriter->endElement();
|
|
}
|
|
|
|
$objWriter->endElement();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Write ProtectedRanges
|
|
*
|
|
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
|
|
* @param PHPExcel_Worksheet $pSheet Worksheet
|
|
* @throws PHPExcel_Writer_Exception
|
|
*/
|
|
private function _writeProtectedRanges(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
|
|
{
|
|
if (count($pSheet->getProtectedCells()) > 0) {
|
|
// protectedRanges
|
|
$objWriter->startElement('protectedRanges');
|
|
|
|
// Loop protectedRanges
|
|
foreach ($pSheet->getProtectedCells() as $protectedCell => $passwordHash) {
|
|
// protectedRange
|
|
$objWriter->startElement('protectedRange');
|
|
$objWriter->writeAttribute('name', 'p' . md5($protectedCell));
|
|
$objWriter->writeAttribute('sqref', $protectedCell);
|
|
if (!empty($passwordHash)) {
|
|
$objWriter->writeAttribute('password', $passwordHash);
|
|
}
|
|
$objWriter->endElement();
|
|
}
|
|
|
|
$objWriter->endElement();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Write MergeCells
|
|
*
|
|
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
|
|
* @param PHPExcel_Worksheet $pSheet Worksheet
|
|
* @throws PHPExcel_Writer_Exception
|
|
*/
|
|
private function _writeMergeCells(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
|
|
{
|
|
if (count($pSheet->getMergeCells()) > 0) {
|
|
// mergeCells
|
|
$objWriter->startElement('mergeCells');
|
|
|
|
// Loop mergeCells
|
|
foreach ($pSheet->getMergeCells() as $mergeCell) {
|
|
// mergeCell
|
|
$objWriter->startElement('mergeCell');
|
|
$objWriter->writeAttribute('ref', $mergeCell);
|
|
$objWriter->endElement();
|
|
}
|
|
|
|
$objWriter->endElement();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Write PrintOptions
|
|
*
|
|
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
|
|
* @param PHPExcel_Worksheet $pSheet Worksheet
|
|
* @throws PHPExcel_Writer_Exception
|
|
*/
|
|
private function _writePrintOptions(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
|
|
{
|
|
// printOptions
|
|
$objWriter->startElement('printOptions');
|
|
|
|
$objWriter->writeAttribute('gridLines', ($pSheet->getPrintGridlines() ? 'true': 'false'));
|
|
$objWriter->writeAttribute('gridLinesSet', 'true');
|
|
|
|
if ($pSheet->getPageSetup()->getHorizontalCentered()) {
|
|
$objWriter->writeAttribute('horizontalCentered', 'true');
|
|
}
|
|
|
|
if ($pSheet->getPageSetup()->getVerticalCentered()) {
|
|
$objWriter->writeAttribute('verticalCentered', 'true');
|
|
}
|
|
|
|
$objWriter->endElement();
|
|
}
|
|
|
|
/**
|
|
* Write PageMargins
|
|
*
|
|
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
|
|
* @param PHPExcel_Worksheet $pSheet Worksheet
|
|
* @throws PHPExcel_Writer_Exception
|
|
*/
|
|
private function _writePageMargins(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
|
|
{
|
|
// pageMargins
|
|
$objWriter->startElement('pageMargins');
|
|
$objWriter->writeAttribute('left', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getLeft()));
|
|
$objWriter->writeAttribute('right', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getRight()));
|
|
$objWriter->writeAttribute('top', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getTop()));
|
|
$objWriter->writeAttribute('bottom', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getBottom()));
|
|
$objWriter->writeAttribute('header', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getHeader()));
|
|
$objWriter->writeAttribute('footer', PHPExcel_Shared_String::FormatNumber($pSheet->getPageMargins()->getFooter()));
|
|
$objWriter->endElement();
|
|
}
|
|
|
|
/**
|
|
* Write AutoFilter
|
|
*
|
|
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
|
|
* @param PHPExcel_Worksheet $pSheet Worksheet
|
|
* @throws PHPExcel_Writer_Exception
|
|
*/
|
|
private function _writeAutoFilter(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
|
|
{
|
|
$autoFilterRange = $pSheet->getAutoFilter()->getRange();
|
|
if (!empty($autoFilterRange)) {
|
|
// autoFilter
|
|
$objWriter->startElement('autoFilter');
|
|
|
|
// Strip any worksheet reference from the filter coordinates
|
|
$range = PHPExcel_Cell::splitRange($autoFilterRange);
|
|
$range = $range[0];
|
|
// Strip any worksheet ref
|
|
if (strpos($range[0],'!') !== false) {
|
|
list($ws,$range[0]) = explode('!',$range[0]);
|
|
}
|
|
$range = implode(':', $range);
|
|
|
|
$objWriter->writeAttribute('ref', str_replace('$','',$range));
|
|
|
|
$columns = $pSheet->getAutoFilter()->getColumns();
|
|
if (count($columns > 0)) {
|
|
foreach($columns as $columnID => $column) {
|
|
$rules = $column->getRules();
|
|
if (count($rules > 0)) {
|
|
$objWriter->startElement('filterColumn');
|
|
$objWriter->writeAttribute('colId', $pSheet->getAutoFilter()->getColumnOffset($columnID));
|
|
|
|
$objWriter->startElement( $column->getFilterType());
|
|
if ($column->getJoin() == PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_COLUMN_JOIN_AND) {
|
|
$objWriter->writeAttribute('and', 1);
|
|
}
|
|
|
|
foreach ($rules as $rule) {
|
|
if (($column->getFilterType() === PHPExcel_Worksheet_AutoFilter_Column::AUTOFILTER_FILTERTYPE_FILTER) &&
|
|
($rule->getOperator() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL) &&
|
|
($rule->getValue() === '')) {
|
|
// Filter rule for Blanks
|
|
$objWriter->writeAttribute('blank', 1);
|
|
} elseif($rule->getRuleType() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DYNAMICFILTER) {
|
|
// Dynamic Filter Rule
|
|
$objWriter->writeAttribute('type', $rule->getGrouping());
|
|
$val = $column->getAttribute('val');
|
|
if ($val !== NULL) {
|
|
$objWriter->writeAttribute('val', $val);
|
|
}
|
|
$maxVal = $column->getAttribute('maxVal');
|
|
if ($maxVal !== NULL) {
|
|
$objWriter->writeAttribute('maxVal', $maxVal);
|
|
}
|
|
} elseif($rule->getRuleType() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_TOPTENFILTER) {
|
|
// Top 10 Filter Rule
|
|
$objWriter->writeAttribute('val', $rule->getValue());
|
|
$objWriter->writeAttribute('percent', (($rule->getOperator() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_PERCENT) ? '1' : '0'));
|
|
$objWriter->writeAttribute('top', (($rule->getGrouping() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_TOPTEN_TOP) ? '1': '0'));
|
|
} else {
|
|
// Filter, DateGroupItem or CustomFilter
|
|
$objWriter->startElement($rule->getRuleType());
|
|
|
|
if ($rule->getOperator() !== PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_COLUMN_RULE_EQUAL) {
|
|
$objWriter->writeAttribute('operator', $rule->getOperator());
|
|
}
|
|
if ($rule->getRuleType() === PHPExcel_Worksheet_AutoFilter_Column_Rule::AUTOFILTER_RULETYPE_DATEGROUP) {
|
|
// Date Group filters
|
|
foreach($rule->getValue() as $key => $value) {
|
|
if ($value > '') $objWriter->writeAttribute($key, $value);
|
|
}
|
|
$objWriter->writeAttribute('dateTimeGrouping', $rule->getGrouping());
|
|
} else {
|
|
$objWriter->writeAttribute('val', $rule->getValue());
|
|
}
|
|
|
|
$objWriter->endElement();
|
|
}
|
|
}
|
|
|
|
$objWriter->endElement();
|
|
|
|
$objWriter->endElement();
|
|
}
|
|
}
|
|
}
|
|
|
|
$objWriter->endElement();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Write PageSetup
|
|
*
|
|
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
|
|
* @param PHPExcel_Worksheet $pSheet Worksheet
|
|
* @throws PHPExcel_Writer_Exception
|
|
*/
|
|
private function _writePageSetup(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
|
|
{
|
|
// pageSetup
|
|
$objWriter->startElement('pageSetup');
|
|
$objWriter->writeAttribute('paperSize', $pSheet->getPageSetup()->getPaperSize());
|
|
$objWriter->writeAttribute('orientation', $pSheet->getPageSetup()->getOrientation());
|
|
|
|
if (!is_null($pSheet->getPageSetup()->getScale())) {
|
|
$objWriter->writeAttribute('scale', $pSheet->getPageSetup()->getScale());
|
|
}
|
|
if (!is_null($pSheet->getPageSetup()->getFitToHeight())) {
|
|
$objWriter->writeAttribute('fitToHeight', $pSheet->getPageSetup()->getFitToHeight());
|
|
} else {
|
|
$objWriter->writeAttribute('fitToHeight', '0');
|
|
}
|
|
if (!is_null($pSheet->getPageSetup()->getFitToWidth())) {
|
|
$objWriter->writeAttribute('fitToWidth', $pSheet->getPageSetup()->getFitToWidth());
|
|
} else {
|
|
$objWriter->writeAttribute('fitToWidth', '0');
|
|
}
|
|
if (!is_null($pSheet->getPageSetup()->getFirstPageNumber())) {
|
|
$objWriter->writeAttribute('firstPageNumber', $pSheet->getPageSetup()->getFirstPageNumber());
|
|
$objWriter->writeAttribute('useFirstPageNumber', '1');
|
|
}
|
|
|
|
$objWriter->endElement();
|
|
}
|
|
|
|
/**
|
|
* Write Header / Footer
|
|
*
|
|
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
|
|
* @param PHPExcel_Worksheet $pSheet Worksheet
|
|
* @throws PHPExcel_Writer_Exception
|
|
*/
|
|
private function _writeHeaderFooter(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
|
|
{
|
|
// headerFooter
|
|
$objWriter->startElement('headerFooter');
|
|
$objWriter->writeAttribute('differentOddEven', ($pSheet->getHeaderFooter()->getDifferentOddEven() ? 'true' : 'false'));
|
|
$objWriter->writeAttribute('differentFirst', ($pSheet->getHeaderFooter()->getDifferentFirst() ? 'true' : 'false'));
|
|
$objWriter->writeAttribute('scaleWithDoc', ($pSheet->getHeaderFooter()->getScaleWithDocument() ? 'true' : 'false'));
|
|
$objWriter->writeAttribute('alignWithMargins', ($pSheet->getHeaderFooter()->getAlignWithMargins() ? 'true' : 'false'));
|
|
|
|
$objWriter->writeElement('oddHeader', $pSheet->getHeaderFooter()->getOddHeader());
|
|
$objWriter->writeElement('oddFooter', $pSheet->getHeaderFooter()->getOddFooter());
|
|
$objWriter->writeElement('evenHeader', $pSheet->getHeaderFooter()->getEvenHeader());
|
|
$objWriter->writeElement('evenFooter', $pSheet->getHeaderFooter()->getEvenFooter());
|
|
$objWriter->writeElement('firstHeader', $pSheet->getHeaderFooter()->getFirstHeader());
|
|
$objWriter->writeElement('firstFooter', $pSheet->getHeaderFooter()->getFirstFooter());
|
|
$objWriter->endElement();
|
|
}
|
|
|
|
/**
|
|
* Write Breaks
|
|
*
|
|
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
|
|
* @param PHPExcel_Worksheet $pSheet Worksheet
|
|
* @throws PHPExcel_Writer_Exception
|
|
*/
|
|
private function _writeBreaks(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
|
|
{
|
|
// Get row and column breaks
|
|
$aRowBreaks = array();
|
|
$aColumnBreaks = array();
|
|
foreach ($pSheet->getBreaks() as $cell => $breakType) {
|
|
if ($breakType == PHPExcel_Worksheet::BREAK_ROW) {
|
|
$aRowBreaks[] = $cell;
|
|
} else if ($breakType == PHPExcel_Worksheet::BREAK_COLUMN) {
|
|
$aColumnBreaks[] = $cell;
|
|
}
|
|
}
|
|
|
|
// rowBreaks
|
|
if (!empty($aRowBreaks)) {
|
|
$objWriter->startElement('rowBreaks');
|
|
$objWriter->writeAttribute('count', count($aRowBreaks));
|
|
$objWriter->writeAttribute('manualBreakCount', count($aRowBreaks));
|
|
|
|
foreach ($aRowBreaks as $cell) {
|
|
$coords = PHPExcel_Cell::coordinateFromString($cell);
|
|
|
|
$objWriter->startElement('brk');
|
|
$objWriter->writeAttribute('id', $coords[1]);
|
|
$objWriter->writeAttribute('man', '1');
|
|
$objWriter->endElement();
|
|
}
|
|
|
|
$objWriter->endElement();
|
|
}
|
|
|
|
// Second, write column breaks
|
|
if (!empty($aColumnBreaks)) {
|
|
$objWriter->startElement('colBreaks');
|
|
$objWriter->writeAttribute('count', count($aColumnBreaks));
|
|
$objWriter->writeAttribute('manualBreakCount', count($aColumnBreaks));
|
|
|
|
foreach ($aColumnBreaks as $cell) {
|
|
$coords = PHPExcel_Cell::coordinateFromString($cell);
|
|
|
|
$objWriter->startElement('brk');
|
|
$objWriter->writeAttribute('id', PHPExcel_Cell::columnIndexFromString($coords[0]) - 1);
|
|
$objWriter->writeAttribute('man', '1');
|
|
$objWriter->endElement();
|
|
}
|
|
|
|
$objWriter->endElement();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Write SheetData
|
|
*
|
|
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
|
|
* @param PHPExcel_Worksheet $pSheet Worksheet
|
|
* @param string[] $pStringTable String table
|
|
* @throws PHPExcel_Writer_Exception
|
|
*/
|
|
private function _writeSheetData(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pStringTable = null)
|
|
{
|
|
if (is_array($pStringTable)) {
|
|
// Flipped stringtable, for faster index searching
|
|
$aFlippedStringTable = $this->getParentWriter()->getWriterPart('stringtable')->flipStringTable($pStringTable);
|
|
|
|
// sheetData
|
|
$objWriter->startElement('sheetData');
|
|
|
|
// Get column count
|
|
$colCount = PHPExcel_Cell::columnIndexFromString($pSheet->getHighestColumn());
|
|
|
|
// Highest row number
|
|
$highestRow = $pSheet->getHighestRow();
|
|
|
|
// Loop through cells
|
|
$cellsByRow = array();
|
|
foreach ($pSheet->getCellCollection() as $cellID) {
|
|
$cellAddress = PHPExcel_Cell::coordinateFromString($cellID);
|
|
$cellsByRow[$cellAddress[1]][] = $cellID;
|
|
}
|
|
|
|
$currentRow = 0;
|
|
while($currentRow++ < $highestRow) {
|
|
// Get row dimension
|
|
$rowDimension = $pSheet->getRowDimension($currentRow);
|
|
|
|
// Write current row?
|
|
$writeCurrentRow = isset($cellsByRow[$currentRow]) ||
|
|
$rowDimension->getRowHeight() >= 0 ||
|
|
$rowDimension->getVisible() == false ||
|
|
$rowDimension->getCollapsed() == true ||
|
|
$rowDimension->getOutlineLevel() > 0 ||
|
|
$rowDimension->getXfIndex() !== null;
|
|
|
|
if ($writeCurrentRow) {
|
|
// Start a new row
|
|
$objWriter->startElement('row');
|
|
$objWriter->writeAttribute('r', $currentRow);
|
|
$objWriter->writeAttribute('spans', '1:' . $colCount);
|
|
|
|
// Row dimensions
|
|
if ($rowDimension->getRowHeight() >= 0) {
|
|
$objWriter->writeAttribute('customHeight', '1');
|
|
$objWriter->writeAttribute('ht', PHPExcel_Shared_String::FormatNumber($rowDimension->getRowHeight()));
|
|
}
|
|
|
|
// Row visibility
|
|
if ($rowDimension->getVisible() == false) {
|
|
$objWriter->writeAttribute('hidden', 'true');
|
|
}
|
|
|
|
// Collapsed
|
|
if ($rowDimension->getCollapsed() == true) {
|
|
$objWriter->writeAttribute('collapsed', 'true');
|
|
}
|
|
|
|
// Outline level
|
|
if ($rowDimension->getOutlineLevel() > 0) {
|
|
$objWriter->writeAttribute('outlineLevel', $rowDimension->getOutlineLevel());
|
|
}
|
|
|
|
// Style
|
|
if ($rowDimension->getXfIndex() !== null) {
|
|
$objWriter->writeAttribute('s', $rowDimension->getXfIndex());
|
|
$objWriter->writeAttribute('customFormat', '1');
|
|
}
|
|
|
|
// Write cells
|
|
if (isset($cellsByRow[$currentRow])) {
|
|
foreach($cellsByRow[$currentRow] as $cellAddress) {
|
|
// Write cell
|
|
$this->_writeCell($objWriter, $pSheet, $cellAddress, $pStringTable, $aFlippedStringTable);
|
|
}
|
|
}
|
|
|
|
// End row
|
|
$objWriter->endElement();
|
|
}
|
|
}
|
|
|
|
$objWriter->endElement();
|
|
} else {
|
|
throw new PHPExcel_Writer_Exception("Invalid parameters passed.");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Write Cell
|
|
*
|
|
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
|
|
* @param PHPExcel_Worksheet $pSheet Worksheet
|
|
* @param PHPExcel_Cell $pCellAddress Cell Address
|
|
* @param string[] $pStringTable String table
|
|
* @param string[] $pFlippedStringTable String table (flipped), for faster index searching
|
|
* @throws PHPExcel_Writer_Exception
|
|
*/
|
|
private function _writeCell(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $pCellAddress = null, $pStringTable = null, $pFlippedStringTable = null)
|
|
{
|
|
if (is_array($pStringTable) && is_array($pFlippedStringTable)) {
|
|
// Cell
|
|
$pCell = $pSheet->getCell($pCellAddress);
|
|
$objWriter->startElement('c');
|
|
$objWriter->writeAttribute('r', $pCellAddress);
|
|
|
|
// Sheet styles
|
|
if ($pCell->getXfIndex() != '') {
|
|
$objWriter->writeAttribute('s', $pCell->getXfIndex());
|
|
}
|
|
|
|
// If cell value is supplied, write cell value
|
|
$cellValue = $pCell->getValue();
|
|
if (is_object($cellValue) || $cellValue !== '') {
|
|
// Map type
|
|
$mappedType = $pCell->getDataType();
|
|
|
|
// Write data type depending on its type
|
|
switch (strtolower($mappedType)) {
|
|
case 'inlinestr': // Inline string
|
|
case 's': // String
|
|
case 'b': // Boolean
|
|
$objWriter->writeAttribute('t', $mappedType);
|
|
break;
|
|
case 'f': // Formula
|
|
$calculatedValue = ($this->getParentWriter()->getPreCalculateFormulas()) ?
|
|
$pCell->getCalculatedValue() :
|
|
$cellValue;
|
|
if (is_string($calculatedValue)) {
|
|
$objWriter->writeAttribute('t', 'str');
|
|
}
|
|
break;
|
|
case 'e': // Error
|
|
$objWriter->writeAttribute('t', $mappedType);
|
|
}
|
|
|
|
// Write data depending on its type
|
|
switch (strtolower($mappedType)) {
|
|
case 'inlinestr': // Inline string
|
|
if (! $cellValue instanceof PHPExcel_RichText) {
|
|
$objWriter->writeElement('t', PHPExcel_Shared_String::ControlCharacterPHP2OOXML( htmlspecialchars($cellValue) ) );
|
|
} else if ($cellValue instanceof PHPExcel_RichText) {
|
|
$objWriter->startElement('is');
|
|
$this->getParentWriter()->getWriterPart('stringtable')->writeRichText($objWriter, $cellValue);
|
|
$objWriter->endElement();
|
|
}
|
|
|
|
break;
|
|
case 's': // String
|
|
if (! $cellValue instanceof PHPExcel_RichText) {
|
|
if (isset($pFlippedStringTable[$cellValue])) {
|
|
$objWriter->writeElement('v', $pFlippedStringTable[$cellValue]);
|
|
}
|
|
} else if ($cellValue instanceof PHPExcel_RichText) {
|
|
$objWriter->writeElement('v', $pFlippedStringTable[$cellValue->getHashCode()]);
|
|
}
|
|
|
|
break;
|
|
case 'f': // Formula
|
|
$attributes = $pCell->getFormulaAttributes();
|
|
if($attributes['t'] == 'array') {
|
|
$objWriter->startElement('f');
|
|
$objWriter->writeAttribute('t', 'array');
|
|
$objWriter->writeAttribute('ref', $pCellAddress);
|
|
$objWriter->writeAttribute('aca', '1');
|
|
$objWriter->writeAttribute('ca', '1');
|
|
$objWriter->text(substr($cellValue, 1));
|
|
$objWriter->endElement();
|
|
} else {
|
|
$objWriter->writeElement('f', substr($cellValue, 1));
|
|
}
|
|
if ($this->getParentWriter()->getOffice2003Compatibility() === false) {
|
|
if ($this->getParentWriter()->getPreCalculateFormulas()) {
|
|
// $calculatedValue = $pCell->getCalculatedValue();
|
|
if (!is_array($calculatedValue) && substr($calculatedValue, 0, 1) != '#') {
|
|
$objWriter->writeElement('v', PHPExcel_Shared_String::FormatNumber($calculatedValue));
|
|
} else {
|
|
$objWriter->writeElement('v', '0');
|
|
}
|
|
} else {
|
|
$objWriter->writeElement('v', '0');
|
|
}
|
|
}
|
|
break;
|
|
case 'n': // Numeric
|
|
// force point as decimal separator in case current locale uses comma
|
|
$objWriter->writeElement('v', str_replace(',', '.', $cellValue));
|
|
break;
|
|
case 'b': // Boolean
|
|
$objWriter->writeElement('v', ($cellValue ? '1' : '0'));
|
|
break;
|
|
case 'e': // Error
|
|
if (substr($cellValue, 0, 1) == '=') {
|
|
$objWriter->writeElement('f', substr($cellValue, 1));
|
|
$objWriter->writeElement('v', substr($cellValue, 1));
|
|
} else {
|
|
$objWriter->writeElement('v', $cellValue);
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
$objWriter->endElement();
|
|
} else {
|
|
throw new PHPExcel_Writer_Exception("Invalid parameters passed.");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Write Drawings
|
|
*
|
|
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
|
|
* @param PHPExcel_Worksheet $pSheet Worksheet
|
|
* @param boolean $includeCharts Flag indicating if we should include drawing details for charts
|
|
* @throws PHPExcel_Writer_Exception
|
|
*/
|
|
private function _writeDrawings(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null, $includeCharts = FALSE)
|
|
{
|
|
$chartCount = ($includeCharts) ? $pSheet->getChartCollection()->count() : 0;
|
|
// If sheet contains drawings, add the relationships
|
|
if (($pSheet->getDrawingCollection()->count() > 0) ||
|
|
($chartCount > 0)) {
|
|
$objWriter->startElement('drawing');
|
|
$objWriter->writeAttribute('r:id', 'rId1');
|
|
$objWriter->endElement();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Write LegacyDrawing
|
|
*
|
|
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
|
|
* @param PHPExcel_Worksheet $pSheet Worksheet
|
|
* @throws PHPExcel_Writer_Exception
|
|
*/
|
|
private function _writeLegacyDrawing(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
|
|
{
|
|
// If sheet contains comments, add the relationships
|
|
if (count($pSheet->getComments()) > 0) {
|
|
$objWriter->startElement('legacyDrawing');
|
|
$objWriter->writeAttribute('r:id', 'rId_comments_vml1');
|
|
$objWriter->endElement();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Write LegacyDrawingHF
|
|
*
|
|
* @param PHPExcel_Shared_XMLWriter $objWriter XML Writer
|
|
* @param PHPExcel_Worksheet $pSheet Worksheet
|
|
* @throws PHPExcel_Writer_Exception
|
|
*/
|
|
private function _writeLegacyDrawingHF(PHPExcel_Shared_XMLWriter $objWriter = null, PHPExcel_Worksheet $pSheet = null)
|
|
{
|
|
// If sheet contains images, add the relationships
|
|
if (count($pSheet->getHeaderFooter()->getImages()) > 0) {
|
|
$objWriter->startElement('legacyDrawingHF');
|
|
$objWriter->writeAttribute('r:id', 'rId_headerfooter_vml1');
|
|
$objWriter->endElement();
|
|
}
|
|
}
|
|
}
|