[Phpmyadmin-git] [SCM] phpMyAdmin branch, master, updated. RELEASE_3_3_7-10092-gae04356

Dieter Adriaenssens ruleant at users.sourceforge.net
Sat Sep 11 16:40:27 CEST 2010


The branch, master has been updated
       via  ae04356ed298c86901fb4948596b8c0c7fe1f449 (commit)
       via  adaa35a87feeaf079d4178bb471073e0e19a75b6 (commit)
      from  e539a03ef938fb5df7950603bc196d2506c2c9b4 (commit)


- Log -----------------------------------------------------------------
commit ae04356ed298c86901fb4948596b8c0c7fe1f449
Merge: e539a03ef938fb5df7950603bc196d2506c2c9b4 adaa35a87feeaf079d4178bb471073e0e19a75b6
Author: Dieter Adriaenssens <ruleant at users.sourceforge.net>
Date:   Sat Sep 11 16:34:16 2010 +0200

    Merge branch 'QA_3_3'

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                                          |    1 +
 libraries/PHPExcel/PHPExcel.php                    |    4 +-
 libraries/PHPExcel/PHPExcel/Autoloader.php         |    2 +-
 .../PHPExcel/PHPExcel/CachedObjectStorage/APC.php  |   45 +++-
 .../PHPExcel/CachedObjectStorage/CacheBase.php     |   35 ++-
 .../PHPExcel/CachedObjectStorage/DiscISAM.php      |   28 ++-
 .../PHPExcel/CachedObjectStorage/ICache.php        |    9 +-
 .../PHPExcel/CachedObjectStorage/Memcache.php      |   53 +++-
 .../PHPExcel/CachedObjectStorage/Memory.php        |    2 +-
 .../PHPExcel/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/PHPExcel/Calculation/Exception.php    |    2 +-
 .../PHPExcel/Calculation/ExceptionHandler.php      |    2 +-
 .../PHPExcel/Calculation/FormulaParser.php         |    2 +-
 .../PHPExcel/PHPExcel/Calculation/FormulaToken.php |    2 +-
 .../PHPExcel/PHPExcel/Calculation/Function.php     |    2 +-
 .../PHPExcel/PHPExcel/Calculation/Functions.php    |  175 ++++++-------
 libraries/PHPExcel/PHPExcel/Cell.php               |  296 ++++++++++----------
 .../PHPExcel/PHPExcel/Cell/AdvancedValueBinder.php |    2 +-
 libraries/PHPExcel/PHPExcel/Cell/DataType.php      |    2 +-
 .../PHPExcel/PHPExcel/Cell/DataValidation.php      |    2 +-
 .../PHPExcel/PHPExcel/Cell/DefaultValueBinder.php  |    2 +-
 libraries/PHPExcel/PHPExcel/Cell/Hyperlink.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Cell/IValueBinder.php  |    2 +-
 libraries/PHPExcel/PHPExcel/Comment.php            |    2 +-
 libraries/PHPExcel/PHPExcel/DocumentProperties.php |   93 ++++---
 libraries/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/PHPExcel/Reader/DefaultReadFilter.php |    2 +-
 .../PHPExcel/PHPExcel/Reader/Excel2003XML.php      |    7 +-
 libraries/PHPExcel/PHPExcel/Reader/Excel2007.php   |   55 +++-
 libraries/PHPExcel/PHPExcel/Reader/Excel5.php      |   77 +++---
 .../PHPExcel/PHPExcel/Reader/Excel5/Escher.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Reader/IReadFilter.php |    2 +-
 libraries/PHPExcel/PHPExcel/Reader/IReader.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Reader/OOCalc.php      |   15 +-
 libraries/PHPExcel/PHPExcel/Reader/SYLK.php        |    2 +-
 libraries/PHPExcel/PHPExcel/Reader/Serialized.php  |    2 +-
 libraries/PHPExcel/PHPExcel/ReferenceHelper.php    |  161 ++++++++---
 libraries/PHPExcel/PHPExcel/RichText.php           |    2 +-
 .../PHPExcel/PHPExcel/RichText/ITextElement.php    |    2 +-
 libraries/PHPExcel/PHPExcel/RichText/Run.php       |    2 +-
 .../PHPExcel/PHPExcel/RichText/TextElement.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Settings.php           |    2 +-
 libraries/PHPExcel/PHPExcel/Shared/CodePage.php    |    2 +-
 libraries/PHPExcel/PHPExcel/Shared/Date.php        |    2 +-
 libraries/PHPExcel/PHPExcel/Shared/Drawing.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Shared/Escher.php      |    2 +-
 .../PHPExcel/Shared/Escher/DgContainer.php         |    2 +-
 .../Shared/Escher/DgContainer/SpgrContainer.php    |    2 +-
 .../DgContainer/SpgrContainer/SpContainer.php      |    2 +-
 .../PHPExcel/Shared/Escher/DggContainer.php        |   28 ++-
 .../Shared/Escher/DggContainer/BstoreContainer.php |    2 +-
 .../Escher/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 +-
 .../PHPExcel/Shared/OLE/ChainedBlockStream.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Shared/OLERead.php     |    2 +-
 .../PHPExcel/PHPExcel/Shared/PasswordHasher.php    |    2 +-
 libraries/PHPExcel/PHPExcel/Shared/String.php      |    4 +-
 libraries/PHPExcel/PHPExcel/Shared/XMLWriter.php   |   11 +-
 .../PHPExcel/PHPExcel/Shared/ZipStreamWrapper.php  |    2 +-
 .../PHPExcel/Shared/trend/bestFitClass.php         |    2 +-
 .../Shared/trend/exponentialBestFitClass.php       |    2 +-
 .../PHPExcel/Shared/trend/linearBestFitClass.php   |    2 +-
 .../Shared/trend/logarithmicBestFitClass.php       |    2 +-
 .../Shared/trend/polynomialBestFitClass.php        |    2 +-
 .../PHPExcel/Shared/trend/powerBestFitClass.php    |    2 +-
 libraries/PHPExcel/PHPExcel/Style.php              |    4 +-
 libraries/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 +-
 libraries/PHPExcel/PHPExcel/Style/Conditional.php  |    2 +-
 libraries/PHPExcel/PHPExcel/Style/Fill.php         |    4 +-
 libraries/PHPExcel/PHPExcel/Style/Font.php         |    4 +-
 libraries/PHPExcel/PHPExcel/Style/NumberFormat.php |    4 +-
 libraries/PHPExcel/PHPExcel/Style/Protection.php   |    2 +-
 libraries/PHPExcel/PHPExcel/Worksheet.php          |   15 +-
 .../PHPExcel/PHPExcel/Worksheet/BaseDrawing.php    |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/CellIterator.php   |    2 +-
 .../PHPExcel/Worksheet/ColumnDimension.php         |    2 +-
 libraries/PHPExcel/PHPExcel/Worksheet/Drawing.php  |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/Drawing/Shadow.php |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/HeaderFooter.php   |    2 +-
 .../PHPExcel/Worksheet/HeaderFooterDrawing.php     |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/MemoryDrawing.php  |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/PageMargins.php    |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/PageSetup.php      |  213 ++++++++++++---
 .../PHPExcel/PHPExcel/Worksheet/Protection.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Worksheet/Row.php      |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/RowDimension.php   |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/RowIterator.php    |    2 +-
 .../PHPExcel/PHPExcel/Worksheet/SheetView.php      |    2 +-
 libraries/PHPExcel/PHPExcel/WorksheetIterator.php  |    2 +-
 libraries/PHPExcel/PHPExcel/Writer/CSV.php         |    5 +-
 libraries/PHPExcel/PHPExcel/Writer/Excel2007.php   |    5 +-
 .../PHPExcel/Writer/Excel2007/Comments.php         |    2 +-
 .../PHPExcel/Writer/Excel2007/ContentTypes.php     |    2 +-
 .../PHPExcel/Writer/Excel2007/DocProps.php         |    2 +-
 .../PHPExcel/PHPExcel/Writer/Excel2007/Drawing.php |    2 +-
 .../PHPExcel/PHPExcel/Writer/Excel2007/Rels.php    |    2 +-
 .../PHPExcel/Writer/Excel2007/StringTable.php      |    2 +-
 .../PHPExcel/PHPExcel/Writer/Excel2007/Style.php   |    2 +-
 .../PHPExcel/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/PHPExcel/Writer/Excel5/BIFFwriter.php |    2 +-
 .../PHPExcel/PHPExcel/Writer/Excel5/Escher.php     |    9 +-
 libraries/PHPExcel/PHPExcel/Writer/Excel5/Font.php |    2 +-
 .../PHPExcel/PHPExcel/Writer/Excel5/Parser.php     |   20 ++-
 .../PHPExcel/PHPExcel/Writer/Excel5/Workbook.php   |  172 +++---------
 .../PHPExcel/PHPExcel/Writer/Excel5/Worksheet.php  |  211 ++++++---------
 libraries/PHPExcel/PHPExcel/Writer/Excel5/Xf.php   |    2 +-
 libraries/PHPExcel/PHPExcel/Writer/HTML.php        |   11 +-
 libraries/PHPExcel/PHPExcel/Writer/IWriter.php     |    2 +-
 libraries/PHPExcel/PHPExcel/Writer/PDF.php         |    2 +-
 libraries/PHPExcel/PHPExcel/Writer/Serialized.php  |    6 +-
 129 files changed, 1563 insertions(+), 917 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index d15366e..f31420a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -115,6 +115,7 @@
 
 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 8b9c71f..c54d421 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 3821d74..e66ce60 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 62e3a14..dae46c2 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 9871d90..208ed02 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 e685607..dff52fa 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 f3282aa..4731b8e 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 f1fc43c..74df8e8 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 be0fade..4b59b91 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 c281389..394faf2 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 9c29ea2..0b5b997 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 98cd952..54810d8 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 d759d7c..aa075be 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 6e8499e..e32891a 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<br />';
 //					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<br />';
