From adaa35a87feeaf079d4178bb471073e0e19a75b6 Mon Sep 17 00:00:00 2001 From: Dieter Adriaenssens Date: Sat, 11 Sep 2010 16:18:42 +0200 Subject: [PATCH] Update library PHPExcel to version 1.7.4 --- ChangeLog | 1 + libraries/PHPExcel/PHPExcel.php | 4 +- libraries/PHPExcel/PHPExcel/Autoloader.php | 2 +- .../PHPExcel/CachedObjectStorage/APC.php | 45 ++- .../CachedObjectStorage/CacheBase.php | 35 ++- .../PHPExcel/CachedObjectStorage/DiscISAM.php | 28 +- .../PHPExcel/CachedObjectStorage/ICache.php | 9 +- .../PHPExcel/CachedObjectStorage/Memcache.php | 53 +++- .../PHPExcel/CachedObjectStorage/Memory.php | 2 +- .../CachedObjectStorage/MemoryGZip.php | 2 +- .../CachedObjectStorage/MemorySerialized.php | 2 +- .../PHPExcel/CachedObjectStorage/PHPTemp.php | 26 +- .../PHPExcel/CachedObjectStorage/Wincache.php | 58 +++- libraries/PHPExcel/PHPExcel/Calculation.php | 105 +++++-- .../PHPExcel/Calculation/Exception.php | 2 +- .../PHPExcel/Calculation/ExceptionHandler.php | 2 +- .../PHPExcel/Calculation/FormulaParser.php | 2 +- .../PHPExcel/Calculation/FormulaToken.php | 2 +- .../PHPExcel/Calculation/Function.php | 2 +- .../PHPExcel/Calculation/Functions.php | 175 +++++------ libraries/PHPExcel/PHPExcel/Cell.php | 294 +++++++++--------- .../PHPExcel/Cell/AdvancedValueBinder.php | 2 +- libraries/PHPExcel/PHPExcel/Cell/DataType.php | 2 +- .../PHPExcel/PHPExcel/Cell/DataValidation.php | 2 +- .../PHPExcel/Cell/DefaultValueBinder.php | 2 +- .../PHPExcel/PHPExcel/Cell/Hyperlink.php | 2 +- .../PHPExcel/PHPExcel/Cell/IValueBinder.php | 2 +- libraries/PHPExcel/PHPExcel/Comment.php | 2 +- .../PHPExcel/PHPExcel/DocumentProperties.php | 93 +++--- .../PHPExcel/PHPExcel/DocumentSecurity.php | 2 +- libraries/PHPExcel/PHPExcel/HashTable.php | 2 +- libraries/PHPExcel/PHPExcel/IComparable.php | 2 +- libraries/PHPExcel/PHPExcel/IOFactory.php | 2 +- libraries/PHPExcel/PHPExcel/NamedRange.php | 2 +- libraries/PHPExcel/PHPExcel/Reader/CSV.php | 2 +- .../PHPExcel/Reader/DefaultReadFilter.php | 2 +- .../PHPExcel/PHPExcel/Reader/Excel2003XML.php | 7 +- .../PHPExcel/PHPExcel/Reader/Excel2007.php | 55 +++- libraries/PHPExcel/PHPExcel/Reader/Excel5.php | 77 ++--- .../PHPExcel/Reader/Excel5/Escher.php | 2 +- .../PHPExcel/PHPExcel/Reader/IReadFilter.php | 2 +- .../PHPExcel/PHPExcel/Reader/IReader.php | 2 +- libraries/PHPExcel/PHPExcel/Reader/OOCalc.php | 15 +- libraries/PHPExcel/PHPExcel/Reader/SYLK.php | 2 +- .../PHPExcel/PHPExcel/Reader/Serialized.php | 2 +- .../PHPExcel/PHPExcel/ReferenceHelper.php | 161 +++++++--- libraries/PHPExcel/PHPExcel/RichText.php | 2 +- .../PHPExcel/RichText/ITextElement.php | 2 +- libraries/PHPExcel/PHPExcel/RichText/Run.php | 2 +- .../PHPExcel/RichText/TextElement.php | 2 +- libraries/PHPExcel/PHPExcel/Settings.php | 2 +- .../PHPExcel/PHPExcel/Shared/CodePage.php | 2 +- libraries/PHPExcel/PHPExcel/Shared/Date.php | 2 +- .../PHPExcel/PHPExcel/Shared/Drawing.php | 2 +- libraries/PHPExcel/PHPExcel/Shared/Escher.php | 2 +- .../PHPExcel/Shared/Escher/DgContainer.php | 2 +- .../Escher/DgContainer/SpgrContainer.php | 2 +- .../DgContainer/SpgrContainer/SpContainer.php | 2 +- .../PHPExcel/Shared/Escher/DggContainer.php | 28 +- .../Escher/DggContainer/BstoreContainer.php | 2 +- .../DggContainer/BstoreContainer/BSE.php | 2 +- .../DggContainer/BstoreContainer/BSE/Blip.php | 2 +- libraries/PHPExcel/PHPExcel/Shared/Excel5.php | 2 +- libraries/PHPExcel/PHPExcel/Shared/File.php | 21 +- libraries/PHPExcel/PHPExcel/Shared/Font.php | 2 +- .../Shared/OLE/ChainedBlockStream.php | 2 +- .../PHPExcel/PHPExcel/Shared/OLERead.php | 2 +- .../PHPExcel/Shared/PasswordHasher.php | 2 +- libraries/PHPExcel/PHPExcel/Shared/String.php | 4 +- .../PHPExcel/PHPExcel/Shared/XMLWriter.php | 11 +- .../PHPExcel/Shared/ZipStreamWrapper.php | 2 +- .../PHPExcel/Shared/trend/bestFitClass.php | 2 +- .../Shared/trend/exponentialBestFitClass.php | 2 +- .../Shared/trend/linearBestFitClass.php | 2 +- .../Shared/trend/logarithmicBestFitClass.php | 2 +- .../Shared/trend/polynomialBestFitClass.php | 2 +- .../Shared/trend/powerBestFitClass.php | 2 +- libraries/PHPExcel/PHPExcel/Style.php | 4 +- .../PHPExcel/PHPExcel/Style/Alignment.php | 4 +- libraries/PHPExcel/PHPExcel/Style/Border.php | 4 +- libraries/PHPExcel/PHPExcel/Style/Borders.php | 4 +- libraries/PHPExcel/PHPExcel/Style/Color.php | 4 +- .../PHPExcel/PHPExcel/Style/Conditional.php | 2 +- libraries/PHPExcel/PHPExcel/Style/Fill.php | 4 +- libraries/PHPExcel/PHPExcel/Style/Font.php | 4 +- .../PHPExcel/PHPExcel/Style/NumberFormat.php | 4 +- .../PHPExcel/PHPExcel/Style/Protection.php | 2 +- libraries/PHPExcel/PHPExcel/Worksheet.php | 15 +- .../PHPExcel/Worksheet/BaseDrawing.php | 2 +- .../PHPExcel/Worksheet/CellIterator.php | 2 +- .../PHPExcel/Worksheet/ColumnDimension.php | 2 +- .../PHPExcel/PHPExcel/Worksheet/Drawing.php | 2 +- .../PHPExcel/Worksheet/Drawing/Shadow.php | 2 +- .../PHPExcel/Worksheet/HeaderFooter.php | 2 +- .../Worksheet/HeaderFooterDrawing.php | 2 +- .../PHPExcel/Worksheet/MemoryDrawing.php | 2 +- .../PHPExcel/Worksheet/PageMargins.php | 2 +- .../PHPExcel/PHPExcel/Worksheet/PageSetup.php | 213 +++++++++++-- .../PHPExcel/Worksheet/Protection.php | 2 +- libraries/PHPExcel/PHPExcel/Worksheet/Row.php | 2 +- .../PHPExcel/Worksheet/RowDimension.php | 2 +- .../PHPExcel/Worksheet/RowIterator.php | 2 +- .../PHPExcel/PHPExcel/Worksheet/SheetView.php | 2 +- .../PHPExcel/PHPExcel/WorksheetIterator.php | 2 +- libraries/PHPExcel/PHPExcel/Writer/CSV.php | 5 +- .../PHPExcel/PHPExcel/Writer/Excel2007.php | 5 +- .../PHPExcel/Writer/Excel2007/Comments.php | 2 +- .../Writer/Excel2007/ContentTypes.php | 2 +- .../PHPExcel/Writer/Excel2007/DocProps.php | 2 +- .../PHPExcel/Writer/Excel2007/Drawing.php | 2 +- .../PHPExcel/Writer/Excel2007/Rels.php | 2 +- .../PHPExcel/Writer/Excel2007/StringTable.php | 2 +- .../PHPExcel/Writer/Excel2007/Style.php | 2 +- .../PHPExcel/Writer/Excel2007/Theme.php | 2 +- .../PHPExcel/Writer/Excel2007/Workbook.php | 2 +- .../PHPExcel/Writer/Excel2007/Worksheet.php | 15 +- .../PHPExcel/Writer/Excel2007/WriterPart.php | 2 +- libraries/PHPExcel/PHPExcel/Writer/Excel5.php | 285 ++++++++++++++++- .../PHPExcel/Writer/Excel5/BIFFwriter.php | 2 +- .../PHPExcel/Writer/Excel5/Escher.php | 9 +- .../PHPExcel/PHPExcel/Writer/Excel5/Font.php | 2 +- .../PHPExcel/Writer/Excel5/Parser.php | 20 +- .../PHPExcel/Writer/Excel5/Workbook.php | 172 ++-------- .../PHPExcel/Writer/Excel5/Worksheet.php | 193 +++++------- .../PHPExcel/PHPExcel/Writer/Excel5/Xf.php | 2 +- libraries/PHPExcel/PHPExcel/Writer/HTML.php | 11 +- .../PHPExcel/PHPExcel/Writer/IWriter.php | 2 +- libraries/PHPExcel/PHPExcel/Writer/PDF.php | 2 +- .../PHPExcel/PHPExcel/Writer/Serialized.php | 6 +- 129 files changed, 1553 insertions(+), 907 deletions(-) diff --git a/ChangeLog b/ChangeLog index 42030ef01..eeebed104 100644 --- a/ChangeLog +++ b/ChangeLog @@ -7,6 +7,7 @@ $HeadURL: https://phpmyadmin.svn.sourceforge.net/svnroot/phpmyadmin/trunk/phpMyA 3.3.8.0 (not yet released) - bug #3059311 [import] BIGINT field type added to table analysis +- [core] Update library PHPExcel to version 1.7.4 3.3.7.0 (2010-09-07) - patch #3050492 [PDF scratchboard] Cannot drag table box to the edge after diff --git a/libraries/PHPExcel/PHPExcel.php b/libraries/PHPExcel/PHPExcel.php index 8b9c71f5e..c54d421ac 100644 --- a/libraries/PHPExcel/PHPExcel.php +++ b/libraries/PHPExcel/PHPExcel.php @@ -22,7 +22,7 @@ * @package PHPExcel * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -434,7 +434,7 @@ class PHPExcel // update the cellXfs foreach ($pSheet->getCellCollection(false) as $cellID) { - $cell = $sheet->getCell($cellID); + $cell = $pSheet->getCell($cellID); $cell->setXfIndex( $cell->getXfIndex() + $countCellXfs ); } diff --git a/libraries/PHPExcel/PHPExcel/Autoloader.php b/libraries/PHPExcel/PHPExcel/Autoloader.php index 3821d74af..e66ce60d2 100644 --- a/libraries/PHPExcel/PHPExcel/Autoloader.php +++ b/libraries/PHPExcel/PHPExcel/Autoloader.php @@ -22,7 +22,7 @@ * @package PHPExcel * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ class PHPExcel_Autoloader diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/APC.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/APC.php index 62e3a1459..dae46c23f 100644 --- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/APC.php +++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/APC.php @@ -22,7 +22,7 @@ * @package PHPExcel_CachedObjectStorage * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -45,7 +45,7 @@ class PHPExcel_CachedObjectStorage_APC extends PHPExcel_CachedObjectStorage_Cach if (!apc_store($this->_cachePrefix.$this->_currentObjectID.'.cache',serialize($this->_currentObject),$this->_cacheTime)) { $this->__destruct(); - throw new Exception('Failed to store cell in APC'); + throw new Exception('Failed to store cell '.$cellID.' in APC'); } $this->_currentObjectID = $this->_currentObject = null; } // function _storeData() @@ -90,7 +90,7 @@ class PHPExcel_CachedObjectStorage_APC extends PHPExcel_CachedObjectStorage_Cach if ($success === false) { // Entry no longer exists in APC, so clear it from the cache array parent::deleteCacheData($pCoord); - throw new Exception('Cell entry no longer exists in APC'); + throw new Exception('Cell entry '.$cellID.' no longer exists in APC'); } return true; } @@ -117,7 +117,7 @@ class PHPExcel_CachedObjectStorage_APC extends PHPExcel_CachedObjectStorage_Cach if ($obj === false) { // Entry no longer exists in APC, so clear it from the cache array parent::deleteCacheData($pCoord); - throw new Exception('Cell entry no longer exists in APC'); + throw new Exception('Cell entry '.$cellID.' no longer exists in APC'); } } else { // Return null if requested entry doesn't exist in cache @@ -150,6 +150,35 @@ class PHPExcel_CachedObjectStorage_APC extends PHPExcel_CachedObjectStorage_Cach } // function deleteCacheData() + /** + * Clone the cell collection + * + * @return void + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) { + parent::copyCellCollection($parent); + // Get a new id for the new file name + $baseUnique = $this->_getUniqueID(); + $newCachePrefix = substr(md5($baseUnique),0,8).'.'; + $cacheList = $this->getCellList(); + foreach($cacheList as $cellID) { + if ($cellID != $this->_currentObjectID) { + $obj = apc_fetch($this->_cachePrefix.$cellID.'.cache'); + if ($obj === false) { + // Entry no longer exists in APC, so clear it from the cache array + parent::deleteCacheData($cellID); + throw new Exception('Cell entry '.$cellID.' no longer exists in APC'); + } + if (!apc_store($newCachePrefix.$cellID.'.cache',$obj,$this->_cacheTime)) { + $this->__destruct(); + throw new Exception('Failed to store cell '.$cellID.' in APC'); + } + } + } + $this->_cachePrefix = $newCachePrefix; + } // function copyCellCollection() + + public function unsetWorksheetCells() { if(!is_null($this->_currentObject)) { $this->_currentObject->detach(); @@ -170,12 +199,8 @@ class PHPExcel_CachedObjectStorage_APC extends PHPExcel_CachedObjectStorage_Cach $cacheTime = (isset($arguments['cacheTime'])) ? $arguments['cacheTime'] : 600; if (is_null($this->_cachePrefix)) { - if (function_exists('posix_getpid')) { - $baseUnique = posix_getpid(); - } else { - $baseUnique = mt_rand(); - } - $this->_cachePrefix = substr(md5(uniqid($baseUnique,true)),0,8).'.'; + $baseUnique = $this->_getUniqueID(); + $this->_cachePrefix = substr(md5($baseUnique),0,8).'.'; $this->_cacheTime = $cacheTime; parent::__construct($parent); diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/CacheBase.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/CacheBase.php index 9871d90dd..208ed0243 100644 --- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/CacheBase.php +++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/CacheBase.php @@ -22,7 +22,7 @@ * @package PHPExcel_CachedObjectStorage * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -116,7 +116,7 @@ class PHPExcel_CachedObjectStorage_CacheBase { $this->_currentObjectID = $this->_currentObject = null; } - if (isset($this->_cellCache[$pCoord])) { + if (is_object($this->_cellCache[$pCoord])) { $this->_cellCache[$pCoord]->detach(); unset($this->_cellCache[$pCoord]); } @@ -141,13 +141,34 @@ class PHPExcel_CachedObjectStorage_CacheBase { public function getSortedCellList() { $sortKeys = array(); foreach ($this->_cellCache as $coord => $value) { - preg_match('/^(\w+)(\d+)$/U',$coord,$matches); - list(,$colNum,$rowNum) = $matches; - $sortKeys[$coord] = str_pad($rowNum . str_pad($colNum,3,'@',STR_PAD_LEFT),12,'0',STR_PAD_LEFT); + list($colNum,$rowNum) = sscanf($coord,'%[A-Z]%d'); + $sortKeys[sprintf('%09d%3s',$rowNum,$colNum)] = $coord; } - asort($sortKeys); + ksort($sortKeys); - return array_keys($sortKeys); + return array_values($sortKeys); } // function sortCellList() + + protected function _getUniqueID() { + if (function_exists('posix_getpid')) { + $baseUnique = posix_getpid(); + } else { + $baseUnique = mt_rand(); + } + return uniqid($baseUnique,true); + } + + /** + * Clone the cell collection + * + * @return void + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) { + $this->_parent = $parent; + if ((!is_null($this->_currentObject)) && (is_object($this->_currentObject))) { + $this->_currentObject->attach($parent); + } + } // function copyCellCollection() + } diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/DiscISAM.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/DiscISAM.php index e685607f7..dff52faae 100644 --- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/DiscISAM.php +++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/DiscISAM.php @@ -22,7 +22,7 @@ * @package PHPExcel_CachedObjectStorage * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -103,6 +103,24 @@ class PHPExcel_CachedObjectStorage_DiscISAM extends PHPExcel_CachedObjectStorage } // function getCacheData() + /** + * Clone the cell collection + * + * @return void + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) { + parent::copyCellCollection($parent); + // Get a new id for the new file name + $baseUnique = $this->_getUniqueID(); + $newFileName = sys_get_temp_dir().'/PHPExcel.'.$baseUnique.'.cache'; + // Copy the existing cell cache file + copy ($this->_fileName,$newFileName); + $this->_fileName = $newFileName; + // Open the copied cell cache file + $this->_fileHandle = fopen($this->_fileName,'a+'); + } // function copyCellCollection() + + public function unsetWorksheetCells() { if(!is_null($this->_currentObject)) { $this->_currentObject->detach(); @@ -121,12 +139,8 @@ class PHPExcel_CachedObjectStorage_DiscISAM extends PHPExcel_CachedObjectStorage public function __construct(PHPExcel_Worksheet $parent) { parent::__construct($parent); if (is_null($this->_fileHandle)) { - if (function_exists('posix_getpid')) { - $baseUnique = posix_getpid(); - } else { - $baseUnique = mt_rand(); - } - $this->_fileName = sys_get_temp_dir().'/PHPExcel.'.uniqid($baseUnique,true).'.cache'; + $baseUnique = $this->_getUniqueID(); + $this->_fileName = sys_get_temp_dir().'/PHPExcel.'.$baseUnique.'.cache'; $this->_fileHandle = fopen($this->_fileName,'a+'); } } // function __construct() diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/ICache.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/ICache.php index f3282aa30..4731b8e44 100644 --- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/ICache.php +++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/ICache.php @@ -22,7 +22,7 @@ * @package PHPExcel_CachedObjectStorage * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -94,4 +94,11 @@ interface PHPExcel_CachedObjectStorage_ICache */ public function getSortedCellList(); + /** + * Clone the cell collection + * + * @return void + */ + public function copyCellCollection(PHPExcel_Worksheet $parent); + } diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memcache.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memcache.php index f1fc43c40..74df8e852 100644 --- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memcache.php +++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memcache.php @@ -22,7 +22,7 @@ * @package PHPExcel_CachedObjectStorage * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -49,7 +49,7 @@ class PHPExcel_CachedObjectStorage_Memcache extends PHPExcel_CachedObjectStorage if (!$this->_memcache->replace($this->_cachePrefix.$this->_currentObjectID.'.cache',$obj,NULL,$this->_cacheTime)) { if (!$this->_memcache->add($this->_cachePrefix.$this->_currentObjectID.'.cache',$obj,NULL,$this->_cacheTime)) { $this->__destruct(); - throw new Exception('Failed to store cell in Memcache'); + throw new Exception('Failed to store cell '.$cellID.' in MemCache'); } } $this->_currentObjectID = $this->_currentObject = null; @@ -90,12 +90,12 @@ class PHPExcel_CachedObjectStorage_Memcache extends PHPExcel_CachedObjectStorage if ($this->_currentObjectID == $pCoord) { return true; } - // Check if the requested entry still exists in apc + // Check if the requested entry still exists in Memcache $success = $this->_memcache->get($this->_cachePrefix.$pCoord.'.cache'); if ($success === false) { // Entry no longer exists in Memcache, so clear it from the cache array parent::deleteCacheData($pCoord); - throw new Exception('Cell entry no longer exists in Memcache'); + throw new Exception('Cell entry '.$cellID.' no longer exists in MemCache'); } return true; } @@ -122,7 +122,7 @@ class PHPExcel_CachedObjectStorage_Memcache extends PHPExcel_CachedObjectStorage if ($obj === false) { // Entry no longer exists in Memcache, so clear it from the cache array parent::deleteCacheData($pCoord); - throw new Exception('Cell entry no longer exists in Memcache'); + throw new Exception('Cell entry '.$cellID.' no longer exists in MemCache'); } } else { // Return null if requested entry doesn't exist in cache @@ -155,6 +155,35 @@ class PHPExcel_CachedObjectStorage_Memcache extends PHPExcel_CachedObjectStorage } // function deleteCacheData() + /** + * Clone the cell collection + * + * @return void + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) { + parent::copyCellCollection($parent); + // Get a new id for the new file name + $baseUnique = $this->_getUniqueID(); + $newCachePrefix = substr(md5($baseUnique),0,8).'.'; + $cacheList = $this->getCellList(); + foreach($cacheList as $cellID) { + if ($cellID != $this->_currentObjectID) { + $obj = $this->_memcache->get($this->_cachePrefix.$cellID.'.cache'); + if ($obj === false) { + // Entry no longer exists in Memcache, so clear it from the cache array + parent::deleteCacheData($cellID); + throw new Exception('Cell entry '.$cellID.' no longer exists in MemCache'); + } + if (!$this->_memcache->add($newCachePrefix.$cellID.'.cache',$obj,NULL,$this->_cacheTime)) { + $this->__destruct(); + throw new Exception('Failed to store cell '.$cellID.' in MemCache'); + } + } + } + $this->_cachePrefix = $newCachePrefix; + } // function copyCellCollection() + + public function unsetWorksheetCells() { if(!is_null($this->_currentObject)) { $this->_currentObject->detach(); @@ -177,17 +206,13 @@ class PHPExcel_CachedObjectStorage_Memcache extends PHPExcel_CachedObjectStorage $cacheTime = (isset($arguments['cacheTime'])) ? $arguments['cacheTime'] : 600; if (is_null($this->_cachePrefix)) { - if (function_exists('posix_getpid')) { - $baseUnique = posix_getpid(); - } else { - $baseUnique = mt_rand(); - } - $this->_cachePrefix = substr(md5(uniqid($baseUnique,true)),0,8).'.'; + $baseUnique = $this->_getUniqueID(); + $this->_cachePrefix = substr(md5($baseUnique),0,8).'.'; // Set a new Memcache object and connect to the Memcache server $this->_memcache = new Memcache(); - if (!$this->_memcache->addServer($memcacheServer, $memcachePort, false, 50, 5, 5, true, array($this, 'failureCallback')) { - throw new Exception('Could not connect to Memcache server at '.$memcacheServer.':'.$memcachePort); + if (!$this->_memcache->addServer($memcacheServer, $memcachePort, false, 50, 5, 5, true, array($this, 'failureCallback'))) { + throw new Exception('Could not connect to MemCache server at '.$memcacheServer.':'.$memcachePort); } $this->_cacheTime = $cacheTime; @@ -197,7 +222,7 @@ class PHPExcel_CachedObjectStorage_Memcache extends PHPExcel_CachedObjectStorage public function failureCallback($host, $port) { - throw new Exception('memcache '.$host.':'.$port' failed'); + throw new Exception('memcache '.$host.':'.$port.' failed'); } diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memory.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memory.php index be0fadea6..4b59b91f7 100644 --- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memory.php +++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Memory.php @@ -22,7 +22,7 @@ * @package PHPExcel_CachedObjectStorage * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemoryGZip.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemoryGZip.php index c28138907..394faf275 100644 --- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemoryGZip.php +++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemoryGZip.php @@ -22,7 +22,7 @@ * @package PHPExcel_CachedObjectStorage * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemorySerialized.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemorySerialized.php index 9c29ea245..0b5b99713 100644 --- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemorySerialized.php +++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/MemorySerialized.php @@ -22,7 +22,7 @@ * @package PHPExcel_CachedObjectStorage * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/PHPTemp.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/PHPTemp.php index 98cd9524c..54810d82d 100644 --- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/PHPTemp.php +++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/PHPTemp.php @@ -22,7 +22,7 @@ * @package PHPExcel_CachedObjectStorage * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -38,6 +38,8 @@ class PHPExcel_CachedObjectStorage_PHPTemp extends PHPExcel_CachedObjectStorage_ private $_fileHandle = null; + private $_memoryCacheSize = null; + private function _storeData() { $this->_currentObject->detach(); @@ -102,6 +104,24 @@ class PHPExcel_CachedObjectStorage_PHPTemp extends PHPExcel_CachedObjectStorage_ } // function getCacheData() + /** + * Clone the cell collection + * + * @return void + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) { + parent::copyCellCollection($parent); + // Open a new stream for the cell cache data + $newFileHandle = fopen('php://temp/maxmemory:'.$this->_memoryCacheSize,'a+'); + // Copy the existing cell cache data to the new stream + fseek($this->_fileHandle,0); + while (!feof($this->_fileHandle)) { + fwrite($newFileHandle,fread($this->_fileHandle, 1024)); + } + $this->_fileHandle = $newFileHandle; + } // function copyCellCollection() + + public function unsetWorksheetCells() { if(!is_null($this->_currentObject)) { $this->_currentObject->detach(); @@ -118,11 +138,11 @@ class PHPExcel_CachedObjectStorage_PHPTemp extends PHPExcel_CachedObjectStorage_ public function __construct(PHPExcel_Worksheet $parent, $memoryCacheSize = '1MB') { - $memoryCacheSize = (isset($arguments['memoryCacheSize'])) ? $arguments['memoryCacheSize'] : '1MB'; + $this->_memoryCacheSize = (isset($arguments['memoryCacheSize'])) ? $arguments['memoryCacheSize'] : '1MB'; parent::__construct($parent); if (is_null($this->_fileHandle)) { - $this->_fileHandle = fopen('php://temp/maxmemory:'.$memoryCacheSize,'a+'); + $this->_fileHandle = fopen('php://temp/maxmemory:'.$this->_memoryCacheSize,'a+'); } } // function __construct() diff --git a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Wincache.php b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Wincache.php index d759d7c40..aa075beba 100644 --- a/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Wincache.php +++ b/libraries/PHPExcel/PHPExcel/CachedObjectStorage/Wincache.php @@ -22,7 +22,7 @@ * @package PHPExcel_CachedObjectStorage * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -45,9 +45,15 @@ class PHPExcel_CachedObjectStorage_Wincache extends PHPExcel_CachedObjectStorage $obj = serialize($this->_currentObject); if (wincache_ucache_exists($this->_cachePrefix.$this->_currentObjectID.'.cache')) { - wincache_ucache_set($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime); + if (!wincache_ucache_set($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime)) { + $this->__destruct(); + throw new Exception('Failed to store cell '.$cellID.' in WinCache'); + } } else { - wincache_ucache_add($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime); + if (!wincache_ucache_add($this->_cachePrefix.$this->_currentObjectID.'.cache', $obj, $this->_cacheTime)) { + $this->__destruct(); + throw new Exception('Failed to store cell '.$cellID.' in WinCache'); + } } $this->_currentObjectID = $this->_currentObject = null; @@ -93,7 +99,7 @@ class PHPExcel_CachedObjectStorage_Wincache extends PHPExcel_CachedObjectStorage if ($success === false) { // Entry no longer exists in Wincache, so clear it from the cache array parent::deleteCacheData($pCoord); - throw new Exception('Cell entry no longer exists in Wincache'); + throw new Exception('Cell entry '.$cellID.' no longer exists in WinCache'); } return true; } @@ -120,9 +126,9 @@ class PHPExcel_CachedObjectStorage_Wincache extends PHPExcel_CachedObjectStorage $success = false; $obj = wincache_ucache_get($this->_cachePrefix.$pCoord.'.cache', $success); if ($success === false) { - // Entry no longer exists in Wincache, so clear it from the cache array + // Entry no longer exists in WinCache, so clear it from the cache array parent::deleteCacheData($pCoord); - throw new Exception('Cell entry no longer exists in Wincache'); + throw new Exception('Cell entry '.$cellID.' no longer exists in WinCache'); } } else { // Return null if requested entry doesn't exist in cache @@ -155,13 +161,43 @@ class PHPExcel_CachedObjectStorage_Wincache extends PHPExcel_CachedObjectStorage } // function deleteCacheData() + /** + * Clone the cell collection + * + * @return void + */ + public function copyCellCollection(PHPExcel_Worksheet $parent) { + parent::copyCellCollection($parent); + // Get a new id for the new file name + $baseUnique = $this->_getUniqueID(); + $newCachePrefix = substr(md5($baseUnique),0,8).'.'; + $cacheList = $this->getCellList(); + foreach($cacheList as $cellID) { + if ($cellID != $this->_currentObjectID) { + $success = false; + $obj = wincache_ucache_get($this->_cachePrefix.$cellID.'.cache', $success); + if ($success === false) { + // Entry no longer exists in WinCache, so clear it from the cache array + parent::deleteCacheData($cellID); + throw new Exception('Cell entry '.$cellID.' no longer exists in Wincache'); + } + if (!wincache_ucache_add($newCachePrefix.$cellID.'.cache', $obj, $this->_cacheTime)) { + $this->__destruct(); + throw new Exception('Failed to store cell '.$cellID.' in Wincache'); + } + } + } + $this->_cachePrefix = $newCachePrefix; + } // function copyCellCollection() + + public function unsetWorksheetCells() { if(!is_null($this->_currentObject)) { $this->_currentObject->detach(); $this->_currentObject = $this->_currentObjectID = null; } - // Flush the Wincache cache + // Flush the WinCache cache $this->__destruct(); $this->_cellCache = array(); @@ -175,12 +211,8 @@ class PHPExcel_CachedObjectStorage_Wincache extends PHPExcel_CachedObjectStorage $cacheTime = (isset($arguments['cacheTime'])) ? $arguments['cacheTime'] : 600; if (is_null($this->_cachePrefix)) { - if (function_exists('posix_getpid')) { - $baseUnique = posix_getpid(); - } else { - $baseUnique = mt_rand(); - } - $this->_cachePrefix = substr(md5(uniqid($baseUnique,true)),0,8).'.'; + $baseUnique = $this->_getUniqueID(); + $this->_cachePrefix = substr(md5($baseUnique),0,8).'.'; $this->_cacheTime = $cacheTime; parent::__construct($parent); diff --git a/libraries/PHPExcel/PHPExcel/Calculation.php b/libraries/PHPExcel/PHPExcel/Calculation.php index 6e8499e04..e32891abd 100644 --- a/libraries/PHPExcel/PHPExcel/Calculation.php +++ b/libraries/PHPExcel/PHPExcel/Calculation.php @@ -22,7 +22,7 @@ * @package PHPExcel_Calculation * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -2248,7 +2248,7 @@ class PHPExcel_Calculation { } $this->debugLogStack[] = $wsTitle.'!'.$cellID; // Parse the formula onto the token stack and calculate the value - $cellValue = $this->_processTokenStack($this->_parseFormula($formula), $cellID, $pCell); + $cellValue = $this->_processTokenStack($this->_parseFormula($formula, $pCell), $cellID, $pCell); array_pop($this->debugLogStack); // Save to calculation cache @@ -2462,31 +2462,24 @@ class PHPExcel_Calculation { $value = array_pop($testArray); } - switch (gettype($value)) { - case 'double' : - case 'float' : - $typeString = 'a floating point number'; - break; - case 'integer' : - $typeString = 'an integer number'; - break; - case 'boolean' : - $typeString = 'a boolean'; - break; - case 'array' : - $typeString = 'a matrix'; - break; - case 'string' : - if ($value == '') { - return 'an empty string'; - } elseif ($value{0} == '#') { - return 'a '.$value.' error'; - } else { - $typeString = 'a string'; - } - break; - case 'NULL' : - return 'a null value'; + if (is_null($value)) { + return 'a null value'; + } elseif (is_float($value)) { + $typeString = 'a floating point number'; + } elseif(is_int($value)) { + $typeString = 'an integer number'; + } elseif(is_bool($value)) { + $typeString = 'a boolean'; + } elseif(is_array($value)) { + $typeString = 'a matrix'; + } else { + if ($value == '') { + return 'an empty string'; + } elseif ($value{0} == '#') { + return 'a '.$value.' error'; + } else { + $typeString = 'a string'; + } } return $typeString.' with a value of '.self::_showValue($value); } // function _showTypeDetails() @@ -2548,11 +2541,15 @@ class PHPExcel_Calculation { // Convert infix to postfix notation - private function _parseFormula($formula) { + private function _parseFormula($formula, PHPExcel_Cell $pCell = null) { if (($formula = self::_convertMatrixReferences(trim($formula))) === false) { return false; } + // If we're using cell caching, then $pCell may well be flushed back to the cache (which detaches the parent worksheet), + // so we store the parent worksheet so that we can re-attach it when necessary + $pCellParent = (!is_null($pCell)) ? $pCell->getParent() : null; + // Binary Operators // These operators always work on two values // Array key is the operator, the value indicates whether this is a left or right associative operator @@ -2774,12 +2771,56 @@ class PHPExcel_Calculation { // echo 'Element '.$val.' is a Cell reference
'; // Watch for this case-change when modifying to allow cell references in different worksheets... // Should only be applied to the actual cell column, not the worksheet name + + // If the last entry on the stack was a : operator, then we have a cell range reference + $testPrevOp = $stack->last(1); + if ($testPrevOp['value'] == ':') { + // If we have a worksheet reference, then we're playing with a 3D reference + if ($matches[2] == '') { + // Otherwise, we 'inherit' the worksheet reference from the start cell reference + // The start of the cell range reference should be the last entry in $output + $startCellRef = $output[count($output)-1]['value']; + preg_match('/^'.self::CALCULATION_REGEXP_CELLREF.'$/i', $startCellRef, $startMatches); + if ($startMatches[2] > '') { + $val = $startMatches[2].'!'.$val; + } + } + } $cellRef = strtoupper($val); -// $output[] = $cellRef; + $output[] = array('type' => 'Cell Reference', 'value' => $val, 'reference' => $cellRef); // $expectingOperator = false; } else { // it's a variable, constant, string, number or boolean // echo 'Element is a Variable, Constant, String, Number or Boolean
'; + // If the last entry on the stack was a : operator, then we may have a row or column range reference + $testPrevOp = $stack->last(1); + if ($testPrevOp['value'] == ':') { + $startRowColRef = $output[count($output)-1]['value']; + $rangeWS1 = ''; + if (strpos('!',$startRowColRef) !== false) { + list($rangeWS1,$startRowColRef) = explode('!',$startRowColRef); + } + if ($rangeWS1 != '') $rangeWS1 .= '!'; + $rangeWS2 = $rangeWS1; + if (strpos('!',$val) !== false) { + list($rangeWS2,$val) = explode('!',$val); + } + if ($rangeWS2 != '') $rangeWS2 .= '!'; + if ((is_integer($startRowColRef)) && (ctype_digit($val)) && + ($startRowColRef <= 1048576) && ($val <= 1048576)) { + // Row range + $endRowColRef = (!is_null($pCellParent)) ? $pCellParent->getHighestColumn() : 'XFD'; // Max 16,384 columns for Excel2007 + $output[count($output)-1]['value'] = $rangeWS1.'A'.$startRowColRef; + $val = $rangeWS2.$endRowColRef.$val; + } elseif ((ctype_alpha($startRowColRef)) && (ctype_alpha($val)) && + (strlen($startRowColRef) <= 3) && (strlen($val) <= 3)) { + // Column range + $endRowColRef = (!is_null($pCellParent)) ? $pCellParent->getHighestRow() : 1048576; // Max 1,048,576 rows for Excel2007 + $output[count($output)-1]['value'] = $rangeWS1.strtoupper($startRowColRef).'1'; + $val = $rangeWS2.$val.$endRowColRef; + } + } + $localeConstant = false; if ($opCharacter == '"') { // echo 'Element is a String
'; @@ -2808,6 +2849,8 @@ class PHPExcel_Calculation { } $index += $length; + } elseif ($opCharacter == '$') { // absolute row or column range + $index++; } elseif ($opCharacter == ')') { // miscellaneous error checking if ($expectingOperand) { $output[] = array('type' => 'Null Value', 'value' => self::$_ExcelConstants['NULL'], 'reference' => NULL); @@ -3067,7 +3110,7 @@ class PHPExcel_Calculation { return $this->_raiseFormulaError('Unable to access Cell Reference'); } $this->_writeDebug('Evaluation Result for cells '.$cellRef.' in worksheet '.$matches[2].' is '.self::_showTypeDetails($cellValue)); - $cellRef = $matches[2].'!'.$cellRef; +// $cellRef = $matches[2].'!'.$cellRef; } else { // echo '$cellRef='.$cellRef.' in current worksheet
'; $this->_writeDebug('Evaluating Cell Range '.$cellRef.' in current worksheet'); @@ -3101,7 +3144,7 @@ class PHPExcel_Calculation { return $this->_raiseFormulaError('Unable to access Cell Reference'); } $this->_writeDebug('Evaluation Result for cell '.$cellRef.' in worksheet '.$matches[2].' is '.self::_showTypeDetails($cellValue)); - $cellRef = $matches[2].'!'.$cellRef; +// $cellRef = $matches[2].'!'.$cellRef; } else { // echo '$cellRef='.$cellRef.' in current worksheet
'; $this->_writeDebug('Evaluating Cell '.$cellRef.' in current worksheet'); diff --git a/libraries/PHPExcel/PHPExcel/Calculation/Exception.php b/libraries/PHPExcel/PHPExcel/Calculation/Exception.php index 8e77b9d28..b94f3f498 100644 --- a/libraries/PHPExcel/PHPExcel/Calculation/Exception.php +++ b/libraries/PHPExcel/PHPExcel/Calculation/Exception.php @@ -22,7 +22,7 @@ * @package PHPExcel_Calculation * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Calculation/ExceptionHandler.php b/libraries/PHPExcel/PHPExcel/Calculation/ExceptionHandler.php index 99561672f..7050260eb 100644 --- a/libraries/PHPExcel/PHPExcel/Calculation/ExceptionHandler.php +++ b/libraries/PHPExcel/PHPExcel/Calculation/ExceptionHandler.php @@ -22,7 +22,7 @@ * @package PHPExcel_Calculation * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ /** diff --git a/libraries/PHPExcel/PHPExcel/Calculation/FormulaParser.php b/libraries/PHPExcel/PHPExcel/Calculation/FormulaParser.php index 8fcde41b9..271aa7524 100644 --- a/libraries/PHPExcel/PHPExcel/Calculation/FormulaParser.php +++ b/libraries/PHPExcel/PHPExcel/Calculation/FormulaParser.php @@ -22,7 +22,7 @@ * @package PHPExcel_Calculation * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Calculation/FormulaToken.php b/libraries/PHPExcel/PHPExcel/Calculation/FormulaToken.php index 69d7f4281..8c1396e67 100644 --- a/libraries/PHPExcel/PHPExcel/Calculation/FormulaToken.php +++ b/libraries/PHPExcel/PHPExcel/Calculation/FormulaToken.php @@ -22,7 +22,7 @@ * @package PHPExcel_Calculation * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Calculation/Function.php b/libraries/PHPExcel/PHPExcel/Calculation/Function.php index 783e53350..81dfc99bd 100644 --- a/libraries/PHPExcel/PHPExcel/Calculation/Function.php +++ b/libraries/PHPExcel/PHPExcel/Calculation/Function.php @@ -22,7 +22,7 @@ * @package PHPExcel_Calculation * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Calculation/Functions.php b/libraries/PHPExcel/PHPExcel/Calculation/Functions.php index 8ce3cfd02..805f483a8 100644 --- a/libraries/PHPExcel/PHPExcel/Calculation/Functions.php +++ b/libraries/PHPExcel/PHPExcel/Calculation/Functions.php @@ -22,7 +22,7 @@ * @package PHPExcel_Calculation * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -1885,7 +1885,7 @@ class PHPExcel_Calculation_Functions { } // Return - if (($aCount > 0) && ($returnValue > 0)) { + if (($aCount > 0) && ($returnValue >= 0)) { return sqrt($returnValue / $aCount); } } @@ -1937,7 +1937,7 @@ class PHPExcel_Calculation_Functions { } // Return - if (($aCount > 0) && ($returnValue > 0)) { + if (($aCount > 0) && ($returnValue >= 0)) { return sqrt($returnValue / $aCount); } } @@ -1984,7 +1984,7 @@ class PHPExcel_Calculation_Functions { } // Return - if (($aCount > 0) && ($returnValue > 0)) { + if (($aCount > 0) && ($returnValue >= 0)) { return sqrt($returnValue / $aCount); } } @@ -2036,7 +2036,7 @@ class PHPExcel_Calculation_Functions { } // Return - if (($aCount > 0) && ($returnValue > 0)) { + if (($aCount > 0) && ($returnValue >= 0)) { return sqrt($returnValue / $aCount); } } @@ -5691,7 +5691,7 @@ class PHPExcel_Calculation_Functions { * @return string Version information */ public static function VERSION() { - return 'PHPExcel 1.7.3c, 2010-06-01'; + return 'PHPExcel 1.7.4, 2010-08-26'; } // function VERSION() @@ -11139,112 +11139,101 @@ class PHPExcel_Calculation_Functions { * @return integer The relative position of the found item */ public static function MATCH($lookup_value, $lookup_array, $match_type=1) { - - // flatten the lookup_array $lookup_array = self::flattenArray($lookup_array); - - // flatten lookup_value since it may be a cell reference to a value or the value itself $lookup_value = self::flattenSingleValue($lookup_value); - - // MATCH is not case sensitive + $match_type = (is_null($match_type)) ? 1 : (int) self::flattenSingleValue($match_type); + // MATCH is not case sensitive $lookup_value = strtolower($lookup_value); - /* - echo "--------------------
looking for $lookup_value in
"; - print_r($lookup_array); - echo "
"; - //return 1; - /**/ - - // ** - // check inputs - // ** - // lookup_value type has to be number, text, or logical values - if (!is_numeric($lookup_value) && !is_string($lookup_value) && !is_bool($lookup_value)){ - // error: lookup_array should contain only number, text, or logical values - //echo "error: lookup_array should contain only number, text, or logical values
"; + // lookup_value type has to be number, text, or logical values + if ((!is_numeric($lookup_value)) && (!is_string($lookup_value)) && (!is_bool($lookup_value))) { return self::$_errorCodes['na']; } - // match_type is 0, 1 or -1 - if ($match_type!==0 && $match_type!==-1 && $match_type!==1){ - // error: wrong value for match_type - //echo "error: wrong value for match_type
"; + // match_type is 0, 1 or -1 + if (($match_type !== 0) && ($match_type !== -1) && ($match_type !== 1)) { return self::$_errorCodes['na']; } - // lookup_array should not be empty - if (sizeof($lookup_array)<=0){ - // error: empty range - //echo "error: empty range ".sizeof($lookup_array)."
"; + // lookup_array should not be empty + $lookupArraySize = count($lookup_array); + if ($lookupArraySize <= 0) { return self::$_errorCodes['na']; } - // lookup_array should contain only number, text, or logical values - for ($i=0;$i"; + // lookup_array should contain only number, text, or logical values, or empty (null) cells + foreach($lookup_array as $i => $lookupArrayValue) { + // check the type of the value + if ((!is_numeric($lookupArrayValue)) && (!is_string($lookupArrayValue)) && + (!is_bool($lookupArrayValue)) && (!is_null($lookupArrayValue))) { return self::$_errorCodes['na']; } - // convert tpo lowercase - if (is_string($lookup_array[$i])) - $lookup_array[$i] = strtolower($lookup_array[$i]); + // convert strings to lowercase for case-insensitive testing + if (is_string($lookupArrayValue)) { + $lookup_array[$i] = strtolower($lookupArrayValue); + } + if ((is_null($lookupArrayValue)) && (($match_type == 1) || ($match_type == -1))) { + $lookup_array = array_slice($lookup_array,0,$i-1); + } } // if match_type is 1 or -1, the list has to be ordered - if($match_type==1 || $match_type==-1){ - // ** - // iniitialization - // store the last value - $iLastValue=$lookup_array[0]; - // ** - // loop on the cells - for ($i=0;$i$iLastValue)){ - // error: list is not ordered correctly - //echo "error: list is not ordered correctly
"; - return self::$_errorCodes['na']; - } - } + if ($match_type == 1) { + asort($lookup_array); + $keySet = array_keys($lookup_array); + } elseif($match_type == -1) { + arsort($lookup_array); + $keySet = array_keys($lookup_array); } + // ** // find the match // ** // loop on the cells - for ($i=0; $i < sizeof($lookup_array); ++$i){ - // if match_type is 0 <=> find the first value that is exactly equal to lookup_value - if ($match_type==0 && $lookup_array[$i]==$lookup_value){ - // this is the exact match - return $i+1; - } - // if match_type is -1 <=> find the smallest value that is greater than or equal to lookup_value - if ($match_type==-1 && $lookup_array[$i] < $lookup_value){ - if ($i<1){ +// var_dump($lookup_array); +// echo '
'; + foreach($lookup_array as $i => $lookupArrayValue) { + if (($match_type == 0) && ($lookupArrayValue == $lookup_value)) { + // exact match + return ++$i; + } elseif (($match_type == -1) && ($lookupArrayValue <= $lookup_value)) { +// echo '$i = '.$i.' => '; +// var_dump($lookupArrayValue); +// echo '
'; +// echo 'Keyset = '; +// var_dump($keySet); +// echo '
'; + $i = array_search($i,$keySet); +// echo '$i='.$i.'
'; + // if match_type is -1 <=> find the smallest value that is greater than or equal to lookup_value + if ($i < 1){ // 1st cell was allready smaller than the lookup_value break; - } - else + } else { // the previous cell was the match - return $i; - } - // if match_type is 1 <=> find the largest value that is less than or equal to lookup_value - if ($match_type==1 && $lookup_array[$i] > $lookup_value){ - if ($i<1){ + return $keySet[$i-1]+1; + } + } elseif (($match_type == 1) && ($lookupArrayValue >= $lookup_value)) { +// echo '$i = '.$i.' => '; +// var_dump($lookupArrayValue); +// echo '
'; +// echo 'Keyset = '; +// var_dump($keySet); +// echo '
'; + $i = array_search($i,$keySet); +// echo '$i='.$i.'
'; + // if match_type is 1 <=> find the largest value that is less than or equal to lookup_value + if ($i < 1){ // 1st cell was allready bigger than the lookup_value break; - } - else + } else { // the previous cell was the match - return $i; + return $keySet[$i-1]+1; + } } } - // unsuccessful in finding a match, return #N/A error value - //echo "unsuccessful in finding a match
"; + + // unsuccessful in finding a match, return #N/A error value return self::$_errorCodes['na']; } // function MATCH() @@ -11378,25 +11367,19 @@ class PHPExcel_Calculation_Functions { } $value = self::flattenSingleValue($value); - switch (gettype($value)) { - case 'double' : - case 'float' : - case 'integer' : + if ((is_float($value)) || (is_int($value))) { return 1; - break; - case 'boolean' : + } elseif(is_bool($value)) { return 4; - break; - case 'array' : + } elseif(is_array($value)) { return 64; break; - case 'string' : - // Errors - if ((strlen($value) > 0) && ($value{0} == '#')) { - return 16; - } - return 2; - break; + } elseif(is_string($value)) { + // Errors + if ((strlen($value) > 0) && ($value{0} == '#')) { + return 16; + } + return 2; } return 0; } // function TYPE() diff --git a/libraries/PHPExcel/PHPExcel/Cell.php b/libraries/PHPExcel/PHPExcel/Cell.php index f8ebf8636..b805b8df2 100644 --- a/libraries/PHPExcel/PHPExcel/Cell.php +++ b/libraries/PHPExcel/PHPExcel/Cell.php @@ -22,7 +22,7 @@ * @package PHPExcel_Cell * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -91,6 +91,13 @@ class PHPExcel_Cell */ private $_xfIndex; + /** + * Attributes of the formula + * + * + */ + private $_formulaAttributes; + /** * Send notification to the cache controller @@ -98,6 +105,7 @@ class PHPExcel_Cell **/ public function notifyCacheController() { $this->_parent->getCellCacheController()->updateCacheData($this); + return $this; } public function detach() { @@ -112,11 +120,11 @@ class PHPExcel_Cell /** * Create a new Cell * - * @param string $pColumn - * @param int $pRow - * @param mixed $pValue - * @param string $pDataType - * @param PHPExcel_Worksheet $pSheet + * @param string $pColumn + * @param int $pRow + * @param mixed $pValue + * @param string $pDataType + * @param PHPExcel_Worksheet $pSheet * @throws Exception */ public function __construct($pColumn = 'A', $pRow = 1, $pValue = null, $pDataType = null, PHPExcel_Worksheet $pSheet = null) @@ -189,7 +197,7 @@ class PHPExcel_Cell * * This clears the cell formula. * - * @param mixed $pValue Value + * @param mixed $pValue Value * @return PHPExcel_Cell */ public function setValue($pValue = null) @@ -203,7 +211,7 @@ class PHPExcel_Cell /** * Set cell value (with explicit data type given) * - * @param mixed $pValue Value + * @param mixed $pValue Value * @param string $pDataType Explicit data type * @return PHPExcel_Cell * @throws Exception @@ -242,8 +250,7 @@ class PHPExcel_Cell // set the datatype $this->_dataType = $pDataType; - $this->notifyCacheController(); - return $this; + return $this->notifyCacheController(); } /** @@ -254,7 +261,7 @@ class PHPExcel_Cell public function getCalculatedValue($resetLog=true) { // echo 'Cell '.$this->getCoordinate().' value is a '.$this->_dataType.' with a value of '.$this->getValue().'
'; - if (!is_null($this->_calculatedValue) && $this->_dataType == PHPExcel_Cell_DataType::TYPE_FORMULA) { + if ($this->_dataType == PHPExcel_Cell_DataType::TYPE_FORMULA) { try { // echo 'Cell value for '.$this->getCoordinate().' is a formula: Calculating value
'; $result = PHPExcel_Calculation::getInstance()->calculateCellValue($this,$resetLog); @@ -262,28 +269,23 @@ class PHPExcel_Cell } catch ( Exception $ex ) { // echo 'Calculation Exception: '.$ex->getMessage().'
'; $result = '#N/A'; - throw(new Exception($ex->getMessage())); + throw(new Exception($this->getParent()->getTitle().'!'.$this->getCoordinate().' -> '.$ex->getMessage())); } - if ((is_string($result)) && ($result == '#Not Yet Implemented')) { + if ($result === '#Not Yet Implemented') { // echo 'Returning fallback value of '.$this->_calculatedValue.' for cell '.$this->getCoordinate().'
'; return $this->_calculatedValue; // Fallback if calculation engine does not support the formula. - } else { -// echo 'Returning calculated value of '.$result.' for cell '.$this->getCoordinate().'
'; - return $result; } +// echo 'Returning calculated value of '.$result.' for cell '.$this->getCoordinate().'
'; + return $result; } if (is_null($this->_value)) { // echo 'Cell '.$this->getCoordinate().' has no value, formula or otherwise
'; return null; - } else if ($this->_dataType != PHPExcel_Cell_DataType::TYPE_FORMULA) { -// echo 'Cell value for '.$this->getCoordinate().' is not a formula: Returning data value of '.$this->_value.'
'; - return $this->_value; - } else { -// echo 'Cell value is a formula: Calculating value
'; - return PHPExcel_Calculation::getInstance()->calculateCellValue($this,$resetLog); } +// echo 'Cell value for '.$this->getCoordinate().' is not a formula: Returning data value of '.$this->_value.'
'; + return $this->_value; } /** @@ -298,8 +300,7 @@ class PHPExcel_Cell $this->_calculatedValue = $pValue; } - $this->notifyCacheController(); - return $this; + return $this->notifyCacheController(); } /** @@ -332,8 +333,7 @@ class PHPExcel_Cell { $this->_dataType = $pDataType; - $this->notifyCacheController(); - return $this; + return $this->notifyCacheController(); } /** @@ -361,15 +361,14 @@ class PHPExcel_Cell throw new Exception('Cannot get data validation for cell that is not bound to a worksheet'); } - $dataValidation = $this->_parent->getDataValidation($this->getCoordinate()); - return $dataValidation; + return $this->_parent->getDataValidation($this->getCoordinate()); } /** * Set Data validation * - * @param PHPExcel_Cell_DataValidation $pDataValidation - * @throws Exception + * @param PHPExcel_Cell_DataValidation $pDataValidation + * @throws Exception * @return PHPExcel_Cell */ public function setDataValidation(PHPExcel_Cell_DataValidation $pDataValidation = null) @@ -380,45 +379,43 @@ class PHPExcel_Cell $this->_parent->setDataValidation($this->getCoordinate(), $pDataValidation); - $this->notifyCacheController(); - return $this; + return $this->notifyCacheController(); } - /** - * Has Hyperlink - * - * @return boolean - */ - public function hasHyperlink() - { + /** + * Has Hyperlink + * + * @return boolean + */ + public function hasHyperlink() + { if (!isset($this->_parent)) { throw new Exception('Cannot check for hyperlink when cell is not bound to a worksheet'); } return $this->_parent->hyperlinkExists($this->getCoordinate()); - } + } - /** - * Get Hyperlink - * - * @throws Exception - * @return PHPExcel_Cell_Hyperlink - */ - public function getHyperlink() - { + /** + * Get Hyperlink + * + * @throws Exception + * @return PHPExcel_Cell_Hyperlink + */ + public function getHyperlink() + { if (!isset($this->_parent)) { throw new Exception('Cannot get hyperlink for cell that is not bound to a worksheet'); } - $hyperlink = $this->_parent->getHyperlink($this->getCoordinate()); - return $hyperlink; - } + return $this->_parent->getHyperlink($this->getCoordinate()); + } /** * Set Hyperlink * - * @param PHPExcel_Cell_Hyperlink $pHyperlink - * @throws Exception + * @param PHPExcel_Cell_Hyperlink $pHyperlink + * @throws Exception * @return PHPExcel_Cell */ public function setHyperlink(PHPExcel_Cell_Hyperlink $pHyperlink = null) @@ -429,9 +426,8 @@ class PHPExcel_Cell $this->_parent->setHyperlink($this->getCoordinate(), $pHyperlink); - $this->notifyCacheController(); - return $this; - } + return $this->notifyCacheController(); + } /** * Get parent @@ -451,94 +447,63 @@ class PHPExcel_Cell public function rebindParent(PHPExcel_Worksheet $parent) { $this->_parent = $parent; - $this->notifyCacheController(); - return $this; + return $this->notifyCacheController(); } /** * Is cell in a specific range? * - * @param string $pRange Cell range (e.g. A1:A1) - * @return boolean + * @param string $pRange Cell range (e.g. A1:A1) + * @return boolean */ public function isInRange($pRange = 'A1:A1') { - // Uppercase coordinate - $pRange = strtoupper($pRange); + list($rangeStart,$rangeEnd) = PHPExcel_Cell::rangeBoundaries($pRange); - // Extract range - $rangeA = ''; - $rangeB = ''; - if (strpos($pRange, ':') === false) { - $rangeA = $pRange; - $rangeB = $pRange; - } else { - list($rangeA, $rangeB) = explode(':', $pRange); - } - - // Calculate range outer borders - $rangeStart = PHPExcel_Cell::coordinateFromString($rangeA); - $rangeEnd = PHPExcel_Cell::coordinateFromString($rangeB); - - // Translate column into index - $rangeStart[0] = PHPExcel_Cell::columnIndexFromString($rangeStart[0]) - 1; - $rangeEnd[0] = PHPExcel_Cell::columnIndexFromString($rangeEnd[0]) - 1; - - // Translate properties - $myColumn = PHPExcel_Cell::columnIndexFromString($this->getColumn()) - 1; - $myRow = $this->getRow(); + // Translate properties + $myColumn = PHPExcel_Cell::columnIndexFromString($this->getColumn()) - 1; + $myRow = $this->getRow(); // Verify if cell is in range - return ( - ($rangeStart[0] <= $myColumn && $rangeEnd[0] >= $myColumn) && - ($rangeStart[1] <= $myRow && $rangeEnd[1] >= $myRow) - ); + return (($rangeStart[0] <= $myColumn) && ($rangeEnd[0] >= $myColumn) && + ($rangeStart[1] <= $myRow) && ($rangeEnd[1] >= $myRow) + ); } /** * Coordinate from string * - * @param string $pCoordinateString - * @return array Array containing column and row (indexes 0 and 1) + * @param string $pCoordinateString + * @return array Array containing column and row (indexes 0 and 1) * @throws Exception */ public static function coordinateFromString($pCoordinateString = 'A1') { if (strpos($pCoordinateString,':') !== false) { throw new Exception('Cell coordinate string can not be a range of cells.'); - } else if ($pCoordinateString == '') { throw new Exception('Cell coordinate can not be zero-length string.'); - } else if (preg_match("/([$]?[A-Z]+)([$]?\d+)/", $pCoordinateString, $matches)) { list(, $column, $row) = $matches; return array($column, $row); - } else { throw new Exception('Invalid cell coordinate.'); - } } /** * Make string coordinate absolute * - * @param string $pCoordinateString - * @return string Absolute coordinate + * @param string $pCoordinateString + * @return string Absolute coordinate * @throws Exception */ public static function absoluteCoordinate($pCoordinateString = 'A1') { if (strpos($pCoordinateString,':') === false && strpos($pCoordinateString,',') === false) { - // Return value - $returnValue = ''; - // Create absolute coordinate list($column, $row) = PHPExcel_Cell::coordinateFromString($pCoordinateString); - $returnValue = '$' . $column . '$' . $row; - - // Return - return $returnValue; + return '$' . $column . '$' . $row; } else { throw new Exception("Coordinate string should not be a cell range."); } @@ -547,8 +512,8 @@ class PHPExcel_Cell /** * Split range into coordinate strings * - * @param string $pRange - * @return array Array containg one or more arrays containing one or two coordinate strings + * @param string $pRange + * @return array Array containg one or more arrays containing one or two coordinate strings */ public static function splitRange($pRange = 'A1:A1') { @@ -562,7 +527,7 @@ class PHPExcel_Cell /** * Build range from coordinate strings * - * @param array $pRange Array containg one or more arrays containing one or two coordinate strings + * @param array $pRange Array containg one or more arrays containing one or two coordinate strings * @return string String representation of $pRange * @throws Exception */ @@ -584,67 +549,76 @@ class PHPExcel_Cell } /** - * Calculate range dimension + * Calculate range boundaries * - * @param string $pRange Cell range (e.g. A1:A1) - * @return array Range dimension (width, height) + * @param string $pRange Cell range (e.g. A1:A1) + * @return array Range coordinates (Start Cell, End Cell) where Start Cell and End Cell are arrays (Column Number, Row Number) */ - public static function rangeDimension($pRange = 'A1:A1') + public static function rangeBoundaries($pRange = 'A1:A1') { // Uppercase coordinate $pRange = strtoupper($pRange); - // Extract range - $rangeA = ''; - $rangeB = ''; - if (strpos($pRange, ':') === false) { - $rangeA = $pRange; - $rangeB = $pRange; - } else { - list($rangeA, $rangeB) = explode(':', $pRange); - } + // Extract range + if (strpos($pRange, ':') === false) { + $rangeA = $rangeB = $pRange; + } else { + list($rangeA, $rangeB) = explode(':', $pRange); + } - // Calculate range outer borders - $rangeStart = PHPExcel_Cell::coordinateFromString($rangeA); - $rangeEnd = PHPExcel_Cell::coordinateFromString($rangeB); + // Calculate range outer borders + $rangeStart = PHPExcel_Cell::coordinateFromString($rangeA); + $rangeEnd = PHPExcel_Cell::coordinateFromString($rangeB); - // Translate column into index - $rangeStart[0] = PHPExcel_Cell::columnIndexFromString($rangeStart[0]); - $rangeEnd[0] = PHPExcel_Cell::columnIndexFromString($rangeEnd[0]); + // Translate column into index + $rangeStart[0] = PHPExcel_Cell::columnIndexFromString($rangeStart[0]); + $rangeEnd[0] = PHPExcel_Cell::columnIndexFromString($rangeEnd[0]); - return array( ($rangeEnd[0] - $rangeStart[0] + 1), ($rangeEnd[1] - $rangeStart[1] + 1) ); + return array($rangeStart, $rangeEnd); + } + + /** + * Calculate range dimension + * + * @param string $pRange Cell range (e.g. A1:A1) + * @return array Range dimension (width, height) + */ + public static function rangeDimension($pRange = 'A1:A1') + { + // Calculate range outer borders + list($rangeStart,$rangeEnd) = PHPExcel_Cell::rangeBoundaries($pRange); + + return array( ($rangeEnd[0] - $rangeStart[0] + 1), ($rangeEnd[1] - $rangeStart[1] + 1) ); } /** * Calculate range boundaries * - * @param string $pRange Cell range (e.g. A1:A1) - * @return array Range boundaries (staring Column, starting Row, Final Column, Final Row) + * @param string $pRange Cell range (e.g. A1:A1) + * @return array Range boundaries (staring Column, starting Row, Final Column, Final Row) */ public static function getRangeBoundaries($pRange = 'A1:A1') { // Uppercase coordinate $pRange = strtoupper($pRange); - // Extract range - $rangeA = ''; - $rangeB = ''; - if (strpos($pRange, ':') === false) { - $rangeA = $pRange; - $rangeB = $pRange; - } else { - list($rangeA, $rangeB) = explode(':', $pRange); - } + // Extract range + if (strpos($pRange, ':') === false) { + $rangeA = $pRange; + $rangeB = $pRange; + } else { + list($rangeA, $rangeB) = explode(':', $pRange); + } - return array( self::coordinateFromString($rangeA), self::coordinateFromString($rangeB)); + return array( self::coordinateFromString($rangeA), self::coordinateFromString($rangeB)); } /** * Column index from string * - * @param string $pString - * @return int Column index (base 1 !!!) - * @throws Exception + * @param string $pString + * @return int Column index (base 1 !!!) + * @throws Exception */ public static function columnIndexFromString($pString = 'A') { @@ -684,14 +658,14 @@ class PHPExcel_Cell if ($pColumnIndex < 26) { return chr(65 + $pColumnIndex); } - return PHPExcel_Cell::stringFromColumnIndex((int)($pColumnIndex / 26) -1).chr(65 + $pColumnIndex%26) ; + return PHPExcel_Cell::stringFromColumnIndex((int)($pColumnIndex / 26) -1).chr(65 + $pColumnIndex%26) ; } /** * Extract all cell references in range * - * @param string $pRange Range (e.g. A1 or A1:A10 or A1:A10 A100:A1000) - * @return array Array containing single cell references + * @param string $pRange Range (e.g. A1 or A1:A10 or A1:A10 A100:A1000) + * @return array Array containing single cell references */ public static function extractAllCellReferencesInRange($pRange = 'A1') { // Returnvalue @@ -731,17 +705,17 @@ class PHPExcel_Cell $rangeStart = $rangeEnd = ''; $startingCol = $startingRow = $endingCol = $endingRow = 0; - list($rangeStart, $rangeEnd) = $range[$i]; + list($rangeStart, $rangeEnd) = $range[$i]; list($startingCol, $startingRow) = PHPExcel_Cell::coordinateFromString($rangeStart); - list($endingCol, $endingRow) = PHPExcel_Cell::coordinateFromString($rangeEnd); + list($endingCol, $endingRow) = PHPExcel_Cell::coordinateFromString($rangeEnd); // Conversions... - $startingCol = PHPExcel_Cell::columnIndexFromString($startingCol); - $endingCol = PHPExcel_Cell::columnIndexFromString($endingCol); + $startingCol = PHPExcel_Cell::columnIndexFromString($startingCol); + $endingCol = PHPExcel_Cell::columnIndexFromString($endingCol); // Current data - $currentCol = --$startingCol; - $currentRow = $startingRow; + $currentCol = --$startingCol; + $currentRow = $startingRow; // Loop cells while ($currentCol < $endingCol) { @@ -763,9 +737,9 @@ class PHPExcel_Cell /** * Compare 2 cells * - * @param PHPExcel_Cell $a Cell a - * @param PHPExcel_Cell $a Cell b - * @return int Result of comparison (always -1 or 1, never zero!) + * @param PHPExcel_Cell $a Cell a + * @param PHPExcel_Cell $a Cell b + * @return int Result of comparison (always -1 or 1, never zero!) */ public static function compareCells(PHPExcel_Cell $a, PHPExcel_Cell $b) { @@ -813,7 +787,7 @@ class PHPExcel_Cell public function __clone() { $vars = get_object_vars($this); foreach ($vars as $key => $value) { - if (is_object($value)) { + if ((is_object($value)) && ($key != '_parent')) { $this->$key = clone $value; } else { $this->$key = $value; @@ -841,8 +815,20 @@ class PHPExcel_Cell { $this->_xfIndex = $pValue; - $this->notifyCacheController(); + return $this->notifyCacheController(); + } + + + public function setFormulaAttributes($pAttributes) + { + $this->_formulaAttributes = $pAttributes; return $this; } + public function getFormulaAttributes() + { + return $this->_formulaAttributes; + } + } + diff --git a/libraries/PHPExcel/PHPExcel/Cell/AdvancedValueBinder.php b/libraries/PHPExcel/PHPExcel/Cell/AdvancedValueBinder.php index 7e305c5f8..51268112f 100644 --- a/libraries/PHPExcel/PHPExcel/Cell/AdvancedValueBinder.php +++ b/libraries/PHPExcel/PHPExcel/Cell/AdvancedValueBinder.php @@ -22,7 +22,7 @@ * @package PHPExcel_Cell * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Cell/DataType.php b/libraries/PHPExcel/PHPExcel/Cell/DataType.php index 1496d83d0..d542cab4e 100644 --- a/libraries/PHPExcel/PHPExcel/Cell/DataType.php +++ b/libraries/PHPExcel/PHPExcel/Cell/DataType.php @@ -22,7 +22,7 @@ * @package PHPExcel_Cell * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Cell/DataValidation.php b/libraries/PHPExcel/PHPExcel/Cell/DataValidation.php index 2c3913c7c..db1b497e8 100644 --- a/libraries/PHPExcel/PHPExcel/Cell/DataValidation.php +++ b/libraries/PHPExcel/PHPExcel/Cell/DataValidation.php @@ -22,7 +22,7 @@ * @package PHPExcel_Cell * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Cell/DefaultValueBinder.php b/libraries/PHPExcel/PHPExcel/Cell/DefaultValueBinder.php index e49449f22..ad5ae468d 100644 --- a/libraries/PHPExcel/PHPExcel/Cell/DefaultValueBinder.php +++ b/libraries/PHPExcel/PHPExcel/Cell/DefaultValueBinder.php @@ -22,7 +22,7 @@ * @package PHPExcel_Cell * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Cell/Hyperlink.php b/libraries/PHPExcel/PHPExcel/Cell/Hyperlink.php index eab9297e8..994cef51c 100644 --- a/libraries/PHPExcel/PHPExcel/Cell/Hyperlink.php +++ b/libraries/PHPExcel/PHPExcel/Cell/Hyperlink.php @@ -22,7 +22,7 @@ * @package PHPExcel_Cell * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Cell/IValueBinder.php b/libraries/PHPExcel/PHPExcel/Cell/IValueBinder.php index 4bd1ef2ec..c14d630a4 100644 --- a/libraries/PHPExcel/PHPExcel/Cell/IValueBinder.php +++ b/libraries/PHPExcel/PHPExcel/Cell/IValueBinder.php @@ -22,7 +22,7 @@ * @package PHPExcel_Cell * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Comment.php b/libraries/PHPExcel/PHPExcel/Comment.php index 735e78c57..432cfe1ea 100644 --- a/libraries/PHPExcel/PHPExcel/Comment.php +++ b/libraries/PHPExcel/PHPExcel/Comment.php @@ -22,7 +22,7 @@ * @package PHPExcel * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/DocumentProperties.php b/libraries/PHPExcel/PHPExcel/DocumentProperties.php index 64b0c2a29..d6d928ecc 100644 --- a/libraries/PHPExcel/PHPExcel/DocumentProperties.php +++ b/libraries/PHPExcel/PHPExcel/DocumentProperties.php @@ -8,12 +8,12 @@ * 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 @@ -22,7 +22,7 @@ * @package PHPExcel * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -41,70 +41,70 @@ class PHPExcel_DocumentProperties * @var string */ private $_creator; - + /** * LastModifiedBy * * @var string */ private $_lastModifiedBy; - + /** * Created * * @var datetime */ private $_created; - + /** * Modified * * @var datetime */ private $_modified; - + /** * Title * * @var string */ private $_title; - + /** * Description * * @var string */ private $_description; - + /** * Subject * * @var string */ private $_subject; - + /** * Keywords * * @var string */ private $_keywords; - + /** * Category * * @var string */ private $_category; - + /** * Company - * + * * @var string */ private $_company; - + /** * Create a new PHPExcel_DocumentProperties */ @@ -120,9 +120,10 @@ class PHPExcel_DocumentProperties $this->_description = ''; $this->_keywords = ''; $this->_category = ''; + $this->_manager = ''; $this->_company = 'Microsoft Corporation'; } - + /** * Get Creator * @@ -131,7 +132,7 @@ class PHPExcel_DocumentProperties public function getCreator() { return $this->_creator; } - + /** * Set Creator * @@ -142,7 +143,7 @@ class PHPExcel_DocumentProperties $this->_creator = $pValue; return $this; } - + /** * Get Last Modified By * @@ -151,7 +152,7 @@ class PHPExcel_DocumentProperties public function getLastModifiedBy() { return $this->_lastModifiedBy; } - + /** * Set Last Modified By * @@ -162,7 +163,7 @@ class PHPExcel_DocumentProperties $this->_lastModifiedBy = $pValue; return $this; } - + /** * Get Created * @@ -171,7 +172,7 @@ class PHPExcel_DocumentProperties public function getCreated() { return $this->_created; } - + /** * Set Created * @@ -185,7 +186,7 @@ class PHPExcel_DocumentProperties $this->_created = $pValue; return $this; } - + /** * Get Modified * @@ -194,7 +195,7 @@ class PHPExcel_DocumentProperties public function getModified() { return $this->_modified; } - + /** * Set Modified * @@ -208,7 +209,7 @@ class PHPExcel_DocumentProperties $this->_modified = $pValue; return $this; } - + /** * Get Title * @@ -217,7 +218,7 @@ class PHPExcel_DocumentProperties public function getTitle() { return $this->_title; } - + /** * Set Title * @@ -228,7 +229,7 @@ class PHPExcel_DocumentProperties $this->_title = $pValue; return $this; } - + /** * Get Description * @@ -237,7 +238,7 @@ class PHPExcel_DocumentProperties public function getDescription() { return $this->_description; } - + /** * Set Description * @@ -248,7 +249,7 @@ class PHPExcel_DocumentProperties $this->_description = $pValue; return $this; } - + /** * Get Subject * @@ -257,7 +258,7 @@ class PHPExcel_DocumentProperties public function getSubject() { return $this->_subject; } - + /** * Set Subject * @@ -268,7 +269,7 @@ class PHPExcel_DocumentProperties $this->_subject = $pValue; return $this; } - + /** * Get Keywords * @@ -277,7 +278,7 @@ class PHPExcel_DocumentProperties public function getKeywords() { return $this->_keywords; } - + /** * Set Keywords * @@ -288,7 +289,7 @@ class PHPExcel_DocumentProperties $this->_keywords = $pValue; return $this; } - + /** * Get Category * @@ -297,7 +298,7 @@ class PHPExcel_DocumentProperties public function getCategory() { return $this->_category; } - + /** * Set Category * @@ -308,7 +309,7 @@ class PHPExcel_DocumentProperties $this->_category = $pValue; return $this; } - + /** * Get Company * @@ -317,18 +318,38 @@ class PHPExcel_DocumentProperties public function getCompany() { return $this->_company; } - + /** * Set Company * * @param string $pValue - * @return PHPPowerPoint_DocumentProperties + * @return PHPExcel_DocumentProperties */ public function setCompany($pValue = '') { $this->_company = $pValue; return $this; } - + + /** + * Get Manager + * + * @return string + */ + public function getManager() { + return $this->_manager; + } + + /** + * Set Manager + * + * @param string $pValue + * @return PHPExcel_DocumentProperties + */ + public function setManager($pValue = '') { + $this->_manager = $pValue; + return $this; + } + /** * Implement PHP __clone to create a deep clone, not just a shallow copy. */ diff --git a/libraries/PHPExcel/PHPExcel/DocumentSecurity.php b/libraries/PHPExcel/PHPExcel/DocumentSecurity.php index 152218932..a6de9ee39 100644 --- a/libraries/PHPExcel/PHPExcel/DocumentSecurity.php +++ b/libraries/PHPExcel/PHPExcel/DocumentSecurity.php @@ -22,7 +22,7 @@ * @package PHPExcel * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/HashTable.php b/libraries/PHPExcel/PHPExcel/HashTable.php index bd526b6e8..219167231 100644 --- a/libraries/PHPExcel/PHPExcel/HashTable.php +++ b/libraries/PHPExcel/PHPExcel/HashTable.php @@ -22,7 +22,7 @@ * @package PHPExcel * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/IComparable.php b/libraries/PHPExcel/PHPExcel/IComparable.php index 3c175d1e1..0a51b069e 100644 --- a/libraries/PHPExcel/PHPExcel/IComparable.php +++ b/libraries/PHPExcel/PHPExcel/IComparable.php @@ -20,7 +20,7 @@ * @package PHPExcel * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/IOFactory.php b/libraries/PHPExcel/PHPExcel/IOFactory.php index 21fd23c73..a3650bedc 100644 --- a/libraries/PHPExcel/PHPExcel/IOFactory.php +++ b/libraries/PHPExcel/PHPExcel/IOFactory.php @@ -22,7 +22,7 @@ * @package PHPExcel * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/NamedRange.php b/libraries/PHPExcel/PHPExcel/NamedRange.php index 1aa523678..992c2fa3f 100644 --- a/libraries/PHPExcel/PHPExcel/NamedRange.php +++ b/libraries/PHPExcel/PHPExcel/NamedRange.php @@ -22,7 +22,7 @@ * @package PHPExcel * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Reader/CSV.php b/libraries/PHPExcel/PHPExcel/Reader/CSV.php index 5fa83bd4b..086c9482d 100644 --- a/libraries/PHPExcel/PHPExcel/Reader/CSV.php +++ b/libraries/PHPExcel/PHPExcel/Reader/CSV.php @@ -22,7 +22,7 @@ * @package PHPExcel_Reader * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Reader/DefaultReadFilter.php b/libraries/PHPExcel/PHPExcel/Reader/DefaultReadFilter.php index c6620e7c0..e83ac9ade 100644 --- a/libraries/PHPExcel/PHPExcel/Reader/DefaultReadFilter.php +++ b/libraries/PHPExcel/PHPExcel/Reader/DefaultReadFilter.php @@ -22,7 +22,7 @@ * @package PHPExcel_Reader * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Reader/Excel2003XML.php b/libraries/PHPExcel/PHPExcel/Reader/Excel2003XML.php index 96e3436b2..99f00eda9 100644 --- a/libraries/PHPExcel/PHPExcel/Reader/Excel2003XML.php +++ b/libraries/PHPExcel/PHPExcel/Reader/Excel2003XML.php @@ -22,7 +22,7 @@ * @package PHPExcel_Reader * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -557,6 +557,11 @@ class PHPExcel_Reader_Excel2003XML implements PHPExcel_Reader_IReader $cellDataFormula = ''; if (isset($cell_ss['Formula'])) { $cellDataFormula = $cell_ss['Formula']; + // added this as a check for array formulas + if (isset($cell_ss['ArrayRange'])) { + $cellDataCSEFormula = $cell_ss['ArrayRange']; +// echo "found an array formula at ".$columnID.$rowID."
"; + } $hasCalculatedValue = true; } if (isset($cell->Data)) { diff --git a/libraries/PHPExcel/PHPExcel/Reader/Excel2007.php b/libraries/PHPExcel/PHPExcel/Reader/Excel2007.php index 031dee559..c4e3e412d 100644 --- a/libraries/PHPExcel/PHPExcel/Reader/Excel2007.php +++ b/libraries/PHPExcel/PHPExcel/Reader/Excel2007.php @@ -22,7 +22,7 @@ * @package PHPExcel_Reader * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -71,6 +71,9 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader */ private $_readFilter = null; + + private $_referenceHelper = null; + /** * Read data only? * @@ -150,6 +153,7 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader */ public function __construct() { $this->_readFilter = new PHPExcel_Reader_DefaultReadFilter(); + $this->_referenceHelper = PHPExcel_ReferenceHelper::getInstance(); } /** @@ -245,12 +249,11 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader $difference[0] = PHPExcel_Cell::columnIndexFromString($current[0]) - PHPExcel_Cell::columnIndexFromString($master[0]); $difference[1] = $current[1] - $master[1]; - $helper = PHPExcel_ReferenceHelper::getInstance(); - $value = $helper->updateFormulaReferences( $sharedFormulas[$instance]['formula'], - 'A1', - $difference[0], - $difference[1] - ); + $value = $this->_referenceHelper->updateFormulaReferences( $sharedFormulas[$instance]['formula'], + 'A1', + $difference[0], + $difference[1] + ); // echo 'Adjusted Formula is '.$value.'
'; } } @@ -311,7 +314,7 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader switch ($rel["Type"]) { case "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties": $xmlCore = simplexml_load_string($this->_getFromZipArchive($zip, "{$rel['Target']}")); - if ($xmlCore) { + if (is_object($xmlCore)) { $xmlCore->registerXPathNamespace("dc", "http://purl.org/dc/elements/1.1/"); $xmlCore->registerXPathNamespace("dcterms", "http://purl.org/dc/terms/"); $xmlCore->registerXPathNamespace("cp", "http://schemas.openxmlformats.org/package/2006/metadata/core-properties"); @@ -328,6 +331,25 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader } break; + case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties": + $xmlCore = simplexml_load_string($this->_getFromZipArchive($zip, "{$rel['Target']}")); + if (is_object($xmlCore)) { + $docProps = $excel->getProperties(); + if (isset($xmlCore->Company)) + $docProps->setCompany((string) $xmlCore->Company); + if (isset($xmlCore->Manager)) + $docProps->setManager((string) $xmlCore->Manager); + } + break; + + case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties": + $xmlCore = simplexml_load_string($this->_getFromZipArchive($zip, "{$rel['Target']}")); + if (is_object($xmlCore)) { + $xmlCore->registerXPathNamespace("vt", "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes"); + $docProps = $excel->getProperties(); + } + break; + case "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument": $dir = dirname($rel["Target"]); $relsWorkbook = simplexml_load_string($this->_getFromZipArchive($zip, "$dir/_rels/" . basename($rel["Target"]) . ".rels")); //~ http://schemas.openxmlformats.org/package/2006/relationships"); @@ -692,6 +714,11 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader } else { // Formula $this->_castToFormula($c,$r,$cellDataType,$value,$calculatedValue,$sharedFormulas,'_castToBool'); + if (isset($c->f['t'])) { + $att = array(); + $att = $c->f; + $docSheet->getCell($r)->setFormulaAttributes($att); + } // echo '$calculatedValue = '.$calculatedValue.'
'; } break; @@ -1276,10 +1303,14 @@ class PHPExcel_Reader_Excel2007 implements PHPExcel_Reader_IReader break; case '_xlnm.Print_Area': - $range = explode('!', $extractedRange); - $extractedRange = isset($range[1]) ? $range[1] : $range[0]; - - $docSheet->getPageSetup()->setPrintArea($extractedRange); + $rangeSets = explode(',', $extractedRange); // FIXME: what if sheetname contains comma? + $newRangeSets = array(); + foreach($rangeSets as $rangeSet) { + $range = explode('!', $rangeSet); // FIXME: what if sheetname contains exclamation mark? + $rangeSet = isset($range[1]) ? $range[1] : $range[0]; + $newRangeSets[] = str_replace('$', '', $rangeSet); + } + $docSheet->getPageSetup()->setPrintArea(implode(',',$newRangeSets)); break; default: diff --git a/libraries/PHPExcel/PHPExcel/Reader/Excel5.php b/libraries/PHPExcel/PHPExcel/Reader/Excel5.php index a4f20e7a4..5c71ee8aa 100644 --- a/libraries/PHPExcel/PHPExcel/Reader/Excel5.php +++ b/libraries/PHPExcel/PHPExcel/Reader/Excel5.php @@ -22,7 +22,7 @@ * @package PHPExcel_Reader_Excel5 * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ // Original file header of ParseXL (used as the base for this class): @@ -834,7 +834,7 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader // Foo!$C$7:$J$66 // Bar!$A$1:$IV$2 - $explodes = explode('!', $range); + $explodes = explode('!', $range); // FIXME: what if sheetname contains exclamation mark? $sheetName = $explodes[0]; if (count($explodes) == 2) { @@ -4202,22 +4202,22 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader // 1. BITMAPCOREHEADER // offset: 0; size: 4; bcSize, Specifies the number of bytes required by the structure $bcSize = $this->_GetInt4d($iData, 0); - var_dump($bcSize); +// var_dump($bcSize); // offset: 4; size: 2; bcWidth, specifies the width of the bitmap, in pixels $bcWidth = $this->_GetInt2d($iData, 4); - var_dump($bcWidth); +// var_dump($bcWidth); // offset: 6; size: 2; bcHeight, specifies the height of the bitmap, in pixels. $bcHeight = $this->_GetInt2d($iData, 6); - var_dump($bcHeight); +// var_dump($bcHeight); $ih = imagecreatetruecolor($bcWidth, $bcHeight); // offset: 8; size: 2; bcPlanes, specifies the number of planes for the target device. This value must be 1 // offset: 10; size: 2; bcBitCount specifies the number of bits-per-pixel. This value must be 1, 4, 8, or 24 $bcBitCount = $this->_GetInt2d($iData, 10); - var_dump($bcBitCount); +// var_dump($bcBitCount); $rgbString = substr($iData, 12); $rgbTriples = array(); @@ -4602,24 +4602,24 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader case 0x12: $name = 'tUplus'; $size = 1; $data = '+'; break; case 0x13: $name = 'tUminus'; $size = 1; $data = '-'; break; case 0x14: $name = 'tPercent'; $size = 1; $data = '%'; break; - case 0x15: // parenthesis + case 0x15: // parenthesis $name = 'tParen'; $size = 1; $data = null; break; - case 0x16: // missing argument + case 0x16: // missing argument $name = 'tMissArg'; $size = 1; $data = ''; break; - case 0x17: // string + case 0x17: // string $name = 'tStr'; // offset: 1; size: var; Unicode string, 8-bit string length $string = $this->_readUnicodeStringShort(substr($formulaData, 1)); $size = 1 + $string['size']; $data = $this->_UTF8toExcelDoubleQuoted($string['value']); break; - case 0x19: // Special attribute + case 0x19: // Special attribute // offset: 1; size: 1; attribute type flags: switch (ord($formulaData[1])) { case 0x01: @@ -4689,39 +4689,42 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader break; } break; - case 0x1C: // error code + case 0x1C: // error code // offset: 1; size: 1; error code $name = 'tErr'; $size = 2; $data = $this->_mapErrorCode(ord($formulaData[1])); break; - case 0x1D: // boolean + case 0x1D: // boolean // offset: 1; size: 1; 0 = false, 1 = true; $name = 'tBool'; $size = 2; $data = ord($formulaData[1]) ? 'TRUE' : 'FALSE'; break; - case 0x1E: // integer + case 0x1E: // integer // offset: 1; size: 2; unsigned 16-bit integer $name = 'tInt'; $size = 3; $data = $this->_GetInt2d($formulaData, 1); break; - case 0x1F: // number + case 0x1F: // number // offset: 1; size: 8; $name = 'tNum'; $size = 9; $data = $this->_extractNumber(substr($formulaData, 1)); $data = str_replace(',', '.', (string)$data); // in case non-English locale break; - case 0x40: // array constant - case 0x60: // array constant + case 0x20: // array constant + case 0x40: + case 0x60: // offset: 1; size: 7; not used $name = 'tArray'; $size = 8; $data = null; break; - case 0x41: // function with fixed number of arguments + case 0x21: // function with fixed number of arguments + case 0x41: + case 0x61: $name = 'tFunc'; $size = 3; // offset: 1; size: 2; index to built-in sheet function @@ -4891,9 +4894,9 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader } $data = array('function' => $function, 'args' => $args); break; - case 0x22: // function with variable number of arguments - case 0x42: // function with variable number of arguments - case 0x62: // function with variable number of arguments + case 0x22: // function with variable number of arguments + case 0x42: + case 0x62: $name = 'tFuncV'; $size = 4; // offset: 1; size: 1; number of arguments @@ -4995,8 +4998,9 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader } $data = array('function' => $function, 'args' => $args); break; - case 0x23: // index to defined name + case 0x23: // index to defined name case 0x43: + case 0x63: $name = 'tName'; $size = 5; // offset: 1; size: 2; one-based index to definedname record @@ -5004,22 +5008,23 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader // offset: 2; size: 2; not used $data = $this->_definedname[$definedNameIndex]['name']; break; - case 0x24: // single cell reference e.g. A5 + case 0x24: // single cell reference e.g. A5 case 0x44: case 0x64: $name = 'tRef'; $size = 5; $data = $this->_readBIFF8CellAddress(substr($formulaData, 1, 4)); break; - case 0x25: // cell range reference to cells in the same sheet + case 0x25: // cell range reference to cells in the same sheet (2d) case 0x45: case 0x65: $name = 'tArea'; $size = 9; $data = $this->_readBIFF8CellRangeAddress(substr($formulaData, 1, 8)); break; - case 0x26: + case 0x26: // Constant reference sub-expression case 0x46: + case 0x66: $name = 'tMemArea'; // offset: 1; size: 4; not used // offset: 5; size: 2; size of the following subexpression @@ -5027,7 +5032,9 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader $size = 7 + $subSize; $data = $this->_getFormulaFromData(substr($formulaData, 7, $subSize)); break; + case 0x27: // Deleted constant reference sub-expression case 0x47: + case 0x67: $name = 'tMemErr'; // offset: 1; size: 4; not used // offset: 5; size: 2; size of the following subexpression @@ -5035,16 +5042,17 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader $size = 7 + $subSize; $data = $this->_getFormulaFromData(substr($formulaData, 7, $subSize)); break; - case 0x29: + case 0x29: // Variable reference sub-expression case 0x49: + case 0x69: $name = 'tMemFunc'; - // offset: 1; size: 2; size of the following subexpression + // offset: 1; size: 2; size of the following sub-expression $subSize = $this->_GetInt2d($formulaData, 1); $size = 3 + $subSize; $data = $this->_getFormulaFromData(substr($formulaData, 3, $subSize)); break; - case 0x2C: // Relative reference, used in shared formulas and some other places + case 0x2C: // Relative 2d cell reference reference, used in shared formulas and some other places case 0x4C: case 0x6C: $name = 'tRefN'; @@ -5052,7 +5060,7 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader $data = $this->_readBIFF8CellAddressB(substr($formulaData, 1, 4), $baseCell); break; - case 0x2D: + case 0x2D: // Relative 2d range reference case 0x4D: case 0x6D: $name = 'tAreaN'; @@ -5060,7 +5068,7 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader $data = $this->_readBIFF8CellRangeAddressB(substr($formulaData, 1, 8), $baseCell); break; - case 0x39: + case 0x39: // External name case 0x59: case 0x79: $name = 'tNameX'; @@ -5073,8 +5081,9 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader // offset: 5; size: 2; not used break; - case 0x3A: // 3d reference to cell + case 0x3A: // 3d reference to cell case 0x5A: + case 0x7A: $name = 'tRef3d'; $size = 7; @@ -5085,15 +5094,15 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader $cellAddress = $this->_readBIFF8CellAddress(substr($formulaData, 3, 4)); $data = "$sheetRange!$cellAddress"; - } catch (Exception $e) { // deleted sheet reference $data = '#REF!'; } break; - case 0x3B: // 3d reference to cell range + case 0x3B: // 3d reference to cell range case 0x5B: + case 0x7B: $name = 'tArea3d'; $size = 11; @@ -5104,15 +5113,13 @@ class PHPExcel_Reader_Excel5 implements PHPExcel_Reader_IReader $cellRangeAddress = $this->_readBIFF8CellRangeAddress(substr($formulaData, 3, 8)); $data = "$sheetRange!$cellRangeAddress"; - } catch (Exception $e) { // deleted sheet reference $data = '#REF!'; - } break; - // case 0x39: // don't know how to deal with + // Unknown cases // don't know how to deal with default: throw new Exception('Unrecognized token ' . sprintf('%02X', $id) . ' in formula'); break; diff --git a/libraries/PHPExcel/PHPExcel/Reader/Excel5/Escher.php b/libraries/PHPExcel/PHPExcel/Reader/Excel5/Escher.php index 0418dd7c3..b7c67e91f 100644 --- a/libraries/PHPExcel/PHPExcel/Reader/Excel5/Escher.php +++ b/libraries/PHPExcel/PHPExcel/Reader/Excel5/Escher.php @@ -22,7 +22,7 @@ * @package PHPExcel_Reader_Excel5 * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ /** diff --git a/libraries/PHPExcel/PHPExcel/Reader/IReadFilter.php b/libraries/PHPExcel/PHPExcel/Reader/IReadFilter.php index c397d56ed..00fa2e8b5 100644 --- a/libraries/PHPExcel/PHPExcel/Reader/IReadFilter.php +++ b/libraries/PHPExcel/PHPExcel/Reader/IReadFilter.php @@ -22,7 +22,7 @@ * @package PHPExcel_Reader * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Reader/IReader.php b/libraries/PHPExcel/PHPExcel/Reader/IReader.php index ef5beacee..e1cdc43bc 100644 --- a/libraries/PHPExcel/PHPExcel/Reader/IReader.php +++ b/libraries/PHPExcel/PHPExcel/Reader/IReader.php @@ -22,7 +22,7 @@ * @package PHPExcel_Reader * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Reader/OOCalc.php b/libraries/PHPExcel/PHPExcel/Reader/OOCalc.php index 8a1407ab9..a1ddf91d0 100644 --- a/libraries/PHPExcel/PHPExcel/Reader/OOCalc.php +++ b/libraries/PHPExcel/PHPExcel/Reader/OOCalc.php @@ -22,7 +22,7 @@ * @package PHPExcel_Reader * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -242,6 +242,9 @@ class PHPExcel_Reader_OOCalc implements PHPExcel_Reader_IReader throw new Exception("Could not open " . $pFilename . " for reading! File does not exist."); } + $timezoneObj = new DateTimeZone('Europe/London'); + $GMT = new DateTimeZone('UTC'); + $zip = new ZipArchive; if ($zip->open($pFilename) === true) { // echo '

