| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796 | <?php/** * PHPExcel * * Copyright (c) 2006 - 2011 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 * @copyright  Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) * @license    http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt	LGPL * @version    1.7.6, 2011-02-27 *//** PHPExcel root directory */if (!defined('PHPEXCEL_ROOT')) {	define('PHPEXCEL_ROOT', dirname(__FILE__) . '/');	require(PHPEXCEL_ROOT . 'PHPExcel/Autoloader.php');}/** * PHPExcel * * @category   PHPExcel * @package    PHPExcel * @copyright  Copyright (c) 2006 - 2011 PHPExcel (http://www.codeplex.com/PHPExcel) */class PHPExcel{	/**	 * Document properties	 *	 * @var PHPExcel_DocumentProperties	 */	private $_properties;	/**	 * Document security	 *	 * @var PHPExcel_DocumentSecurity	 */	private $_security;	/**	 * Collection of Worksheet objects	 *	 * @var PHPExcel_Worksheet[]	 */	private $_workSheetCollection = array();	/**	 * Active sheet index	 *	 * @var int	 */	private $_activeSheetIndex = 0;	/**	 * Named ranges	 *	 * @var PHPExcel_NamedRange[]	 */	private $_namedRanges = array();	/**	 * CellXf supervisor	 *	 * @var PHPExcel_Style	 */	private $_cellXfSupervisor;	/**	 * CellXf collection	 *	 * @var PHPExcel_Style[]	 */	private $_cellXfCollection = array();	/**	 * CellStyleXf collection	 *	 * @var PHPExcel_Style[]	 */	private $_cellStyleXfCollection = array();	/**	 * Create a new PHPExcel with one Worksheet	 */	public function __construct()	{		// Initialise worksheet collection and add one worksheet		$this->_workSheetCollection = array();		$this->_workSheetCollection[] = new PHPExcel_Worksheet($this);		$this->_activeSheetIndex = 0;		// Create document properties		$this->_properties = new PHPExcel_DocumentProperties();		// Create document security		$this->_security = new PHPExcel_DocumentSecurity();		// Set named ranges		$this->_namedRanges = array();		// Create the cellXf supervisor		$this->_cellXfSupervisor = new PHPExcel_Style(true);		$this->_cellXfSupervisor->bindParent($this);		// Create the default style		$this->addCellXf(new PHPExcel_Style);		$this->addCellStyleXf(new PHPExcel_Style);	}	public function disconnectWorksheets() {		foreach($this->_workSheetCollection as $k => &$worksheet) {			$worksheet->disconnectCells();			$this->_workSheetCollection[$k] = null;		}		unset($worksheet);		$this->_workSheetCollection = array();	}	/**	 * Get properties	 *	 * @return PHPExcel_DocumentProperties	 */	public function getProperties()	{		return $this->_properties;	}	/**	 * Set properties	 *	 * @param PHPExcel_DocumentProperties	$pValue	 */	public function setProperties(PHPExcel_DocumentProperties $pValue)	{		$this->_properties = $pValue;	}	/**	 * Get security	 *	 * @return PHPExcel_DocumentSecurity	 */	public function getSecurity()	{		return $this->_security;	}	/**	 * Set security	 *	 * @param PHPExcel_DocumentSecurity	$pValue	 */	public function setSecurity(PHPExcel_DocumentSecurity $pValue)	{		$this->_security = $pValue;	}	/**	 * Get active sheet	 *	 * @return PHPExcel_Worksheet	 */	public function getActiveSheet()	{		return $this->_workSheetCollection[$this->_activeSheetIndex];	}    /**     * Create sheet and add it to this workbook     *     * @return PHPExcel_Worksheet     */    public function createSheet($iSheetIndex = null)    {        $newSheet = new PHPExcel_Worksheet($this);        $this->addSheet($newSheet, $iSheetIndex);        return $newSheet;    }    /**     * Add sheet     *     * @param PHPExcel_Worksheet $pSheet	 * @param int|null $iSheetIndex Index where sheet should go (0,1,..., or null for last)     * @return PHPExcel_Worksheet     * @throws Exception     */    public function addSheet(PHPExcel_Worksheet $pSheet = null, $iSheetIndex = null)    {        if(is_null($iSheetIndex))        {            $this->_workSheetCollection[] = $pSheet;        }        else        {            // Insert the sheet at the requested index            array_splice(                $this->_workSheetCollection,                $iSheetIndex,                0,                array($pSheet)                );			// Adjust active sheet index if necessary			if ($this->_activeSheetIndex >= $iSheetIndex) {				++$this->_activeSheetIndex;			}        }		return $pSheet;    }	/**	 * Remove sheet by index	 *	 * @param int $pIndex Active sheet index	 * @throws Exception	 */	public function removeSheetByIndex($pIndex = 0)	{		if ($pIndex > count($this->_workSheetCollection) - 1) {			throw new Exception("Sheet index is out of bounds.");		} else {			array_splice($this->_workSheetCollection, $pIndex, 1);		}	}	/**	 * Get sheet by index	 *	 * @param int $pIndex Sheet index	 * @return PHPExcel_Worksheet	 * @throws Exception	 */	public function getSheet($pIndex = 0)	{		if ($pIndex > count($this->_workSheetCollection) - 1) {			throw new Exception("Sheet index is out of bounds.");		} else {			return $this->_workSheetCollection[$pIndex];		}	}	/**	 * Get all sheets	 *	 * @return PHPExcel_Worksheet[]	 */	public function getAllSheets()	{		return $this->_workSheetCollection;	}	/**	 * Get sheet by name	 *	 * @param string $pName Sheet name	 * @return PHPExcel_Worksheet	 * @throws Exception	 */	public function getSheetByName($pName = '')	{		$worksheetCount = count($this->_workSheetCollection);		for ($i = 0; $i < $worksheetCount; ++$i) {			if ($this->_workSheetCollection[$i]->getTitle() == $pName) {				return $this->_workSheetCollection[$i];			}		}		return null;	}	/**	 * Get index for sheet	 *	 * @param PHPExcel_Worksheet $pSheet	 * @return Sheet index	 * @throws Exception	 */	public function getIndex(PHPExcel_Worksheet $pSheet)	{		foreach ($this->_workSheetCollection as $key => $value) {			if ($value->getHashCode() == $pSheet->getHashCode()) {				return $key;			}		}	}    /**	 * Set index for sheet by sheet name.	 *	 * @param string $sheetName Sheet name to modify index for	 * @param int $newIndex New index for the sheet	 * @return New sheet index	 * @throws Exception	 */    public function setIndexByName($sheetName, $newIndex)    {        $oldIndex = $this->getIndex($this->getSheetByName($sheetName));        $pSheet = array_splice(            $this->_workSheetCollection,            $oldIndex,            1            );        array_splice(            $this->_workSheetCollection,            $newIndex,            0,            $pSheet            );        return $newIndex;    }	/**	 * Get sheet count	 *	 * @return int	 */	public function getSheetCount()	{		return count($this->_workSheetCollection);	}	/**	 * Get active sheet index	 *	 * @return int Active sheet index	 */	public function getActiveSheetIndex()	{		return $this->_activeSheetIndex;	}	/**	 * Set active sheet index	 *	 * @param int $pIndex Active sheet index	 * @throws Exception	 * @return PHPExcel_Worksheet	 */	public function setActiveSheetIndex($pIndex = 0)	{		if ($pIndex > count($this->_workSheetCollection) - 1) {			throw new Exception("Active sheet index is out of bounds.");		} else {			$this->_activeSheetIndex = $pIndex;		}		return $this->getActiveSheet();	}	/**	 * Set active sheet index by name	 *	 * @param string $pValue Sheet title	 * @return PHPExcel_Worksheet	 * @throws Exception	 */	public function setActiveSheetIndexByName($pValue = '')	{		if (($worksheet = $this->getSheetByName($pValue)) instanceof PHPExcel_Worksheet) {			$this->setActiveSheetIndex($worksheet->getParent()->getIndex($worksheet));			return $worksheet;		}		throw new Exception('Workbook does not contain sheet:' . $pValue);	}	/**	 * Get sheet names	 *	 * @return string[]	 */	public function getSheetNames()	{		$returnValue = array();		$worksheetCount = $this->getSheetCount();		for ($i = 0; $i < $worksheetCount; ++$i) {			array_push($returnValue, $this->getSheet($i)->getTitle());		}		return $returnValue;	}	/**	 * Add external sheet	 *	 * @param PHPExcel_Worksheet $pSheet External sheet to add	 * @param int|null $iSheetIndex Index where sheet should go (0,1,..., or null for last)	 * @throws Exception	 * @return PHPExcel_Worksheet	 */	public function addExternalSheet(PHPExcel_Worksheet $pSheet, $iSheetIndex = null) {		if (!is_null($this->getSheetByName($pSheet->getTitle()))) {			throw new Exception("Workbook already contains a worksheet named '{$pSheet->getTitle()}'. Rename the external sheet first.");		}		// count how many cellXfs there are in this workbook currently, we will need this below		$countCellXfs = count($this->_cellXfCollection);		// copy all the shared cellXfs from the external workbook and append them to the current		foreach ($pSheet->getParent()->getCellXfCollection() as $cellXf) {			$this->addCellXf(clone $cellXf);		}		// move sheet to this workbook		$pSheet->rebindParent($this);		// update the cellXfs		foreach ($pSheet->getCellCollection(false) as $cellID) {			$cell = $pSheet->getCell($cellID);			$cell->setXfIndex( $cell->getXfIndex() + $countCellXfs );		}		return $this->addSheet($pSheet, $iSheetIndex);	}	/**	 * Get named ranges	 *	 * @return PHPExcel_NamedRange[]	 */	public function getNamedRanges() {		return $this->_namedRanges;	}	/**	 * Add named range	 *	 * @param PHPExcel_NamedRange $namedRange	 * @return PHPExcel	 */	public function addNamedRange(PHPExcel_NamedRange $namedRange) {		if ($namedRange->getScope() == null) {			// global scope			$this->_namedRanges[$namedRange->getName()] = $namedRange;		} else {			// local scope			$this->_namedRanges[$namedRange->getScope()->getTitle().'!'.$namedRange->getName()] = $namedRange;		}		return true;	}	/**	 * Get named range	 *	 * @param string $namedRange	 * @param PHPExcel_Worksheet|null $pSheet Scope. Use null for global scope	 * @return PHPExcel_NamedRange|null	 */	public function getNamedRange($namedRange, PHPExcel_Worksheet $pSheet = null) {		$returnValue = null;		if ($namedRange != '' && !is_null($namedRange)) {			// first look for global defined name			if (isset($this->_namedRanges[$namedRange])) {				$returnValue = $this->_namedRanges[$namedRange];			}			// then look for local defined name (has priority over global defined name if both names exist)			if (!is_null($pSheet) && isset($this->_namedRanges[$pSheet->getTitle() . '!' . $namedRange])) {				$returnValue = $this->_namedRanges[$pSheet->getTitle() . '!' . $namedRange];			}		}		return $returnValue;	}	/**	 * Remove named range	 *	 * @param string $namedRange	 * @param PHPExcel_Worksheet|null $pSheet. Scope. Use null for global scope.	 * @return PHPExcel	 */	public function removeNamedRange($namedRange, PHPExcel_Worksheet $pSheet = null) {		if (is_null($pSheet)) {			if (isset($this->_namedRanges[$namedRange])) {				unset($this->_namedRanges[$namedRange]);			}		} else {			if (isset($this->_namedRanges[$pSheet->getTitle() . '!' . $namedRange])) {				unset($this->_namedRanges[$pSheet->getTitle() . '!' . $namedRange]);			}		}		return $this;	}	/**	 * Get worksheet iterator	 *	 * @return PHPExcel_WorksheetIterator	 */	public function getWorksheetIterator() {		return new PHPExcel_WorksheetIterator($this);	}	/**	 * Copy workbook (!= clone!)	 *	 * @return PHPExcel	 */	public function copy() {		$copied = clone $this;		$worksheetCount = count($this->_workSheetCollection);		for ($i = 0; $i < $worksheetCount; ++$i) {			$this->_workSheetCollection[$i] = $this->_workSheetCollection[$i]->copy();			$this->_workSheetCollection[$i]->rebindParent($this);		}		return $copied;	}	/**	 * Implement PHP __clone to create a deep clone, not just a shallow copy.	 */	public function __clone() {		foreach($this as $key => $val) {			if (is_object($val) || (is_array($val))) {				$this->{$key} = unserialize(serialize($val));			}		}	}	/**	 * Get the workbook collection of cellXfs	 *	 * @return PHPExcel_Style[]	 */	public function getCellXfCollection()	{		return $this->_cellXfCollection;	}	/**	 * Get cellXf by index	 *	 * @param int $index	 * @return PHPExcel_Style	 */	public function getCellXfByIndex($pIndex = 0)	{		return $this->_cellXfCollection[$pIndex];	}	/**	 * Get cellXf by hash code	 *	 * @param string $pValue	 * @return PHPExcel_Style|false	 */	public function getCellXfByHashCode($pValue = '')	{		foreach ($this->_cellXfCollection as $cellXf) {			if ($cellXf->getHashCode() == $pValue) {				return $cellXf;			}		}		return false;	}	/**	 * Get default style	 *	 * @return PHPExcel_Style	 * @throws Exception	 */	public function getDefaultStyle()	{		if (isset($this->_cellXfCollection[0])) {			return $this->_cellXfCollection[0];		}		throw new Exception('No default style found for this workbook');	}	/**	 * Add a cellXf to the workbook	 *	 * @param PHPExcel_Style	 */	public function addCellXf(PHPExcel_Style $style)	{		$this->_cellXfCollection[] = $style;		$style->setIndex(count($this->_cellXfCollection) - 1);	}	/**	 * Remove cellXf by index. It is ensured that all cells get their xf index updated.	 *	 * @param int $pIndex Index to cellXf	 * @throws Exception	 */	public function removeCellXfByIndex($pIndex = 0)	{		if ($pIndex > count($this->_cellXfCollection) - 1) {			throw new Exception("CellXf index is out of bounds.");		} else {			// first remove the cellXf			array_splice($this->_cellXfCollection, $pIndex, 1);			// then update cellXf indexes for cells			foreach ($this->_workSheetCollection as $worksheet) {				foreach ($worksheet->getCellCollection(false) as $cellID) {					$cell = $worksheet->getCell($cellID);					$xfIndex = $cell->getXfIndex();					if ($xfIndex > $pIndex ) {						// decrease xf index by 1						$cell->setXfIndex($xfIndex - 1);					} else if ($xfIndex == $pIndex) {						// set to default xf index 0						$cell->setXfIndex(0);					}				}			}		}	}	/**	 * Get the cellXf supervisor	 *	 * @return PHPExcel_Style	 */	public function getCellXfSupervisor()	{		return $this->_cellXfSupervisor;	}	/**	 * Get the workbook collection of cellStyleXfs	 *	 * @return PHPExcel_Style[]	 */	public function getCellStyleXfCollection()	{		return $this->_cellStyleXfCollection;	}	/**	 * Get cellStyleXf by index	 *	 * @param int $pIndex	 * @return PHPExcel_Style	 */	public function getCellStyleXfByIndex($pIndex = 0)	{		return $this->_cellStyleXfCollection[$pIndex];	}	/**	 * Get cellStyleXf by hash code	 *	 * @param string $pValue	 * @return PHPExcel_Style|false	 */	public function getCellStyleXfByHashCode($pValue = '')	{		foreach ($this->_cellXfStyleCollection as $cellStyleXf) {			if ($cellStyleXf->getHashCode() == $pValue) {				return $cellStyleXf;			}		}		return false;	}	/**	 * Add a cellStyleXf to the workbook	 *	 * @param PHPExcel_Style $pStyle	 */	public function addCellStyleXf(PHPExcel_Style $pStyle)	{		$this->_cellStyleXfCollection[] = $pStyle;		$pStyle->setIndex(count($this->_cellStyleXfCollection) - 1);	}	/**	 * Remove cellStyleXf by index	 *	 * @param int $pIndex	 * @throws Exception	 */	public function removeCellStyleXfByIndex($pIndex = 0)	{		if ($pIndex > count($this->_cellStyleXfCollection) - 1) {			throw new Exception("CellStyleXf index is out of bounds.");		} else {			array_splice($this->_cellStyleXfCollection, $pIndex, 1);		}	}	/**	 * Eliminate all unneeded cellXf and afterwards update the xfIndex for all cells	 * and columns in the workbook	 */	public function garbageCollect()	{    	// how many references are there to each cellXf ?		$countReferencesCellXf = array();		foreach ($this->_cellXfCollection as $index => $cellXf) {			$countReferencesCellXf[$index] = 0;		}		foreach ($this->getWorksheetIterator() as $sheet) {			// from cells			foreach ($sheet->getCellCollection(false) as $cellID) {				$cell = $sheet->getCell($cellID);				++$countReferencesCellXf[$cell->getXfIndex()];			}			// from row dimensions			foreach ($sheet->getRowDimensions() as $rowDimension) {				if ($rowDimension->getXfIndex() !== null) {					++$countReferencesCellXf[$rowDimension->getXfIndex()];				}			}			// from column dimensions			foreach ($sheet->getColumnDimensions() as $columnDimension) {				++$countReferencesCellXf[$columnDimension->getXfIndex()];			}		}		// remove cellXfs without references and create mapping so we can update xfIndex		// for all cells and columns		$countNeededCellXfs = 0;		foreach ($this->_cellXfCollection as $index => $cellXf) {			if ($countReferencesCellXf[$index] > 0 || $index == 0) { // we must never remove the first cellXf				++$countNeededCellXfs;			} else {				unset($this->_cellXfCollection[$index]);			}			$map[$index] = $countNeededCellXfs - 1;		}		$this->_cellXfCollection = array_values($this->_cellXfCollection);		// update the index for all cellXfs		foreach ($this->_cellXfCollection as $i => $cellXf) {			$cellXf->setIndex($i);		}		// make sure there is always at least one cellXf (there should be)		if (count($this->_cellXfCollection) == 0) {			$this->_cellXfCollection[] = new PHPExcel_Style();		}		// update the xfIndex for all cells, row dimensions, column dimensions		foreach ($this->getWorksheetIterator() as $sheet) {			// for all cells			foreach ($sheet->getCellCollection(false) as $cellID) {				$cell = $sheet->getCell($cellID);				$cell->setXfIndex( $map[$cell->getXfIndex()] );			}			// for all row dimensions			foreach ($sheet->getRowDimensions() as $rowDimension) {				if ($rowDimension->getXfIndex() !== null) {					$rowDimension->setXfIndex( $map[$rowDimension->getXfIndex()] );				}			}			// for all column dimensions			foreach ($sheet->getColumnDimensions() as $columnDimension) {				$columnDimension->setXfIndex( $map[$columnDimension->getXfIndex()] );			}		}		// also do garbage collection for all the sheets		foreach ($this->getWorksheetIterator() as $sheet) {			$sheet->garbageCollect();		}	}}
 |