+					//	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<br />';
@@ -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<br />';
 							$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<br />';
 							$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 8e77b9d..b94f3f4 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 9956167..7050260 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 8fcde41..271aa75 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 69d7f42..8c1396e 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 783e533..81dfc99 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 8ce3cfd..805f483 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 "--------------------<br>looking for $lookup_value in <br>";
-		print_r($lookup_array);
-		echo "<br>";
-		//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<br>";
+		//	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<br>";
+		//	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)."<br>";
+		//	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<sizeof($lookup_array);++$i){
-			// check the type of the value
-			if (!is_numeric($lookup_array[$i]) && !is_string($lookup_array[$i]) && !is_bool($lookup_array[$i])){
-				// error: lookup_array should contain only number, text, or logical values
-				//echo "error: lookup_array should contain only number, text, or logical values<br>";
+		//	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<sizeof($lookup_array);++$i){
-				// check ascending order
-				if(($match_type==1 && $lookup_array[$i]<$iLastValue)
-					// OR check descending order
-					|| ($match_type==-1 && $lookup_array[$i]>$iLastValue)){
-					// error: list is not ordered correctly
-					//echo "error: list is not ordered correctly<br>";
-					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 '<br />';
+		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 '<br />';
+//				echo 'Keyset = ';
+//				var_dump($keySet);
+//				echo '<br />';
+				$i = array_search($i,$keySet);
+//				echo '$i='.$i.'<br />';
+				// 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 '<br />';
+//				echo 'Keyset = ';
+//				var_dump($keySet);
+//				echo '<br />';
+				$i = array_search($i,$keySet);
+//				echo '$i='.$i.'<br />';
+				// 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<br>";
+
+		//	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 f8ebf86..b805b8d 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().'<br />';
-		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<br />';
 				$result = PHPExcel_Calculation::getInstance()->calculateCellValue($this,$resetLog);
@@ -262,28 +269,23 @@ class PHPExcel_Cell
 			} catch ( Exception $ex ) {
 //				echo 'Calculation Exception: '.$ex->getMessage().'<br />';
 				$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().'<br />';
 				return $this->_calculatedValue; // Fallback if calculation engine does not support the formula.
-			} else {
-//				echo 'Returning calculated value of '.$result.' for cell '.$this->getCoordinate().'<br />';
-				return $result;
 			}
+//			echo 'Returning calculated value of '.$result.' for cell '.$this->getCoordinate().'<br />';
+			return $result;
 		}
 
 		if (is_null($this->_value)) {
 //			echo 'Cell '.$this->getCoordinate().' has no value, formula or otherwise<br />';
 			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.'<br />';
-			return $this->_value;
-		} else {
-//			echo 'Cell value is a formula: Calculating value<br />';
-			return PHPExcel_Calculation::getInstance()->calculateCellValue($this,$resetLog);
 		}