Meta Information

'; @@ -338,6 +341,11 @@ class PHPExcel_Reader_OOCalc implements PHPExcel_Reader_IReader foreach($worksheetData as $key => $rowData) { // echo ''.$key.'
'; switch ($key) { + case 'table-header-rows': + foreach ($rowData as $key=>$cellData) { + $rowData = $cellData; + break; + } case 'table-row' : $columnID = 'A'; foreach($rowData as $key => $cellData) { @@ -387,7 +395,8 @@ class PHPExcel_Reader_OOCalc implements PHPExcel_Reader_IReader break; case 'date' : $type = PHPExcel_Cell_DataType::TYPE_NUMERIC; - $dateObj = date_create($cellDataOfficeAttributes['date-value']); + $dateObj = new DateTime($cellDataOfficeAttributes['date-value'], $GMT); + $dateObj->setTimeZone($timezoneObj); list($year,$month,$day,$hour,$minute,$second) = explode(' ',$dateObj->format('Y m d H i s')); $dataValue = PHPExcel_Shared_Date::FormattedPHPToExcel($year,$month,$day,$hour,$minute,$second); if ($dataValue != floor($dataValue)) { @@ -418,7 +427,7 @@ class PHPExcel_Reader_OOCalc implements PHPExcel_Reader_IReader if (($key % 2) == 0) { $value = preg_replace('/\[\.(.*):\.(.*)\]/Ui','$1:$2',$value); $value = preg_replace('/\[\.(.*)\]/Ui','$1',$value); - $value = PHPExcel_Calculation::_translateSeparator(';',',',$value); + $value = PHPExcel_Calculation::_translateSeparator(';',',',$value,$inBraces); } } unset($value); diff --git a/libraries/PHPExcel/PHPExcel/Reader/SYLK.php b/libraries/PHPExcel/PHPExcel/Reader/SYLK.php index ec8a4d41b..790aa2f05 100644 --- a/libraries/PHPExcel/PHPExcel/Reader/SYLK.php +++ b/libraries/PHPExcel/PHPExcel/Reader/SYLK.php @@ -22,7 +22,7 @@ * @package PHPExcel_Reader * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Reader/Serialized.php b/libraries/PHPExcel/PHPExcel/Reader/Serialized.php index 88f289288..04b14f261 100644 --- a/libraries/PHPExcel/PHPExcel/Reader/Serialized.php +++ b/libraries/PHPExcel/PHPExcel/Reader/Serialized.php @@ -22,7 +22,7 @@ * @package PHPExcel_Reader * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/ReferenceHelper.php b/libraries/PHPExcel/PHPExcel/ReferenceHelper.php index cb9673c1d..7a37ed0da 100644 --- a/libraries/PHPExcel/PHPExcel/ReferenceHelper.php +++ b/libraries/PHPExcel/PHPExcel/ReferenceHelper.php @@ -22,7 +22,7 @@ * @package PHPExcel * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -35,6 +35,13 @@ */ class PHPExcel_ReferenceHelper { + /** Constants */ + /** Regular Expressions */ + const REFHELPER_REGEXP_CELLREF = '((\w*|\'[^!]*\')!)?(?getColumn()) - 1 + $pNumCols ) . ($cell->getRow() + $pNumRows); // Should the cell be updated? Move value and cellXf index from one cell to another. - if ( - (PHPExcel_Cell::columnIndexFromString( $cell->getColumn() ) >= PHPExcel_Cell::columnIndexFromString($beforeColumn)) && - ($cell->getRow() >= $beforeRow) - ) { + if ((PHPExcel_Cell::columnIndexFromString( $cell->getColumn() ) >= PHPExcel_Cell::columnIndexFromString($beforeColumn)) && + ($cell->getRow() >= $beforeRow)) { // Update cell styles $pSheet->getCell($newCoordinates)->setXfIndex($cell->getXfIndex()); @@ -132,7 +137,7 @@ class PHPExcel_ReferenceHelper if ($cell->getDataType() == PHPExcel_Cell_DataType::TYPE_FORMULA) { // Formula should be adjusted $pSheet->getCell($newCoordinates) - ->setValue($this->updateFormulaReferences($cell->getValue(), $pBefore, $pNumCols, $pNumRows)); + ->setValue($this->updateFormulaReferences($cell->getValue(), $pBefore, $pNumCols, $pNumRows, $pSheet->getTitle())); } else { // Formula should not be adjusted $pSheet->getCell($newCoordinates)->setValue($cell->getValue()); @@ -340,43 +345,121 @@ class PHPExcel_ReferenceHelper * @return string Updated formula * @throws Exception */ - public function updateFormulaReferences($pFormula = '', $pBefore = 'A1', $pNumCols = 0, $pNumRows = 0) { - // Parse formula into a tree of tokens - $tokenisedFormula = PHPExcel_Calculation::getInstance()->parseFormula($pFormula); - - $newCellTokens = $cellTokens = array(); - $adjustCount = 0; - // Build the translation table of cell tokens - foreach($tokenisedFormula as $token) { - $token = $token['value']; - if (preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_CELLREF.'$/i', $token, $matches)) { - list($column,$row) = PHPExcel_Cell::coordinateFromString($token); - // Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more - $column = PHPExcel_Cell::columnIndexFromString($column) + 100000; - $row += 10000000; - $cellIndex = $column.$row; - if (!isset($cellTokens[$cellIndex])) { - $newReference = $this->updateCellReference($token, $pBefore, $pNumCols, $pNumRows); - if ($newReference !== $token) { - $newCellTokens[$cellIndex] = preg_quote($newReference); - $cellTokens[$cellIndex] = '/(? &$formulaBlock) { - // Only count/replace in alternate array entries + // Ignore blocks that were enclosed in quotes (even entries in the $formulaBlocks array after the explode) if (($i % 2) == 0) { - $formulaBlock = preg_replace($cellTokens,$newCellTokens,$formulaBlock); + $adjustCount = 0; + $newCellTokens = $cellTokens = array(); + // Search for row ranges (e.g. 'Sheet1'!3:5 or 3:5) with or without $ absolutes (e.g. $3:5) + $matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_ROWRANGE.'/i', ' '.$formulaBlock.' ', $matches, PREG_SET_ORDER); + if ($matchCount > 0) { + foreach($matches as $match) { + $fromString = ($match[2] > '') ? $match[2].'!' : ''; + $fromString .= $match[3].':'.$match[4]; + $modified3 = substr($this->updateCellReference('$A'.$match[3],$pBefore,$pNumCols,$pNumRows),2); + $modified4 = substr($this->updateCellReference('$A'.$match[4],$pBefore,$pNumCols,$pNumRows),2); + + if ($match[3].':'.$match[4] !== $modified3.':'.$modified4) { + if (($match[2] == '') || (trim($match[2],"'") == $sheetName)) { + $toString = ($match[2] > '') ? $match[2].'!' : ''; + $toString .= $modified3.':'.$modified4; + // Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more + $column = 100000; + $row = 10000000+trim($match[3],'$'); + $cellIndex = $column.$row; + + $newCellTokens[$cellIndex] = preg_quote($toString); + $cellTokens[$cellIndex] = '/(? 0) { + foreach($matches as $match) { + $fromString = ($match[2] > '') ? $match[2].'!' : ''; + $fromString .= $match[3].':'.$match[4]; + $modified3 = substr($this->updateCellReference($match[3].'$1',$pBefore,$pNumCols,$pNumRows),0,-2); + $modified4 = substr($this->updateCellReference($match[4].'$1',$pBefore,$pNumCols,$pNumRows),0,-2); + + if ($match[3].':'.$match[4] !== $modified3.':'.$modified4) { + if (($match[2] == '') || (trim($match[2],"'") == $sheetName)) { + $toString = ($match[2] > '') ? $match[2].'!' : ''; + $toString .= $modified3.':'.$modified4; + // Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more + $column = PHPExcel_Cell::columnIndexFromString(trim($match[3],'$')) + 100000; + $row = 10000000; + $cellIndex = $column.$row; + + $newCellTokens[$cellIndex] = preg_quote($toString); + $cellTokens[$cellIndex] = '/(? 0) { + foreach($matches as $match) { + $fromString = ($match[2] > '') ? $match[2].'!' : ''; + $fromString .= $match[3].':'.$match[4]; + $modified3 = $this->updateCellReference($match[3],$pBefore,$pNumCols,$pNumRows); + $modified4 = $this->updateCellReference($match[4],$pBefore,$pNumCols,$pNumRows); + + if ($match[3].$match[4] !== $modified3.$modified4) { + if (($match[2] == '') || (trim($match[2],"'") == $sheetName)) { + $toString = ($match[2] > '') ? $match[2].'!' : ''; + $toString .= $modified3.':'.$modified4; + list($column,$row) = PHPExcel_Cell::coordinateFromString($match[3]); + // Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more + $column = PHPExcel_Cell::columnIndexFromString(trim($column,'$')) + 100000; + $row = trim($row,'$') + 10000000; + $cellIndex = $column.$row; + + $newCellTokens[$cellIndex] = preg_quote($toString); + $cellTokens[$cellIndex] = '/(? 0) { + foreach($matches as $match) { + $fromString = ($match[2] > '') ? $match[2].'!' : ''; + $fromString .= $match[3]; + $modified3 = $this->updateCellReference($match[3],$pBefore,$pNumCols,$pNumRows); + + if ($match[3] !== $modified3) { + if (($match[2] == '') || (trim($match[2],"'") == $sheetName)) { + $toString = ($match[2] > '') ? $match[2].'!' : ''; + $toString .= $modified3; + list($column,$row) = PHPExcel_Cell::coordinateFromString($match[3]); + // Max worksheet size is 1,048,576 rows by 16,384 columns in Excel 2007, so our adjustments need to be at least one digit more + $column = PHPExcel_Cell::columnIndexFromString(trim($column,'$')) + 100000; + $row = trim($row,'$') + 10000000; + $cellIndex = $column.$row; + + $newCellTokens[$cellIndex] = preg_quote($toString); + $cellTokens[$cellIndex] = '/(? 0) { + krsort($cellTokens); + krsort($newCellTokens); + // Update cell references in the formula + $formulaBlock = str_replace('\\','',preg_replace($cellTokens,$newCellTokens,$formulaBlock)); + } } } unset($formulaBlock); diff --git a/libraries/PHPExcel/PHPExcel/RichText.php b/libraries/PHPExcel/PHPExcel/RichText.php index c938c62bb..588e64356 100644 --- a/libraries/PHPExcel/PHPExcel/RichText.php +++ b/libraries/PHPExcel/PHPExcel/RichText.php @@ -22,7 +22,7 @@ * @package PHPExcel_RichText * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/RichText/ITextElement.php b/libraries/PHPExcel/PHPExcel/RichText/ITextElement.php index 613028f7f..3f1aa7a3e 100644 --- a/libraries/PHPExcel/PHPExcel/RichText/ITextElement.php +++ b/libraries/PHPExcel/PHPExcel/RichText/ITextElement.php @@ -20,7 +20,7 @@ * @package PHPExcel_RichText * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/RichText/Run.php b/libraries/PHPExcel/PHPExcel/RichText/Run.php index 209af21bb..aac76763f 100644 --- a/libraries/PHPExcel/PHPExcel/RichText/Run.php +++ b/libraries/PHPExcel/PHPExcel/RichText/Run.php @@ -20,7 +20,7 @@ * @package PHPExcel_RichText * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/RichText/TextElement.php b/libraries/PHPExcel/PHPExcel/RichText/TextElement.php index 3a244821b..f5ce8e041 100644 --- a/libraries/PHPExcel/PHPExcel/RichText/TextElement.php +++ b/libraries/PHPExcel/PHPExcel/RichText/TextElement.php @@ -20,7 +20,7 @@ * @package PHPExcel_RichText * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Settings.php b/libraries/PHPExcel/PHPExcel/Settings.php index 7a1d57ea4..52d788056 100644 --- a/libraries/PHPExcel/PHPExcel/Settings.php +++ b/libraries/PHPExcel/PHPExcel/Settings.php @@ -22,7 +22,7 @@ * @package PHPExcel_Settings * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ /** PHPExcel root directory */ diff --git a/libraries/PHPExcel/PHPExcel/Shared/CodePage.php b/libraries/PHPExcel/PHPExcel/Shared/CodePage.php index 10f82e459..f20983858 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/CodePage.php +++ b/libraries/PHPExcel/PHPExcel/Shared/CodePage.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Shared/Date.php b/libraries/PHPExcel/PHPExcel/Shared/Date.php index c45c23f63..334e8df95 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/Date.php +++ b/libraries/PHPExcel/PHPExcel/Shared/Date.php @@ -23,7 +23,7 @@ * @package PHPExcel_Shared * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Shared/Drawing.php b/libraries/PHPExcel/PHPExcel/Shared/Drawing.php index a89c94e3e..a24f96323 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/Drawing.php +++ b/libraries/PHPExcel/PHPExcel/Shared/Drawing.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher.php b/libraries/PHPExcel/PHPExcel/Shared/Escher.php index c230d9930..11c19b2e1 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/Escher.php +++ b/libraries/PHPExcel/PHPExcel/Shared/Escher.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared_Escher * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ /** diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer.php b/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer.php index c78485b9c..6cbd2f025 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer.php +++ b/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared_Escher * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ /** diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer.php b/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer.php index c659fd51b..919cf1af4 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer.php +++ b/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared_Escher * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ /** diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php b/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php index 83e31937f..454b7ee53 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php +++ b/libraries/PHPExcel/PHPExcel/Shared/Escher/DgContainer/SpgrContainer/SpContainer.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared_Escher * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ /** diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer.php b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer.php index 59d34cfb7..61eab5dee 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer.php +++ b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared_Escher * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ /** @@ -69,6 +69,13 @@ class PHPExcel_Shared_Escher_DggContainer */ private $_OPT = array(); + /** + * Array of identifier clusters containg information about the maximum shape identifiers + * + * @var array + */ + private $_IDCLs = array(); + /** * Get maximum shape index of all shapes in all drawings (plus one) * @@ -174,4 +181,23 @@ class PHPExcel_Shared_Escher_DggContainer return null; } + /** + * Get identifier clusters + * + * @return array + */ + public function getIDCLs() + { + return $this->_IDCLs; + } + + /** + * Set identifier clusters. array( => , ...) + * + * @param array $pValue + */ + public function setIDCLs($pValue) + { + $this->_IDCLs = $pValue; + } } diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer.php b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer.php index 9292f2d11..6040fb280 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer.php +++ b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared_Escher * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ /** diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE.php b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE.php index 820e703c9..00ccb6d06 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE.php +++ b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared_Escher * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ /** diff --git a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php index 35003ddb4..7f13632e4 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php +++ b/libraries/PHPExcel/PHPExcel/Shared/Escher/DggContainer/BstoreContainer/BSE/Blip.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared_Escher * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ /** diff --git a/libraries/PHPExcel/PHPExcel/Shared/Excel5.php b/libraries/PHPExcel/PHPExcel/Shared/Excel5.php index 05af63358..6469c5263 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/Excel5.php +++ b/libraries/PHPExcel/PHPExcel/Shared/Excel5.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ /** diff --git a/libraries/PHPExcel/PHPExcel/Shared/File.php b/libraries/PHPExcel/PHPExcel/Shared/File.php index dc2c3fd95..23169ce8a 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/File.php +++ b/libraries/PHPExcel/PHPExcel/Shared/File.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -75,7 +75,9 @@ class PHPExcel_Shared_File $returnValue = ''; // Try using realpath() - $returnValue = realpath($pFilename); + if (file_exists($pFilename)) { + $returnValue = realpath($pFilename); + } // Found something? if ($returnValue == '' || is_null($returnValue)) { @@ -107,14 +109,14 @@ class PHPExcel_Shared_File // http://php.net/manual/en/function.sys-get-temp-dir.php#94119 if ( !function_exists('sys_get_temp_dir')) { - if( $temp = getenv('TMP') ) { - return realpath($temp); + if ($temp = getenv('TMP') ) { + if (file_exists($temp)) { return realpath($temp); } } - if( $temp = getenv('TEMP') ) { - return realpath($temp); + if ($temp = getenv('TEMP') ) { + if (file_exists($temp)) { return realpath($temp); } } - if( $temp = getenv('TMPDIR') ) { - return realpath($temp); + if ($temp = getenv('TMPDIR') ) { + if (file_exists($temp)) { return realpath($temp); } } // trick for creating a file in system's temporary dir @@ -126,10 +128,11 @@ class PHPExcel_Shared_File } return null; - } // use ordinary built-in PHP function + // There should be no problem with the 5.2.4 Suhosin realpath() bug, because this line should only + // be called if we're running 5.2.1 or earlier return realpath(sys_get_temp_dir()); } diff --git a/libraries/PHPExcel/PHPExcel/Shared/Font.php b/libraries/PHPExcel/PHPExcel/Shared/Font.php index 1759e878e..24d78be61 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/Font.php +++ b/libraries/PHPExcel/PHPExcel/Shared/Font.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Shared/OLE/ChainedBlockStream.php b/libraries/PHPExcel/PHPExcel/Shared/OLE/ChainedBlockStream.php index 7b6f845a7..af757d007 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/OLE/ChainedBlockStream.php +++ b/libraries/PHPExcel/PHPExcel/Shared/OLE/ChainedBlockStream.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared_OLE * @copyright Copyright (c) 2006 - 2007 Christian Schmidt * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ /** diff --git a/libraries/PHPExcel/PHPExcel/Shared/OLERead.php b/libraries/PHPExcel/PHPExcel/Shared/OLERead.php index b747e13a4..6aebbf017 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/OLERead.php +++ b/libraries/PHPExcel/PHPExcel/Shared/OLERead.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ define('IDENTIFIER_OLE', pack('CCCCCCCC', 0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1)); diff --git a/libraries/PHPExcel/PHPExcel/Shared/PasswordHasher.php b/libraries/PHPExcel/PHPExcel/Shared/PasswordHasher.php index 6b7b3129d..7fb493494 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/PasswordHasher.php +++ b/libraries/PHPExcel/PHPExcel/Shared/PasswordHasher.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Shared/String.php b/libraries/PHPExcel/PHPExcel/Shared/String.php index 32766df17..c033b9ad0 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/String.php +++ b/libraries/PHPExcel/PHPExcel/Shared/String.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -507,7 +507,7 @@ class PHPExcel_Shared_String * @author Rasmus Andersson {@link http://rasmusandersson.se/} * @author vadik56 */ - function utf16_decode( $str, $bom_be=true ) { + public static function utf16_decode( $str, $bom_be=true ) { if( strlen($str) < 2 ) return $str; $c0 = ord($str{0}); $c1 = ord($str{1}); diff --git a/libraries/PHPExcel/PHPExcel/Shared/XMLWriter.php b/libraries/PHPExcel/PHPExcel/Shared/XMLWriter.php index 223d3dddc..8514847c3 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/XMLWriter.php +++ b/libraries/PHPExcel/PHPExcel/Shared/XMLWriter.php @@ -22,13 +22,18 @@ * @package PHPExcel_Shared * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ if (!defined('DATE_W3C')) { define('DATE_W3C', 'Y-m-d\TH:i:sP'); } +if (!defined('DEBUGMODE_ENABLED')) { + define('DEBUGMODE_ENABLED', false); +} + + /** * PHPExcel_Shared_XMLWriter * @@ -80,7 +85,9 @@ class PHPExcel_Shared_XMLWriter { } // Set default values - $this->_xmlWriter->setIndent(true); + if (DEBUGMODE_ENABLED) { + $this->_xmlWriter->setIndent(true); + } } /** diff --git a/libraries/PHPExcel/PHPExcel/Shared/ZipStreamWrapper.php b/libraries/PHPExcel/PHPExcel/Shared/ZipStreamWrapper.php index 77661c68d..b79bfc895 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/ZipStreamWrapper.php +++ b/libraries/PHPExcel/PHPExcel/Shared/ZipStreamWrapper.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Shared/trend/bestFitClass.php b/libraries/PHPExcel/PHPExcel/Shared/trend/bestFitClass.php index 27fecd533..28fe72571 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/trend/bestFitClass.php +++ b/libraries/PHPExcel/PHPExcel/Shared/trend/bestFitClass.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared_Best_Fit * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Shared/trend/exponentialBestFitClass.php b/libraries/PHPExcel/PHPExcel/Shared/trend/exponentialBestFitClass.php index a0717ea6c..0ff98cc5b 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/trend/exponentialBestFitClass.php +++ b/libraries/PHPExcel/PHPExcel/Shared/trend/exponentialBestFitClass.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared_Best_Fit * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Shared/trend/linearBestFitClass.php b/libraries/PHPExcel/PHPExcel/Shared/trend/linearBestFitClass.php index 99f358c28..71219a07f 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/trend/linearBestFitClass.php +++ b/libraries/PHPExcel/PHPExcel/Shared/trend/linearBestFitClass.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared_Best_Fit * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Shared/trend/logarithmicBestFitClass.php b/libraries/PHPExcel/PHPExcel/Shared/trend/logarithmicBestFitClass.php index a59c879b3..03c7dc302 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/trend/logarithmicBestFitClass.php +++ b/libraries/PHPExcel/PHPExcel/Shared/trend/logarithmicBestFitClass.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared_Best_Fit * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Shared/trend/polynomialBestFitClass.php b/libraries/PHPExcel/PHPExcel/Shared/trend/polynomialBestFitClass.php index 02ff0a531..6947c111b 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/trend/polynomialBestFitClass.php +++ b/libraries/PHPExcel/PHPExcel/Shared/trend/polynomialBestFitClass.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared_Best_Fit * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Shared/trend/powerBestFitClass.php b/libraries/PHPExcel/PHPExcel/Shared/trend/powerBestFitClass.php index 9328fcb1d..6d2281cc1 100644 --- a/libraries/PHPExcel/PHPExcel/Shared/trend/powerBestFitClass.php +++ b/libraries/PHPExcel/PHPExcel/Shared/trend/powerBestFitClass.php @@ -22,7 +22,7 @@ * @package PHPExcel_Shared_Best_Fit * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Style.php b/libraries/PHPExcel/PHPExcel/Style.php index d0cbcb029..3e84f9f09 100644 --- a/libraries/PHPExcel/PHPExcel/Style.php +++ b/libraries/PHPExcel/PHPExcel/Style.php @@ -22,7 +22,7 @@ * @package PHPExcel_Style * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -675,7 +675,7 @@ class PHPExcel_Style implements PHPExcel_IComparable public function __clone() { $vars = get_object_vars($this); foreach ($vars as $key => $value) { - if (is_object($value)) { + if ((is_object($value)) && ($key != '_parent')) { $this->$key = clone $value; } else { $this->$key = $value; diff --git a/libraries/PHPExcel/PHPExcel/Style/Alignment.php b/libraries/PHPExcel/PHPExcel/Style/Alignment.php index 412c60395..15b6c87b8 100644 --- a/libraries/PHPExcel/PHPExcel/Style/Alignment.php +++ b/libraries/PHPExcel/PHPExcel/Style/Alignment.php @@ -22,7 +22,7 @@ * @package PHPExcel_Style * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -479,7 +479,7 @@ class PHPExcel_Style_Alignment implements PHPExcel_IComparable public function __clone() { $vars = get_object_vars($this); foreach ($vars as $key => $value) { - if (is_object($value)) { + if ((is_object($value)) && ($key != '_parent')) { $this->$key = clone $value; } else { $this->$key = $value; diff --git a/libraries/PHPExcel/PHPExcel/Style/Border.php b/libraries/PHPExcel/PHPExcel/Style/Border.php index 1af31d6e6..166ccb216 100644 --- a/libraries/PHPExcel/PHPExcel/Style/Border.php +++ b/libraries/PHPExcel/PHPExcel/Style/Border.php @@ -22,7 +22,7 @@ * @package PHPExcel_Style * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -372,7 +372,7 @@ class PHPExcel_Style_Border implements PHPExcel_IComparable public function __clone() { $vars = get_object_vars($this); foreach ($vars as $key => $value) { - if (is_object($value)) { + if ((is_object($value)) && ($key != '_parent')) { $this->$key = clone $value; } else { $this->$key = $value; diff --git a/libraries/PHPExcel/PHPExcel/Style/Borders.php b/libraries/PHPExcel/PHPExcel/Style/Borders.php index ffd66affe..dc32c50ee 100644 --- a/libraries/PHPExcel/PHPExcel/Style/Borders.php +++ b/libraries/PHPExcel/PHPExcel/Style/Borders.php @@ -22,7 +22,7 @@ * @package PHPExcel_Style * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -489,7 +489,7 @@ class PHPExcel_Style_Borders implements PHPExcel_IComparable public function __clone() { $vars = get_object_vars($this); foreach ($vars as $key => $value) { - if (is_object($value)) { + if ((is_object($value)) && ($key != '_parent')) { $this->$key = clone $value; } else { $this->$key = $value; diff --git a/libraries/PHPExcel/PHPExcel/Style/Color.php b/libraries/PHPExcel/PHPExcel/Style/Color.php index 8a25af028..9734d629c 100644 --- a/libraries/PHPExcel/PHPExcel/Style/Color.php +++ b/libraries/PHPExcel/PHPExcel/Style/Color.php @@ -22,7 +22,7 @@ * @package PHPExcel_Style * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -398,7 +398,7 @@ class PHPExcel_Style_Color implements PHPExcel_IComparable public function __clone() { $vars = get_object_vars($this); foreach ($vars as $key => $value) { - if (is_object($value)) { + if ((is_object($value)) && ($key != '_parent')) { $this->$key = clone $value; } else { $this->$key = $value; diff --git a/libraries/PHPExcel/PHPExcel/Style/Conditional.php b/libraries/PHPExcel/PHPExcel/Style/Conditional.php index 8ec5f92d2..4602b5348 100644 --- a/libraries/PHPExcel/PHPExcel/Style/Conditional.php +++ b/libraries/PHPExcel/PHPExcel/Style/Conditional.php @@ -22,7 +22,7 @@ * @package PHPExcel_Style * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Style/Fill.php b/libraries/PHPExcel/PHPExcel/Style/Fill.php index 3ebf380c7..1357e47ae 100644 --- a/libraries/PHPExcel/PHPExcel/Style/Fill.php +++ b/libraries/PHPExcel/PHPExcel/Style/Fill.php @@ -22,7 +22,7 @@ * @package PHPExcel_Style * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -391,7 +391,7 @@ class PHPExcel_Style_Fill implements PHPExcel_IComparable public function __clone() { $vars = get_object_vars($this); foreach ($vars as $key => $value) { - if (is_object($value)) { + if ((is_object($value)) && ($key != '_parent')) { $this->$key = clone $value; } else { $this->$key = $value; diff --git a/libraries/PHPExcel/PHPExcel/Style/Font.php b/libraries/PHPExcel/PHPExcel/Style/Font.php index de39cf254..b58dbf53b 100644 --- a/libraries/PHPExcel/PHPExcel/Style/Font.php +++ b/libraries/PHPExcel/PHPExcel/Style/Font.php @@ -22,7 +22,7 @@ * @package PHPExcel_Style * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -609,7 +609,7 @@ class PHPExcel_Style_Font implements PHPExcel_IComparable public function __clone() { $vars = get_object_vars($this); foreach ($vars as $key => $value) { - if (is_object($value)) { + if ((is_object($value)) && ($key != '_parent')) { $this->$key = clone $value; } else { $this->$key = $value; diff --git a/libraries/PHPExcel/PHPExcel/Style/NumberFormat.php b/libraries/PHPExcel/PHPExcel/Style/NumberFormat.php index 9ff1a972b..0f0dcdcdd 100644 --- a/libraries/PHPExcel/PHPExcel/Style/NumberFormat.php +++ b/libraries/PHPExcel/PHPExcel/Style/NumberFormat.php @@ -22,7 +22,7 @@ * @package PHPExcel_Style * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -443,7 +443,7 @@ class PHPExcel_Style_NumberFormat implements PHPExcel_IComparable { $vars = get_object_vars($this); foreach ($vars as $key => $value) { - if (is_object($value)) { + if ((is_object($value)) && ($key != '_parent')) { $this->$key = clone $value; } else { $this->$key = $value; diff --git a/libraries/PHPExcel/PHPExcel/Style/Protection.php b/libraries/PHPExcel/PHPExcel/Style/Protection.php index 1c7070200..29832dabd 100644 --- a/libraries/PHPExcel/PHPExcel/Style/Protection.php +++ b/libraries/PHPExcel/PHPExcel/Style/Protection.php @@ -271,7 +271,7 @@ class PHPExcel_Style_Protection implements PHPExcel_IComparable public function __clone() { $vars = get_object_vars($this); foreach ($vars as $key => $value) { - if (is_object($value)) { + if ((is_object($value)) && ($key != '_parent')) { $this->$key = clone $value; } else { $this->$key = $value; diff --git a/libraries/PHPExcel/PHPExcel/Worksheet.php b/libraries/PHPExcel/PHPExcel/Worksheet.php index dc401fdc9..fb7cc0a30 100644 --- a/libraries/PHPExcel/PHPExcel/Worksheet.php +++ b/libraries/PHPExcel/PHPExcel/Worksheet.php @@ -22,7 +22,7 @@ * @package PHPExcel_Worksheet * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -2180,9 +2180,8 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable $highestRow = 1; // Find cells that can be cleaned - foreach ($this->_cellCollection->getCellList() as $coordinate) { - preg_match('/^(\w+)(\d+)$/U',$coordinate,$matches); - list(,$col,$row) = $matches; + foreach ($this->_cellCollection->getCellList() as $coord) { + list($col,$row) = sscanf($coord,'%[A-Z]%d'); $column = PHPExcel_Cell::columnIndexFromString($col); // Determine highest column and row @@ -2468,7 +2467,13 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable } if (is_object($val) || (is_array($val))) { - $this->{$key} = unserialize(serialize($val)); + if ($key == '_cellCollection') { + $newCollection = clone $this->_cellCollection; + $newCollection->copyCellCollection($this); + $this->_cellCollection = $newCollection; + } else { + $this->{$key} = unserialize(serialize($val)); + } } } } diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/BaseDrawing.php b/libraries/PHPExcel/PHPExcel/Worksheet/BaseDrawing.php index e2c65c319..511643bf4 100644 --- a/libraries/PHPExcel/PHPExcel/Worksheet/BaseDrawing.php +++ b/libraries/PHPExcel/PHPExcel/Worksheet/BaseDrawing.php @@ -22,7 +22,7 @@ * @package PHPExcel_Worksheet * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/CellIterator.php b/libraries/PHPExcel/PHPExcel/Worksheet/CellIterator.php index 4a6589f69..630e089d1 100644 --- a/libraries/PHPExcel/PHPExcel/Worksheet/CellIterator.php +++ b/libraries/PHPExcel/PHPExcel/Worksheet/CellIterator.php @@ -22,7 +22,7 @@ * @package PHPExcel_Worksheet * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/ColumnDimension.php b/libraries/PHPExcel/PHPExcel/Worksheet/ColumnDimension.php index f42ef3125..30b00358b 100644 --- a/libraries/PHPExcel/PHPExcel/Worksheet/ColumnDimension.php +++ b/libraries/PHPExcel/PHPExcel/Worksheet/ColumnDimension.php @@ -22,7 +22,7 @@ * @package PHPExcel_Worksheet * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/Drawing.php b/libraries/PHPExcel/PHPExcel/Worksheet/Drawing.php index 7d362c073..537f9f3d3 100644 --- a/libraries/PHPExcel/PHPExcel/Worksheet/Drawing.php +++ b/libraries/PHPExcel/PHPExcel/Worksheet/Drawing.php @@ -22,7 +22,7 @@ * @package PHPExcel_Worksheet_Drawing * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/Drawing/Shadow.php b/libraries/PHPExcel/PHPExcel/Worksheet/Drawing/Shadow.php index f83c26df9..053ab0dd8 100644 --- a/libraries/PHPExcel/PHPExcel/Worksheet/Drawing/Shadow.php +++ b/libraries/PHPExcel/PHPExcel/Worksheet/Drawing/Shadow.php @@ -22,7 +22,7 @@ * @package PHPExcel_Worksheet_Drawing * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooter.php b/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooter.php index 4e3933977..9d2708d6a 100644 --- a/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooter.php +++ b/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooter.php @@ -22,7 +22,7 @@ * @package PHPExcel_Worksheet * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooterDrawing.php b/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooterDrawing.php index 9f2b25d6c..f6142613b 100644 --- a/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooterDrawing.php +++ b/libraries/PHPExcel/PHPExcel/Worksheet/HeaderFooterDrawing.php @@ -22,7 +22,7 @@ * @package PHPExcel_Worksheet * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/MemoryDrawing.php b/libraries/PHPExcel/PHPExcel/Worksheet/MemoryDrawing.php index 0bd37f52e..a43e6a92e 100644 --- a/libraries/PHPExcel/PHPExcel/Worksheet/MemoryDrawing.php +++ b/libraries/PHPExcel/PHPExcel/Worksheet/MemoryDrawing.php @@ -22,7 +22,7 @@ * @package PHPExcel_Worksheet * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/PageMargins.php b/libraries/PHPExcel/PHPExcel/Worksheet/PageMargins.php index 6fc8f1a80..155b976dd 100644 --- a/libraries/PHPExcel/PHPExcel/Worksheet/PageMargins.php +++ b/libraries/PHPExcel/PHPExcel/Worksheet/PageMargins.php @@ -22,7 +22,7 @@ * @package PHPExcel_Worksheet * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/PageSetup.php b/libraries/PHPExcel/PHPExcel/Worksheet/PageSetup.php index ffbd57389..8e615f7d8 100644 --- a/libraries/PHPExcel/PHPExcel/Worksheet/PageSetup.php +++ b/libraries/PHPExcel/PHPExcel/Worksheet/PageSetup.php @@ -22,7 +22,7 @@ * @package PHPExcel_Worksheet * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -179,6 +179,11 @@ class PHPExcel_Worksheet_PageSetup const ORIENTATION_LANDSCAPE = 'landscape'; const ORIENTATION_PORTRAIT = 'portrait'; + /* Print Range Set Method */ + const SETPRINTRANGE_OVERWRITE = 'O'; + const SETPRINTRANGE_INSERT = 'I'; + + /** * Paper size * @@ -261,7 +266,7 @@ class PHPExcel_Worksheet_PageSetup * @var string */ private $_printArea = null; - + /** * First page number * @@ -570,55 +575,197 @@ class PHPExcel_Worksheet_PageSetup } /** - * Get print area + * Get print area * - * @return string + * @param int $index Identifier for a specific print area range if several ranges have been set + * Default behaviour, or a index value of 0, will return all ranges as a comma-separated string + * Otherwise, the specific range identified by the value of $index will be returned + * Print areas are numbered from 1 + * @throws Exception + * @return string */ - public function getPrintArea() { - return $this->_printArea; + public function getPrintArea($index = 0) { + if ($index == 0) { + return $this->_printArea; + } + $printAreas = explode(',',$this->_printArea); + if (isset($printAreas[$index-1])) { + return $printAreas[$index-1]; + } + throw new Exception("Requested Print Area does not exist"); } /** - * Is print area set? + * Is print area set? * - * @return boolean + * @param int $index Identifier for a specific print area range if several ranges have been set + * Default behaviour, or an index value of 0, will identify whether any print range is set + * Otherwise, existence of the range identified by the value of $index will be returned + * Print areas are numbered from 1 + * @return boolean */ - public function isPrintAreaSet() { - return !is_null($this->_printArea); + public function isPrintAreaSet($index = 0) { + if ($index == 0) { + return !is_null($this->_printArea); + } + $printAreas = explode(',',$this->_printArea); + return isset($printAreas[$index-1]); } /** - * Set print area. E.g. 'A1:D10' or 'A1:D10,G5:M20' + * Clear a print area * - * @param string $value - * @throws Exception - * @return PHPExcel_Worksheet_PageSetup + * @param int $index Identifier for a specific print area range if several ranges have been set + * Default behaviour, or an index value of 0, will clear all print ranges that are set + * Otherwise, the range identified by the value of $index will be removed from the series + * Print areas are numbered from 1 + * @return PHPExcel_Worksheet_PageSetup */ - public function setPrintArea($value) { - if (strpos($value,':') === false) { - throw new Exception('Cell coordinate must be a range of cells.'); - } elseif (strpos($value,'$') !== false) { - throw new Exception('Cell coordinate must not be absolute.'); - } else { - $this->_printArea = strtoupper($value); - } + public function clearPrintArea($index = 0) { + if ($index == 0) { + $this->_printArea = NULL; + } else { + $printAreas = explode(',',$this->_printArea); + if (isset($printAreas[$index-1])) { + unset($printAreas[$index-1]); + $this->_printArea = implode(',',$printAreas); + } + } + return $this; } /** - * Set print area + * Set print area. e.g. 'A1:D10' or 'A1:D10,G5:M20' * - * @param int $column1 Column 1 - * @param int $row1 Row 1 - * @param int $column2 Column 2 - * @param int $row2 Row 2 - * @return PHPExcel_Worksheet_PageSetup + * @param string $value + * @param int $index Identifier for a specific print area range allowing several ranges to be set + * When the method is "O"verwrite, then a positive integer index will overwrite that indexed + * entry in the print areas list; a negative index value will identify which entry to + * overwrite working bacward through the print area to the list, with the last entry as -1. + * Specifying an index value of 0, will overwrite all existing print ranges. + * When the method is "I"nsert, then a positive index will insert after that indexed entry in + * the print areas list, while a negative index will insert before the indexed entry. + * Specifying an index value of 0, will always append the new print range at the end of the + * list. + * Print areas are numbered from 1 + * @param string $method Determines the method used when setting multiple print areas + * Default behaviour, or the "O" method, overwrites existing print area + * The "I" method, inserts the new print area before any specified index, or at the end of the list + * @throws Exception + * @return PHPExcel_Worksheet_PageSetup */ - public function setPrintAreaByColumnAndRow($column1, $row1, $column2, $row2) + public function setPrintArea($value, $index = 0, $method = self::SETPRINTRANGE_OVERWRITE) { + if (strpos($value,'!') !== false) { + throw new Exception('Cell coordinate must not specify a worksheet.'); + } elseif (strpos($value,':') === false) { + throw new Exception('Cell coordinate must be a range of cells.'); + } elseif (strpos($value,'$') !== false) { + throw new Exception('Cell coordinate must not be absolute.'); + } + $value = strtoupper($value); + + if ($method == self::SETPRINTRANGE_OVERWRITE) { + if ($index == 0) { + $this->_printArea = $value; + } else { + $printAreas = explode(',',$this->_printArea); + if($index < 0) { + $index = count($printAreas) - abs($index) + 1; + } + if (($index <= 0) || ($index > count($printAreas))) { + throw new Exception('Invalid index for setting print range.'); + } + $printAreas[$index-1] = $value; + $this->_printArea = implode(',',$printAreas); + } + } elseif($method == self::SETPRINTRANGE_INSERT) { + if ($index == 0) { + $this->_printArea .= ($this->_printArea == '') ? $value : ','.$value; + } else { + $printAreas = explode(',',$this->_printArea); + if($index < 0) { + $index = abs($index) - 1; + } + if ($index > count($printAreas)) { + throw new Exception('Invalid index for setting print range.'); + } + $printAreas = array_merge(array_slice($printAreas,0,$index),array($value),array_slice($printAreas,$index)); + $this->_printArea = implode(',',$printAreas); + } + } else { + throw new Exception('Invalid method for setting print range.'); + } + + return $this; + } + + /** + * Add a new print area (e.g. 'A1:D10' or 'A1:D10,G5:M20') to the list of print areas + * + * @param string $value + * @param int $index Identifier for a specific print area range allowing several ranges to be set + * A positive index will insert after that indexed entry in the print areas list, while a + * negative index will insert before the indexed entry. + * Specifying an index value of 0, will always append the new print range at the end of the + * list. + * Print areas are numbered from 1 + * @throws Exception + * @return PHPExcel_Worksheet_PageSetup + */ + public function addPrintArea($value, $index = -1) { + return $this->setPrintArea($value, $index, self::SETPRINTRANGE_INSERT); + } + + /** + * Set print area + * + * @param int $column1 Column 1 + * @param int $row1 Row 1 + * @param int $column2 Column 2 + * @param int $row2 Row 2 + * @param int $index Identifier for a specific print area range allowing several ranges to be set + * When the method is "O"verwrite, then a positive integer index will overwrite that indexed + * entry in the print areas list; a negative index value will identify which entry to + * overwrite working bacward through the print area to the list, with the last entry as -1. + * Specifying an index value of 0, will overwrite all existing print ranges. + * When the method is "I"nsert, then a positive index will insert after that indexed entry in + * the print areas list, while a negative index will insert before the indexed entry. + * Specifying an index value of 0, will always append the new print range at the end of the + * list. + * Print areas are numbered from 1 + * @param string $method Determines the method used when setting multiple print areas + * Default behaviour, or the "O" method, overwrites existing print area + * The "I" method, inserts the new print area before any specified index, or at the end of the list + * @throws Exception + * @return PHPExcel_Worksheet_PageSetup + */ + public function setPrintAreaByColumnAndRow($column1, $row1, $column2, $row2, $index = 0, $method = self::SETPRINTRANGE_OVERWRITE) { - return $this->setPrintArea(PHPExcel_Cell::stringFromColumnIndex($column1) . $row1 . ':' . PHPExcel_Cell::stringFromColumnIndex($column2) . $row2); + return $this->setPrintArea(PHPExcel_Cell::stringFromColumnIndex($column1) . $row1 . ':' . PHPExcel_Cell::stringFromColumnIndex($column2) . $row2, $index, $method); } - + + /** + * Add a new print area to the list of print areas + * + * @param int $column1 Column 1 + * @param int $row1 Row 1 + * @param int $column2 Column 2 + * @param int $row2 Row 2 + * @param int $index Identifier for a specific print area range allowing several ranges to be set + * A positive index will insert after that indexed entry in the print areas list, while a + * negative index will insert before the indexed entry. + * Specifying an index value of 0, will always append the new print range at the end of the + * list. + * Print areas are numbered from 1 + * @throws Exception + * @return PHPExcel_Worksheet_PageSetup + */ + public function addPrintAreaByColumnAndRow($column1, $row1, $column2, $row2, $index = -1) + { + return $this->setPrintArea(PHPExcel_Cell::stringFromColumnIndex($column1) . $row1 . ':' . PHPExcel_Cell::stringFromColumnIndex($column2) . $row2, $index, self::SETPRINTRANGE_INSERT); + } + /** * Get first page number * @@ -627,7 +774,7 @@ class PHPExcel_Worksheet_PageSetup public function getFirstPageNumber() { return $this->_firstPageNumber; } - + /** * Set first page number * @@ -638,7 +785,7 @@ class PHPExcel_Worksheet_PageSetup $this->_firstPageNumber = $value; return $this; } - + /** * Reset first page number * diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/Protection.php b/libraries/PHPExcel/PHPExcel/Worksheet/Protection.php index 0e7bc4f95..f60a265d6 100644 --- a/libraries/PHPExcel/PHPExcel/Worksheet/Protection.php +++ b/libraries/PHPExcel/PHPExcel/Worksheet/Protection.php @@ -22,7 +22,7 @@ * @package PHPExcel_Worksheet * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/Row.php b/libraries/PHPExcel/PHPExcel/Worksheet/Row.php index c5cb33a1a..7311721c6 100644 --- a/libraries/PHPExcel/PHPExcel/Worksheet/Row.php +++ b/libraries/PHPExcel/PHPExcel/Worksheet/Row.php @@ -22,7 +22,7 @@ * @package PHPExcel_Worksheet * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/RowDimension.php b/libraries/PHPExcel/PHPExcel/Worksheet/RowDimension.php index 8b1277d9c..153024f1a 100644 --- a/libraries/PHPExcel/PHPExcel/Worksheet/RowDimension.php +++ b/libraries/PHPExcel/PHPExcel/Worksheet/RowDimension.php @@ -22,7 +22,7 @@ * @package PHPExcel_Worksheet * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/RowIterator.php b/libraries/PHPExcel/PHPExcel/Worksheet/RowIterator.php index d21bd5128..e0f91fcfe 100644 --- a/libraries/PHPExcel/PHPExcel/Worksheet/RowIterator.php +++ b/libraries/PHPExcel/PHPExcel/Worksheet/RowIterator.php @@ -22,7 +22,7 @@ * @package PHPExcel_Worksheet * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Worksheet/SheetView.php b/libraries/PHPExcel/PHPExcel/Worksheet/SheetView.php index c7e04ae05..fdfe00146 100644 --- a/libraries/PHPExcel/PHPExcel/Worksheet/SheetView.php +++ b/libraries/PHPExcel/PHPExcel/Worksheet/SheetView.php @@ -22,7 +22,7 @@ * @package PHPExcel_Worksheet * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/WorksheetIterator.php b/libraries/PHPExcel/PHPExcel/WorksheetIterator.php index f6f6a6f99..87f8b2955 100644 --- a/libraries/PHPExcel/PHPExcel/WorksheetIterator.php +++ b/libraries/PHPExcel/PHPExcel/WorksheetIterator.php @@ -22,7 +22,7 @@ * @package PHPExcel * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Writer/CSV.php b/libraries/PHPExcel/PHPExcel/Writer/CSV.php index 03e1a6ef9..765244dcd 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/CSV.php +++ b/libraries/PHPExcel/PHPExcel/Writer/CSV.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -106,6 +106,8 @@ class PHPExcel_Writer_CSV implements PHPExcel_Writer_IWriter { // Fetch sheet $sheet = $this->_phpExcel->getSheet($this->_sheetIndex); + $saveDebugLog = PHPExcel_Calculation::getInstance()->writeDebugLog; + PHPExcel_Calculation::getInstance()->writeDebugLog = false; $saveArrayReturnType = PHPExcel_Calculation::getArrayReturnType(); PHPExcel_Calculation::setArrayReturnType(PHPExcel_Calculation::RETURN_ARRAY_AS_VALUE); @@ -132,6 +134,7 @@ class PHPExcel_Writer_CSV implements PHPExcel_Writer_IWriter { fclose($fileHandle); PHPExcel_Calculation::setArrayReturnType($saveArrayReturnType); + PHPExcel_Calculation::getInstance()->writeDebugLog = $saveDebugLog; } /** diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007.php index 1963ab972..b9f7464e6 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007.php +++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer_Excel2007 * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -201,6 +201,8 @@ class PHPExcel_Writer_Excel2007 implements PHPExcel_Writer_IWriter } } + $saveDebugLog = PHPExcel_Calculation::getInstance()->writeDebugLog; + PHPExcel_Calculation::getInstance()->writeDebugLog = false; $saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType(); PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL); @@ -331,6 +333,7 @@ class PHPExcel_Writer_Excel2007 implements PHPExcel_Writer_IWriter } PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType); + PHPExcel_Calculation::getInstance()->writeDebugLog = $saveDebugLog; // Close file if ($objZip->close() === false) { diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Comments.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Comments.php index ddb795837..3a6ad37ce 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Comments.php +++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Comments.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer_Excel2007 * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/ContentTypes.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/ContentTypes.php index d27e38615..84de96d5d 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/ContentTypes.php +++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/ContentTypes.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer_Excel2007 * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/DocProps.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/DocProps.php index 68e0f04bc..21fc3a4ad 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/DocProps.php +++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/DocProps.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer_Excel2007 * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Drawing.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Drawing.php index 670b8354a..f1551dac9 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Drawing.php +++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Drawing.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer_Excel2007 * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Rels.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Rels.php index d133621a9..7ffdd6daa 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Rels.php +++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Rels.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer_Excel2007 * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/StringTable.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/StringTable.php index 8ab1c5295..98a3c45d4 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/StringTable.php +++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/StringTable.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer_Excel2007 * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Style.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Style.php index dd7621d22..5354936ac 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Style.php +++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Style.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer_Excel2007 * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Theme.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Theme.php index 9dbee1604..e8ffe7b2d 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Theme.php +++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Theme.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer_Excel2007 * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Workbook.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Workbook.php index 245fb8727..d2c51fbc4 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Workbook.php +++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Workbook.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer_Excel2007 * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Worksheet.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Worksheet.php index 411b42adb..327e542eb 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Worksheet.php +++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/Worksheet.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer_Excel2007 * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -1002,7 +1002,18 @@ class PHPExcel_Writer_Excel2007_Worksheet extends PHPExcel_Writer_Excel2007_Writ break; case 'f': // Formula - $objWriter->writeElement('f', substr($pCell->getValue(), 1)); + $attributes = $pCell->getFormulaAttributes(); + if($attributes['t'] == 'array') { + $objWriter->startElement('f'); + $objWriter->writeAttribute('t', 'array'); + $objWriter->writeAttribute('ref', $pCell->getCoordinate()); + $objWriter->writeAttribute('aca', '1'); + $objWriter->writeAttribute('ca', '1'); + $objWriter->text(substr($pCell->getValue(), 1)); + $objWriter->endElement(); + } else { + $objWriter->writeElement('f', substr($pCell->getValue(), 1)); + } if ($this->getParentWriter()->getOffice2003Compatibility() === false) { if ($this->getParentWriter()->getPreCalculateFormulas()) { $calculatedValue = $pCell->getCalculatedValue(); diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/WriterPart.php b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/WriterPart.php index c1532378e..97d56e109 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/Excel2007/WriterPart.php +++ b/libraries/PHPExcel/PHPExcel/Writer/Excel2007/WriterPart.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer_Excel2007 * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5.php index 0bb5571a8..4d69d91ff 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/Excel5.php +++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer_Excel5 * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -91,6 +91,13 @@ class PHPExcel_Writer_Excel5 implements PHPExcel_Writer_IWriter */ private $_parser; + /** + * Identifier clusters for drawings. Used in MSODRAWINGGROUP record. + * + * @var array + */ + private $_IDCLs; + /** * Create a new PHPExcel_Writer_Excel5 @@ -120,6 +127,8 @@ class PHPExcel_Writer_Excel5 implements PHPExcel_Writer_IWriter // garbage collect $this->_phpExcel->garbageCollect(); + $saveDebugLog = PHPExcel_Calculation::getInstance()->writeDebugLog; + PHPExcel_Calculation::getInstance()->writeDebugLog = false; $saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType(); PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL); @@ -130,6 +139,21 @@ class PHPExcel_Writer_Excel5 implements PHPExcel_Writer_IWriter $this->_writerWorkbook = new PHPExcel_Writer_Excel5_Workbook($this->_phpExcel, $this->_BIFF_version, $this->_str_total, $this->_str_unique, $this->_str_table, $this->_colors, $this->_parser); + // Initialise worksheet writers + $countSheets = $this->_phpExcel->getSheetCount(); + for ($i = 0; $i < $countSheets; ++$i) { + $this->_writerWorksheets[$i] = new PHPExcel_Writer_Excel5_Worksheet($this->_BIFF_version, + $this->_str_total, $this->_str_unique, + $this->_str_table, $this->_colors, + $this->_parser, + $this->_preCalculateFormulas, + $this->_phpExcel->getSheet($i)); + } + + // build Escher objects. Escher objects for workbooks needs to be build before Escher object for workbook. + $this->_buildWorksheetEschers(); + $this->_buildWorkbookEscher(); + // add 15 identical cell style Xfs // for now, we use the first cellXf instead of cellStyleXf $cellXfCollection = $this->_phpExcel->getCellXfCollection(); @@ -146,19 +170,10 @@ class PHPExcel_Writer_Excel5 implements PHPExcel_Writer_IWriter $workbookStreamName = ($this->_BIFF_version == 0x0600) ? 'Workbook' : 'Book'; $OLE = new PHPExcel_Shared_OLE_PPS_File(PHPExcel_Shared_OLE::Asc2Ucs($workbookStreamName)); - // Initialise worksheet writers - $countSheets = $this->_phpExcel->getSheetCount(); // Write the worksheet streams before the global workbook stream, // because the byte sizes of these are needed in the global workbook stream $worksheetSizes = array(); for ($i = 0; $i < $countSheets; ++$i) { - $this->_writerWorksheets[$i] = new PHPExcel_Writer_Excel5_Worksheet($this->_BIFF_version, - $this->_str_total, $this->_str_unique, - $this->_str_table, $this->_colors, - $this->_parser, - $this->_preCalculateFormulas, - $this->_phpExcel->getSheet($i)); - $this->_writerWorksheets[$i]->close(); $worksheetSizes[] = $this->_writerWorksheets[$i]->_datasize; } @@ -176,6 +191,7 @@ class PHPExcel_Writer_Excel5 implements PHPExcel_Writer_IWriter $res = $root->save($pFilename); PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType); + PHPExcel_Calculation::getInstance()->writeDebugLog = $saveDebugLog; } /** @@ -208,4 +224,253 @@ class PHPExcel_Writer_Excel5 implements PHPExcel_Writer_IWriter $this->_preCalculateFormulas = $pValue; } + private function _buildWorksheetEschers() + { + // 1-based index to BstoreContainer + $blipIndex = 0; + + foreach ($this->_phpExcel->getAllsheets() as $sheet) { + // sheet index + $sheetIndex = $sheet->getParent()->getIndex($sheet); + + $escher = null; + + // check if there are any shapes for this sheet + if (count($sheet->getDrawingCollection()) == 0) { + continue; + } + + // create intermediate Escher object + $escher = new PHPExcel_Shared_Escher(); + + // dgContainer + $dgContainer = new PHPExcel_Shared_Escher_DgContainer(); + + // set the drawing index (we use sheet index + 1) + $dgId = $sheet->getParent()->getIndex($sheet) + 1; + $dgContainer->setDgId($dgId); + $escher->setDgContainer($dgContainer); + + // spgrContainer + $spgrContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer(); + $dgContainer->setSpgrContainer($spgrContainer); + + // add one shape which is the group shape + $spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer(); + $spContainer->setSpgr(true); + $spContainer->setSpType(0); + $spContainer->setSpId(($sheet->getParent()->getIndex($sheet) + 1) << 10); + $spgrContainer->addChild($spContainer); + + // add the shapes + + $countShapes[$sheetIndex] = 0; // count number of shapes (minus group shape), in sheet + + foreach ($sheet->getDrawingCollection() as $drawing) { + ++$blipIndex; + + ++$countShapes[$sheetIndex]; + + // add the shape + $spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer(); + + // set the shape type + $spContainer->setSpType(0x004B); + + // set the shape index (we combine 1-based sheet index and $countShapes to create unique shape index) + $reducedSpId = $countShapes[$sheetIndex]; + $spId = $reducedSpId + | ($sheet->getParent()->getIndex($sheet) + 1) << 10; + $spContainer->setSpId($spId); + + // keep track of last reducedSpId + $lastReducedSpId = $reducedSpId; + + // keep track of last spId + $lastSpId = $spId; + + // set the BLIP index + $spContainer->setOPT(0x4104, $blipIndex); + + // set coordinates and offsets, client anchor + $coordinates = $drawing->getCoordinates(); + $offsetX = $drawing->getOffsetX(); + $offsetY = $drawing->getOffsetY(); + $width = $drawing->getWidth(); + $height = $drawing->getHeight(); + + $twoAnchor = PHPExcel_Shared_Excel5::oneAnchor2twoAnchor($sheet, $coordinates, $offsetX, $offsetY, $width, $height); + + $spContainer->setStartCoordinates($twoAnchor['startCoordinates']); + $spContainer->setStartOffsetX($twoAnchor['startOffsetX']); + $spContainer->setStartOffsetY($twoAnchor['startOffsetY']); + $spContainer->setEndCoordinates($twoAnchor['endCoordinates']); + $spContainer->setEndOffsetX($twoAnchor['endOffsetX']); + $spContainer->setEndOffsetY($twoAnchor['endOffsetY']); + + $spgrContainer->addChild($spContainer); + } + + // identifier clusters, used for workbook Escher object + $this->_IDCLs[$dgId] = $lastReducedSpId; + + // set last shape index + $dgContainer->setLastSpId($lastSpId); + + // set the Escher object + $this->_writerWorksheets[$sheetIndex]->setEscher($escher); + } + } + + /** + * Build the Escher object corresponding to the MSODRAWINGGROUP record + */ + private function _buildWorkbookEscher() + { + $escher = null; + + // any drawings in this workbook? + $found = false; + foreach ($this->_phpExcel->getAllSheets() as $sheet) { + if (count($sheet->getDrawingCollection()) > 0) { + $found = true; + } + } + + // nothing to do if there are no drawings + if (!$found) { + return; + } + + // if we reach here, then there are drawings in the workbook + $escher = new PHPExcel_Shared_Escher(); + + // dggContainer + $dggContainer = new PHPExcel_Shared_Escher_DggContainer(); + $escher->setDggContainer($dggContainer); + + // set IDCLs (identifier clusters) + $dggContainer->setIDCLs($this->_IDCLs); + + // this loop is for determining maximum shape identifier of all drawing + $spIdMax = 0; + $totalCountShapes = 0; + $countDrawings = 0; + + foreach ($this->_phpExcel->getAllsheets() as $sheet) { + $sheetCountShapes = 0; // count number of shapes (minus group shape), in sheet + + if (count($sheet->getDrawingCollection()) > 0) { + ++$countDrawings; + + foreach ($sheet->getDrawingCollection() as $drawing) { + ++$sheetCountShapes; + ++$totalCountShapes; + + $spId = $sheetCountShapes + | ($this->_phpExcel->getIndex($sheet) + 1) << 10; + $spIdMax = max($spId, $spIdMax); + } + } + } + + $dggContainer->setSpIdMax($spIdMax + 1); + $dggContainer->setCDgSaved($countDrawings); + $dggContainer->setCSpSaved($totalCountShapes + $countDrawings); // total number of shapes incl. one group shapes per drawing + + // bstoreContainer + $bstoreContainer = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer(); + $dggContainer->setBstoreContainer($bstoreContainer); + + // the BSE's (all the images) + foreach ($this->_phpExcel->getAllsheets() as $sheet) { + foreach ($sheet->getDrawingCollection() as $drawing) { + if ($drawing instanceof PHPExcel_Worksheet_Drawing) { + + $filename = $drawing->getPath(); + + list($imagesx, $imagesy, $imageFormat) = getimagesize($filename); + + switch ($imageFormat) { + + case 1: // GIF, not supported by BIFF8, we convert to PNG + $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG; + $imageResource = imagecreatefromgif($filename); + ob_start(); + imagepng($imageResource); + $blipData = ob_get_contents(); + ob_end_clean(); + break; + + case 2: // JPEG + $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG; + $blipData = file_get_contents($filename); + break; + + case 3: // PNG + $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG; + $blipData = file_get_contents($filename); + break; + + case 6: // Windows DIB (BMP), we convert to PNG + $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG; + $imageResource = PHPExcel_Shared_Drawing::imagecreatefrombmp($filename); + ob_start(); + imagepng($imageResource); + $blipData = ob_get_contents(); + ob_end_clean(); + break; + + default: continue 2; + + } + + $blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip(); + $blip->setData($blipData); + + $BSE = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE(); + $BSE->setBlipType($blipType); + $BSE->setBlip($blip); + + $bstoreContainer->addBSE($BSE); + + } else if ($drawing instanceof PHPExcel_Worksheet_MemoryDrawing) { + + switch ($drawing->getRenderingFunction()) { + + case PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG: + $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG; + $renderingFunction = 'imagejpeg'; + break; + + case PHPExcel_Worksheet_MemoryDrawing::RENDERING_GIF: + case PHPExcel_Worksheet_MemoryDrawing::RENDERING_PNG: + case PHPExcel_Worksheet_MemoryDrawing::RENDERING_DEFAULT: + $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG; + $renderingFunction = 'imagepng'; + break; + + } + + ob_start(); + call_user_func($renderingFunction, $drawing->getImageResource()); + $blipData = ob_get_contents(); + ob_end_clean(); + + $blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip(); + $blip->setData($blipData); + + $BSE = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE(); + $BSE->setBlipType($blipType); + $BSE->setBlip($blip); + + $bstoreContainer->addBSE($BSE); + } + } + } + + // Set the Escher object + $this->_writerWorkbook->setEscher($escher); + } + } diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5/BIFFwriter.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5/BIFFwriter.php index 2c0a2d18c..e758aeb20 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/Excel5/BIFFwriter.php +++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5/BIFFwriter.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer_Excel5 * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ // Original file header of PEAR::Spreadsheet_Excel_Writer_BIFFwriter (used as the base for this class): diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Escher.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Escher.php index 402bd19ff..3c9c29f8e 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Escher.php +++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Escher.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer_Excel5 * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -106,9 +106,12 @@ class PHPExcel_Writer_Excel5_Escher , $this->_object->getCSpSaved() , $this->_object->getCDgSaved() // count total number of drawings saved ); + // add file identifier clusters (one per drawing) - for ($i = 0; $i < $this->_object->getCDgSaved(); ++$i) { - $dggData .= pack('VV', 0, 0); + $IDCLs = $this->_object->getIDCLs(); + + foreach ($IDCLs as $dgId => $maxReducedSpId) { + $dggData .= pack('VV', $dgId, $maxReducedSpId + 1); } $header = pack('vvV', $recVerInstance, $recType, strlen($dggData)); diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Font.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Font.php index bb4d2019c..29280702b 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Font.php +++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Font.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer_Excel5 * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Parser.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Parser.php index cef650fdf..eb9891e34 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Parser.php +++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Parser.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer_Excel5 * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ // Original file header of PEAR::Spreadsheet_Excel_Writer_Parser (used as the base for this class): @@ -1148,6 +1148,9 @@ class PHPExcel_Writer_Excel5_Parser case "<>": return $token; break; + case "^": + return $token; + break; default: // if it's a reference A1 or $A$1 or $A1 or A$1 if (preg_match('/^\$?[A-Ia-i]?[A-Za-z]\$?[0-9]+$/',$token) and @@ -1288,19 +1291,30 @@ class PHPExcel_Writer_Excel5_Parser $result2 = $this->_expression(); $result = $this->_createTree('ptgUminus', $result2, ''); return $result; + } elseif ($this->_current_token == "+") { + // catch "+" Term + $this->_advance(); + $result2 = $this->_expression(); + $result = $this->_createTree('ptgUplus', $result2, ''); + return $result; } $result = $this->_term(); while (($this->_current_token == "+") or - ($this->_current_token == "-")) { + ($this->_current_token == "-") or + ($this->_current_token == "^")) { /**/ if ($this->_current_token == "+") { $this->_advance(); $result2 = $this->_term(); $result = $this->_createTree('ptgAdd', $result, $result2); - } else { + } elseif ($this->_current_token == "-") { $this->_advance(); $result2 = $this->_term(); $result = $this->_createTree('ptgSub', $result, $result2); + } else { + $this->_advance(); + $result2 = $this->_term(); + $result = $this->_createTree('ptgPower', $result, $result2); } } return $result; diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Workbook.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Workbook.php index d26ddee2b..6e517e6b2 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Workbook.php +++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Workbook.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer_Excel5 * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ // Original file header of PEAR::Spreadsheet_Excel_Writer_Workbook (used as the base for this class): @@ -182,6 +182,13 @@ class PHPExcel_Writer_Excel5_Workbook extends PHPExcel_Writer_Excel5_BIFFwriter */ private $_colors; + /** + * Escher object corresponding to MSODRAWINGGROUP + * + * @var PHPExcel_Shared_Escher + */ + private $_escher; + /** * Class constructor @@ -1400,143 +1407,9 @@ class PHPExcel_Writer_Excel5_Workbook extends PHPExcel_Writer_Excel5_BIFFwriter */ private function _writeMsoDrawingGroup() { - // any drawings in this workbook? - $found = false; - foreach ($this->_phpExcel->getAllSheets() as $sheet) { - if (count($sheet->getDrawingCollection()) > 0) { - $found = true; - } - } - - // if there are drawings, then we need to write MSODRAWINGGROUP record - if ($found) { - - // create intermediate Escher object - $escher = new PHPExcel_Shared_Escher(); - - // dggContainer - $dggContainer = new PHPExcel_Shared_Escher_DggContainer(); - $escher->setDggContainer($dggContainer); - - // this loop is for determining maximum shape identifier of all drawing - $spIdMax = 0; - $totalCountShapes = 0; - $countDrawings = 0; - - foreach ($this->_phpExcel->getAllsheets() as $sheet) { - $sheetCountShapes = 0; // count number of shapes (minus group shape), in sheet - - if (count($sheet->getDrawingCollection()) > 0) { - ++$countDrawings; - - foreach ($sheet->getDrawingCollection() as $drawing) { - ++$sheetCountShapes; - ++$totalCountShapes; - - $spId = $sheetCountShapes - | ($this->_phpExcel->getIndex($sheet) + 1) << 10; - $spIdMax = max($spId, $spIdMax); - } - } - } - - $dggContainer->setSpIdMax($spIdMax + 1); - $dggContainer->setCDgSaved($countDrawings); - $dggContainer->setCSpSaved($totalCountShapes + $countDrawings); // total number of shapes incl. one group shapes per drawing - - // bstoreContainer - $bstoreContainer = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer(); - $dggContainer->setBstoreContainer($bstoreContainer); - - // the BSE's (all the images) - foreach ($this->_phpExcel->getAllsheets() as $sheet) { - foreach ($sheet->getDrawingCollection() as $drawing) { - if ($drawing instanceof PHPExcel_Worksheet_Drawing) { - - $filename = $drawing->getPath(); - - list($imagesx, $imagesy, $imageFormat) = getimagesize($filename); - - switch ($imageFormat) { - - case 1: // GIF, not supported by BIFF8, we convert to PNG - $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG; - $imageResource = imagecreatefromgif($filename); - ob_start(); - imagepng($imageResource); - $blipData = ob_get_contents(); - ob_end_clean(); - break; - - case 2: // JPEG - $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG; - $blipData = file_get_contents($filename); - break; - - case 3: // PNG - $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG; - $blipData = file_get_contents($filename); - break; - - case 6: // Windows DIB (BMP), we convert to PNG - $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG; - $imageResource = PHPExcel_Shared_Drawing::imagecreatefrombmp($filename); - ob_start(); - imagepng($imageResource); - $blipData = ob_get_contents(); - ob_end_clean(); - break; - - default: continue 2; - - } - - $blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip(); - $blip->setData($blipData); - - $BSE = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE(); - $BSE->setBlipType($blipType); - $BSE->setBlip($blip); - - $bstoreContainer->addBSE($BSE); - - } else if ($drawing instanceof PHPExcel_Worksheet_MemoryDrawing) { - - switch ($drawing->getRenderingFunction()) { - - case PHPExcel_Worksheet_MemoryDrawing::RENDERING_JPEG: - $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_JPEG; - $renderingFunction = 'imagejpeg'; - break; - - case PHPExcel_Worksheet_MemoryDrawing::RENDERING_GIF: - case PHPExcel_Worksheet_MemoryDrawing::RENDERING_PNG: - case PHPExcel_Worksheet_MemoryDrawing::RENDERING_DEFAULT: - $blipType = PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE::BLIPTYPE_PNG; - $renderingFunction = 'imagepng'; - break; - - } - - ob_start(); - call_user_func($renderingFunction, $drawing->getImageResource()); - $blipData = ob_get_contents(); - ob_end_clean(); - - $blip = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE_Blip(); - $blip->setData($blipData); - - $BSE = new PHPExcel_Shared_Escher_DggContainer_BstoreContainer_BSE(); - $BSE->setBlipType($blipType); - $BSE->setBlip($blip); - - $bstoreContainer->addBSE($BSE); - } - } - } - - // write the Escher stream from the intermediate Escher object - $writer = new PHPExcel_Writer_Excel5_Escher($escher); + // write the Escher stream if necessary + if (isset($this->_escher)) { + $writer = new PHPExcel_Writer_Excel5_Escher($this->_escher); $data = $writer->close(); $record = 0x00EB; @@ -1544,7 +1417,30 @@ class PHPExcel_Writer_Excel5_Workbook extends PHPExcel_Writer_Excel5_BIFFwriter $header = pack("vv", $record, $length); return $this->writeData($header . $data); + + } else { + return ''; } } + /** + * Get Escher object + * + * @return PHPExcel_Shared_Escher + */ + public function getEscher() + { + return $this->_escher; + } + + /** + * Set Escher object + * + * @param PHPExcel_Shared_Escher $pValue + */ + public function setEscher(PHPExcel_Shared_Escher $pValue = null) + { + $this->_escher = $pValue; + } + } diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Worksheet.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Worksheet.php index 646101a53..0dd2b003b 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Worksheet.php +++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Worksheet.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer_Excel5 * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ // Original file header of PEAR::Spreadsheet_Excel_Writer_Worksheet (used as the base for this class): @@ -185,6 +185,13 @@ class PHPExcel_Writer_Excel5_Worksheet extends PHPExcel_Writer_Excel5_BIFFwriter */ private $_countCellStyleXfs; + /** + * Escher object corresponding to MSODRAWING + * + * @var PHPExcel_Shared_Escher + */ + private $_escher; + /** * Constructor * @@ -2693,143 +2700,83 @@ class PHPExcel_Writer_Excel5_Worksheet extends PHPExcel_Writer_Excel5_BIFFwriter $this->_append($header . $data); } + /** + * Get Escher object + * + * @return PHPExcel_Shared_Escher + */ + public function getEscher() + { + return $this->_escher; + } + + /** + * Set Escher object + * + * @param PHPExcel_Shared_Escher $pValue + */ + public function setEscher(PHPExcel_Shared_Escher $pValue = null) + { + $this->_escher = $pValue; + } + /** * Write MSODRAWING record */ private function _writeMsoDrawing() { - // check if there are any shapes for this sheet - if (count($this->_phpSheet->getDrawingCollection()) == 0) { - return; - } + // write the Escher stream if necessary + if (isset($this->_escher)) { + $writer = new PHPExcel_Writer_Excel5_Escher($this->_escher); + $data = $writer->close(); + $spOffsets = $writer->getSpOffsets(); - // create intermediate Escher object - $escher = new PHPExcel_Shared_Escher(); + // write the neccesary MSODRAWING, OBJ records - // dgContainer - $dgContainer = new PHPExcel_Shared_Escher_DgContainer(); + // split the Escher stream + $spOffsets[0] = 0; + $nm = count($spOffsets) - 1; // number of shapes excluding first shape + for ($i = 1; $i <= $nm; ++$i) { + // MSODRAWING record + $record = 0x00EC; // Record identifier - // set the drawing index (we use sheet index + 1) - $dgContainer->setDgId($this->_phpSheet->getParent()->getIndex($this->_phpSheet) + 1); - $escher->setDgContainer($dgContainer); + // chunk of Escher stream for one shape - // spgrContainer - $spgrContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer(); - $dgContainer->setSpgrContainer($spgrContainer); + $dataChunk = substr($data, $spOffsets[$i -1], $spOffsets[$i] - $spOffsets[$i - 1]); - // add one shape which is the group shape - $spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer(); - $spContainer->setSpgr(true); - $spContainer->setSpType(0); - $spContainer->setSpId(($this->_phpSheet->getParent()->getIndex($this->_phpSheet) + 1) << 10); - $spgrContainer->addChild($spContainer); + $length = strlen($dataChunk); + $header = pack("vv", $record, $length); - // add the shapes + $this->_append($header . $dataChunk); - // outer loop is for determining BSE index - $blipIndex = 0; // 1-based index to BstoreContainer + // OBJ record + $record = 0x005D; // record identifier + $objData = ''; - $countShapes = 0; // count number of shapes (minus group shape), in this sheet + // ftCmo + $objData .= + pack('vvvvvVVV' + , 0x0015 // 0x0015 = ftCmo + , 0x0012 // length of ftCmo data + , 0x0008 // object type, 0x0008 = picture + , $i // object id number, Excel seems to use 1-based index, local for the sheet + , 0x6011 // option flags, 0x6011 is what OpenOffice.org uses + , 0 // reserved + , 0 // reserved + , 0 // reserved + ); + // ftEnd + $objData .= + pack('vv' + , 0x0000 // 0x0000 = ftEnd + , 0x0000 // length of ftEnd data + ); - foreach ($this->_phpSheet->getParent()->getAllsheets() as $sheet) { - foreach ($sheet->getDrawingCollection() as $drawing) { - ++$blipIndex; - - if ($sheet === $this->_phpSheet) { - ++$countShapes; - - // add the shape - $spContainer = new PHPExcel_Shared_Escher_DgContainer_SpgrContainer_SpContainer(); - - // set the shape type - $spContainer->setSpType(0x004B); - - // set the shape index (we combine 1-based sheet index and $countShapes to create unique shape index) - $spId = $countShapes - | ($this->_phpSheet->getParent()->getIndex($this->_phpSheet) + 1) << 10; - $spContainer->setSpId($spId); - - // keep track of last spId - $lastSpId = $spId; - - // set the BLIP index - $spContainer->setOPT(0x4104, $blipIndex); - - // set coordinates and offsets, client anchor - $coordinates = $drawing->getCoordinates(); - $offsetX = $drawing->getOffsetX(); - $offsetY = $drawing->getOffsetY(); - $width = $drawing->getWidth(); - $height = $drawing->getHeight(); - - $twoAnchor = PHPExcel_Shared_Excel5::oneAnchor2twoAnchor($this->_phpSheet, $coordinates, $offsetX, $offsetY, $width, $height); - - $spContainer->setStartCoordinates($twoAnchor['startCoordinates']); - $spContainer->setStartOffsetX($twoAnchor['startOffsetX']); - $spContainer->setStartOffsetY($twoAnchor['startOffsetY']); - $spContainer->setEndCoordinates($twoAnchor['endCoordinates']); - $spContainer->setEndOffsetX($twoAnchor['endOffsetX']); - $spContainer->setEndOffsetY($twoAnchor['endOffsetY']); - - $spgrContainer->addChild($spContainer); - } + $length = strlen($objData); + $header = pack('vv', $record, $length); + $this->_append($header . $objData); } } - - // set last shape index - $dgContainer->setLastSpId($lastSpId); - - // write the Escher stream - $writer = new PHPExcel_Writer_Excel5_Escher($escher); - $data = $writer->close(); - $spOffsets = $writer->getSpOffsets(); - - // write the neccesary MSODRAWING, OBJ records - - // split the Escher stream - $spOffsets[0] = 0; - $nm = count($spOffsets) - 1; // number of shapes excluding first shape - for ($i = 1; $i <= $nm; ++$i) { - // MSODRAWING record - $record = 0x00EC; // Record identifier - - // chunk of Escher stream for one shape - - $dataChunk = substr($data, $spOffsets[$i -1], $spOffsets[$i] - $spOffsets[$i - 1]); - - $length = strlen($dataChunk); - $header = pack("vv", $record, $length); - - $this->_append($header . $dataChunk); - - // OBJ record - $record = 0x005D; // record identifier - $objData = ''; - - // ftCmo - $objData .= - pack('vvvvvVVV' - , 0x0015 // 0x0015 = ftCmo - , 0x0012 // length of ftCmo data - , 0x0008 // object type, 0x0008 = picture - , $i // object id number, Excel seems to use 1-based index, local for the sheet - , 0x6011 // option flags, 0x6011 is what OpenOffice.org uses - , 0 // reserved - , 0 // reserved - , 0 // reserved - ); - // ftEnd - $objData .= - pack('vv' - , 0x0000 // 0x0000 = ftEnd - , 0x0000 // length of ftEnd data - ); - - $length = strlen($objData); - $header = pack('vv', $record, $length); - $this->_append($header . $objData); - } - } /** @@ -3006,4 +2953,4 @@ class PHPExcel_Writer_Excel5_Worksheet extends PHPExcel_Writer_Excel5_BIFFwriter return 0; } -} +} \ No newline at end of file diff --git a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Xf.php b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Xf.php index 9246a341e..27632f330 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/Excel5/Xf.php +++ b/libraries/PHPExcel/PHPExcel/Writer/Excel5/Xf.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer_Excel5 * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ // Original file header of PEAR::Spreadsheet_Excel_Writer_Format (used as the base for this class): diff --git a/libraries/PHPExcel/PHPExcel/Writer/HTML.php b/libraries/PHPExcel/PHPExcel/Writer/HTML.php index 3c892cfba..b6667f5bf 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/HTML.php +++ b/libraries/PHPExcel/PHPExcel/Writer/HTML.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -152,6 +152,8 @@ class PHPExcel_Writer_HTML implements PHPExcel_Writer_IWriter { // garbage collect $this->_phpExcel->garbageCollect(); + $saveDebugLog = PHPExcel_Calculation::getInstance()->writeDebugLog; + PHPExcel_Calculation::getInstance()->writeDebugLog = false; $saveArrayReturnType = PHPExcel_Calculation::getArrayReturnType(); PHPExcel_Calculation::setArrayReturnType(PHPExcel_Calculation::RETURN_ARRAY_AS_VALUE); @@ -182,6 +184,7 @@ class PHPExcel_Writer_HTML implements PHPExcel_Writer_IWriter { fclose($fileHandle); PHPExcel_Calculation::setArrayReturnType($saveArrayReturnType); + PHPExcel_Calculation::getInstance()->writeDebugLog = $saveDebugLog; } /** @@ -330,7 +333,7 @@ class PHPExcel_Writer_HTML implements PHPExcel_Writer_IWriter { // row min,max $rowMin = $dimension[0][1]; $rowMax = $dimension[1][1]; - + // calculate start of , $tbodyStart = $rowMin; $tbodyEnd = $rowMax; @@ -338,7 +341,7 @@ class PHPExcel_Writer_HTML implements PHPExcel_Writer_IWriter { $theadEnd = 0; // default: no if ($sheet->getPageSetup()->isRowsToRepeatAtTopSet()) { $rowsToRepeatAtTop = $sheet->getPageSetup()->getRowsToRepeatAtTop(); - + // we can only support repeating rows that start at top row if ($rowsToRepeatAtTop[0] == 1) { $theadStart = $rowsToRepeatAtTop[0]; @@ -346,7 +349,7 @@ class PHPExcel_Writer_HTML implements PHPExcel_Writer_IWriter { $tbodyStart = $rowsToRepeatAtTop[1] + 1; } } - + // Loop through cells $rowData = null; for ($row = $rowMin; $row <= $rowMax; ++$row) { diff --git a/libraries/PHPExcel/PHPExcel/Writer/IWriter.php b/libraries/PHPExcel/PHPExcel/Writer/IWriter.php index ec5331eff..35fd6890c 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/IWriter.php +++ b/libraries/PHPExcel/PHPExcel/Writer/IWriter.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Writer/PDF.php b/libraries/PHPExcel/PHPExcel/Writer/PDF.php index 570ce9d8e..f5886359b 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/PDF.php +++ b/libraries/PHPExcel/PHPExcel/Writer/PDF.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ diff --git a/libraries/PHPExcel/PHPExcel/Writer/Serialized.php b/libraries/PHPExcel/PHPExcel/Writer/Serialized.php index 603c4f7c2..51616b44d 100644 --- a/libraries/PHPExcel/PHPExcel/Writer/Serialized.php +++ b/libraries/PHPExcel/PHPExcel/Writer/Serialized.php @@ -22,7 +22,7 @@ * @package PHPExcel_Writer * @copyright Copyright (c) 2006 - 2010 PHPExcel (http://www.codeplex.com/PHPExcel) * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL - * @version 1.7.3c, 2010-06-01 + * @version 1.7.4, 2010-08-26 */ @@ -163,10 +163,10 @@ class PHPExcel_Writer_Serialized implements PHPExcel_Writer_IWriter // PHPExcel $objWriter->startElement('PHPExcel'); - $objWriter->writeAttribute('version', '1.7.3c'); + $objWriter->writeAttribute('version', '1.7.4'); // Comment - $objWriter->writeComment('This file has been generated using PHPExcel v1.7.3c (http://www.codeplex.com/PHPExcel). It contains a base64 encoded serialized version of the PHPExcel internal object.'); + $objWriter->writeComment('This file has been generated using PHPExcel v1.7.4 (http://www.codeplex.com/PHPExcel). It contains a base64 encoded serialized version of the PHPExcel internal object.'); // Data $objWriter->startElement('data');