+//		echo 'Cell value for '.$this->getCoordinate().' is not a formula: Returning data value of '.$this->_value.'<br />';
+		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);
-
-   		// 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);
+		list($rangeStart,$rangeEnd) = PHPExcel_Cell::rangeBoundaries($pRange);
 
-   		// 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 7e305c5..5126811 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 1496d83..d542cab 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 2c3913c..db1b497 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 e49449f..ad5ae46 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 eab9297..994cef5 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 4bd1ef2..c14d630 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 735e78c..432cfe1 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 64b0c2a..d6d928e 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 1522189..a6de9ee 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 bd526b6..2191672 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 3c175d1..0a51b06 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 21fd23c..a3650be 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 1aa5236..992c2fa 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 5fa83bd..086c948 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 c6620e7..e83ac9a 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 96e3436..99f00ed 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."<br />";
+						}
 						$hasCalculatedValue = true;
 					}
 					if (isset($cell->Data)) {
diff --git a/libraries/PHPExcel/PHPExcel/Reader/Excel2007.php b/libraries/PHPExcel/PHPExcel/Reader/Excel2007.php
index 031dee5..c4e3e41 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.'<br />';
 			}
 		}
@@ -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.'<br />';
 												}
 												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 a4f20e7..5c71ee8 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 0418dd7..b7c67e9 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 c397d56..00fa2e8 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 ef5beac..e1cdc43 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 8a1407a..a1ddf91 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 '<h1>Meta Information</h1>';
@@ -338,6 +341,11 @@ class PHPExcel_Reader_OOCalc implements PHPExcel_Reader_IReader
 					foreach($worksheetData as $key => $rowData) {
 //						echo '<b>'.$key.'</b><br />';
 						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 ec8a4d4..790aa2f 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 88f2892..04b14f2 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 cb9673c..7a37ed0 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*|\'[^!]*\')!)?(?<![:a-z\$])(\$?[a-z]{1,3}\$?\d+)(?=[^:!\d\'])';
+	const REFHELPER_REGEXP_CELLRANGE	= '((\w*|\'[^!]*\')!)?(\$?[a-z]{1,3}\$?\d+):(\$?[a-z]{1,3}\$?\d+)';
+	const REFHELPER_REGEXP_ROWRANGE		= '((\w*|\'[^!]*\')!)?(\$?\d+):(\$?\d+)';
+	const REFHELPER_REGEXP_COLRANGE		= '((\w*|\'[^!]*\')!)?(\$?[a-z]{1,3}):(\$?[a-z]{1,3})';
+
 	/**
 	 * Instance of this class
 	 *
@@ -119,10 +126,8 @@ class PHPExcel_ReferenceHelper
 			$newCoordinates = PHPExcel_Cell::stringFromColumnIndex( PHPExcel_Cell::columnIndexFromString($cell->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] = '/(?<![A-Z])'.preg_quote($token).'(?!\d)/i';
-						++$adjustCount;
-					}
-				}
-			}
-		}
-		if ($adjustCount == 0) {
-			return $pFormula;
-		}
-		krsort($cellTokens);
-		krsort($newCellTokens);
-
+	public function updateFormulaReferences($pFormula = '', $pBefore = 'A1', $pNumCols = 0, $pNumRows = 0, $sheetName = '') {
 		//	Update cell references in the formula
 		$formulaBlocks = explode('"',$pFormula);
 		foreach($formulaBlocks as $i => &$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] = '/(?<!\d)'.preg_quote($fromString).'(?!\d)/i';
+								++$adjustCount;
+							}
+						}
+					}
+				}
+				//	Search for column ranges (e.g. 'Sheet1'!C:E or C:E) with or without $ absolutes (e.g. $C:E)
+				$matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_COLRANGE.'/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($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] = '/(?<![A-Z])'.preg_quote($fromString).'(?![A-Z])/i';
+								++$adjustCount;
+							}
+						}
+					}
+				}
+				//	Search for cell ranges (e.g. 'Sheet1'!A3:C5 or A3:C5) with or without $ absolutes (e.g. $A1:C$5)
+				$matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_CELLRANGE.'/i', ' '.$formulaBlock.' ', $matches, PREG_SET_ORDER);
+				if ($matchCount > 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] = '/(?<![A-Z])'.preg_quote($fromString).'(?!\d)/i';
+								++$adjustCount;
+							}
+						}
+					}
+				}
+				//	Search for cell references (e.g. 'Sheet1'!A3 or C5) with or without $ absolutes (e.g. $A1 or C$5)
+				$matchCount = preg_match_all('/'.self::REFHELPER_REGEXP_CELLREF.'/i', ' '.$formulaBlock.' ', $matches, PREG_SET_ORDER);
+				if ($matchCount > 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] = '/(?<![A-Z])'.preg_quote($fromString).'(?!\d)/i';
+								++$adjustCount;
+							}
+						}
+					}
+				}
+				if ($adjustCount > 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 c938c62..588e643 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 613028f..3f1aa7a 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 209af21..aac7676 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 3a24482..f5ce8e0 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 7a1d57e..52d7880 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 10f82e4..f209838 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 c45c23f..334e8df 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 a89c94e..a24f963 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 c230d99..11c19b2 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 c78485b..6cbd2f0 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 c659fd5..919cf1a 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 83e3193..454b7ee 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 59d34cf..61eab5d 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
  */
 
 /**
@@ -70,6 +70,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)
 	 *
 	 * @return int
@@ -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(<drawingId> => <max shape id>, ...)
+	 *
+	 * @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 9292f2d..6040fb2 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 820e703..00ccb6d 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 35003dd..7f13632 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 05af633..6469c52 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 dc2c3fd..23169ce 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 1759e87..24d78be 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 7b6f845..af757d0 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 b747e13..6aebbf0 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 6b7b312..7fb4934 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 32766df..c033b9a 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 223d3dd..8514847 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 77661c6..b79bfc8 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 27fecd5..28fe725 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 a0717ea..0ff98cc 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 99f358c..71219a0 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 a59c879..03c7dc3 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 02ff0a5..6947c11 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 9328fcb..6d2281c 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 d0cbcb0..3e84f9f 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 412c603..15b6c87 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 1af31d6..166ccb2 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 ffd66af..dc32c50 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 8a25af0..9734d62 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 8ec5f92..4602b53 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 3ebf380..1357e47 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 de39cf2..b58dbf5 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 9ff1a97..0f0dcdc 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, 201
0-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 1c70702..29832da 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 dc401fd..fb7cc0a 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 e2c65c3..511643b 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 4a6589f..630e089 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 f42ef31..30b0035 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 7d362c0..537f9f3 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 f83c26d..053ab0d 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 4e39339..9d2708d 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 9f2b25d..f614261 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 0bd37f5..a43e6a9 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 6fc8f1a..155b976 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 ffbd573..8e615f7 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. e.g. 'A1:D10' or 'A1:D10,G5:M20'
+	 *
+	 *	@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 <b>all</b> 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 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;
 	}
 
 	/**
-	 * Set print area
+	 *	Add a new print area (e.g. 'A1:D10' or 'A1:D10,G5:M20') 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
-	 * @return PHPExcel_Worksheet_PageSetup
+	 *	@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 setPrintAreaByColumnAndRow($column1, $row1, $column2, $row2)
+	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 <b>all</b> 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 0e7bc4f..f60a265 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 c5cb33a..7311721 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 8b1277d..153024f 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 d21bd51..e0f91fc 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 c7e04ae..fdfe001 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 f6f6a6f..87f8b29 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 03e1a6e..765244d 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 1963ab9..b9f7464 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 ddb7958..3a6ad37 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 d27e386..84de96d 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 68e0f04..21fc3a4 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 670b835..f1551da 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 d133621..7ffdd6d 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 8ab1c52..98a3c45 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 dd7621d..5354936 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 9dbee16..e8ffe7b 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 245fb87..d2c51fb 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 411b42a..327e542 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 c153237..97d56e1 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 0bb5571..4d69d91 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 2c0a2d1..e758aeb 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 402bd19..3c9c29f 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 bb4d201..2928070 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 cef650f..eb9891e 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 d26ddee..6e517e6 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 646101a..0dd2b00 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):
@@ -186,6 +186,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
 	 *
 	 * @param int  $BIFF_version		 BIFF version
@@ -2694,142 +2701,82 @@ class PHPExcel_Writer_Excel5_Worksheet extends PHPExcel_Writer_Excel5_BIFFwriter
 	}
 
 	/**
-	 * Write MSODRAWING record
+	 * Get Escher object
+	 *
+	 * @return PHPExcel_Shared_Escher
 	 */
-	private function _writeMsoDrawing()
+	public function getEscher()
 	{
-		// check if there are any shapes for this sheet
-		if (count($this->_phpSheet->getDrawingCollection()) == 0) {
-			return;
-		}
-
-		// 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)
-		$dgContainer->setDgId($this->_phpSheet->getParent()->getIndex($this->_phpSheet) + 1);
-		$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(($this->_phpSheet->getParent()->getIndex($this->_phpSheet) + 1) << 10);
-		$spgrContainer->addChild($spContainer);
-
-		// add the shapes
-
-		// outer loop is for determining BSE index
-		$blipIndex = 0; // 1-based index to BstoreContainer
-
-		$countShapes = 0; // count number of shapes (minus group shape), in this sheet
-
-		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);
+		return $this->_escher;
+	}
 
-					$spContainer->setStartCoordinates($twoAnchor['startCoordinates']);
-					$spContainer->setStartOffsetX($twoAnchor['startOffsetX']);
-					$spContainer->setStartOffsetY($twoAnchor['startOffsetY']);
-					$spContainer->setEndCoordinates($twoAnchor['endCoordinates']);
-					$spContainer->setEndOffsetX($twoAnchor['endOffsetX']);
-					$spContainer->setEndOffsetY($twoAnchor['endOffsetY']);
+	/**
+	 * Set Escher object
+	 *
+	 * @param PHPExcel_Shared_Escher $pValue
+	 */
+	public function setEscher(PHPExcel_Shared_Escher $pValue = null)
+	{
+		$this->_escher = $pValue;
+	}
 
-					$spgrContainer->addChild($spContainer);
-				}
+	/**
+	 * Write MSODRAWING record
+	 */
+	private function _writeMsoDrawing()
+	{
+		// write the Escher stream if necessary
+		if (isset($this->_escher)) {
+			$writer = new PHPExcel_Writer_Excel5_Escher($this->_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);
 			}
 		}
-
-		// 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 9246a34..27632f3 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 3c892cf..b6667f5 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 <tbody>, <thead>
 			$tbodyStart = $rowMin;
 	    	$tbodyEnd   = $rowMax;
@@ -338,7 +341,7 @@ class PHPExcel_Writer_HTML implements PHPExcel_Writer_IWriter {
 			$theadEnd   = 0; // default: no </thead>
 			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 ec5331e..35fd689 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 570ce9d..f588635 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 603c4f7..51616b4 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');


hooks/post-receive
-- 
phpMyAdmin




More information about the Git mailing list