Merge branch 'develop' of https://github.com/PHPOffice/PHPExcel into develop

This commit is contained in:
Mark Baker 2013-03-06 21:39:54 +00:00
commit d41e68b919
32 changed files with 1183 additions and 570 deletions

View File

@ -42,6 +42,13 @@ if (!defined('PHPEXCEL_ROOT')) {
*/ */
class PHPExcel class PHPExcel
{ {
/**
* Unique ID
*
* @var string
*/
private $_uniqueID;
/** /**
* Document properties * Document properties
* *
@ -63,6 +70,13 @@ class PHPExcel
*/ */
private $_workSheetCollection = array(); private $_workSheetCollection = array();
/**
* Calculation Engine
*
* @var PHPExcel_Calculation
*/
private $_calculationEngine = NULL;
/** /**
* Active sheet index * Active sheet index
* *
@ -103,6 +117,9 @@ class PHPExcel
*/ */
public function __construct() public function __construct()
{ {
$this->_uniqueID = uniqid();
$this->_calculationEngine = PHPExcel_Calculation::getInstance($this);
// Initialise worksheet collection and add one worksheet // Initialise worksheet collection and add one worksheet
$this->_workSheetCollection = array(); $this->_workSheetCollection = array();
$this->_workSheetCollection[] = new PHPExcel_Worksheet($this); $this->_workSheetCollection[] = new PHPExcel_Worksheet($this);
@ -126,13 +143,22 @@ class PHPExcel
$this->addCellStyleXf(new PHPExcel_Style); $this->addCellStyleXf(new PHPExcel_Style);
} }
/**
* Code to execute when this worksheet is unset()
*
*/
public function __destruct() {
PHPExcel_Calculation::unsetInstance($this);
$this->disconnectWorksheets();
} // function __destruct()
/** /**
* Disconnect all worksheets from this PHPExcel workbook object, * Disconnect all worksheets from this PHPExcel workbook object,
* typically so that the PHPExcel object can be unset * typically so that the PHPExcel object can be unset
* *
*/ */
public function disconnectWorksheets() { public function disconnectWorksheets()
{
$worksheet = NULL; $worksheet = NULL;
foreach($this->_workSheetCollection as $k => &$worksheet) { foreach($this->_workSheetCollection as $k => &$worksheet) {
$worksheet->disconnectCells(); $worksheet->disconnectCells();
@ -142,13 +168,15 @@ class PHPExcel
$this->_workSheetCollection = array(); $this->_workSheetCollection = array();
} }
/** /**
* Code to execute when this worksheet is unset() * Return the calculation engine for this worksheet
* *
*/ * @return PHPExcel_Calculation
function __destruct() { */
$this->disconnectWorksheets(); public function getCalculationEngine()
} {
return $this->_calculationEngine;
} // function getCellCacheController()
/** /**
* Get properties * Get properties
@ -849,12 +877,14 @@ class PHPExcel
foreach ($sheet->getColumnDimensions() as $columnDimension) { foreach ($sheet->getColumnDimensions() as $columnDimension) {
$columnDimension->setXfIndex( $map[$columnDimension->getXfIndex()] ); $columnDimension->setXfIndex( $map[$columnDimension->getXfIndex()] );
} }
}
// also do garbage collection for all the sheets // also do garbage collection for all the sheets
foreach ($this->getWorksheetIterator() as $sheet) {
$sheet->garbageCollect(); $sheet->garbageCollect();
} }
} }
public function getID() {
return $this->_uniqueID;
}
} }

View File

@ -154,8 +154,8 @@ class PHPExcel_CachedObjectStorage_APC extends PHPExcel_CachedObjectStorage_Cach
// Set current entry to the requested entry // Set current entry to the requested entry
$this->_currentObjectID = $pCoord; $this->_currentObjectID = $pCoord;
$this->_currentObject = unserialize($obj); $this->_currentObject = unserialize($obj);
// Re-attach the parent worksheet // Re-attach this as the cell's parent
$this->_currentObject->attach($this->_parent); $this->_currentObject->attach($this);
// Return requested entry // Return requested entry
return $this->_currentObject; return $this->_currentObject;

View File

@ -86,6 +86,11 @@ abstract class PHPExcel_CachedObjectStorage_CacheBase {
} // function __construct() } // function __construct()
public function getParent()
{
return $this->_parent;
}
/** /**
* Is a value set in the current PHPExcel_CachedObjectStorage_ICache for an indexed cell? * Is a value set in the current PHPExcel_CachedObjectStorage_ICache for an indexed cell?
* *
@ -101,6 +106,27 @@ abstract class PHPExcel_CachedObjectStorage_CacheBase {
} // function isDataSet() } // function isDataSet()
/**
* Move a cell object from one address to another
*
* @param string $fromAddress Current address of the cell to move
* @param string $toAddress Destination address of the cell to move
* @return boolean
*/
public function moveCell($fromAddress, $toAddress) {
if ($fromAddress === $this->_currentObjectID) {
$this->_currentObjectID = $toAddress;
}
$this->_currentCellIsDirty = true;
if (isset($this->_cellCache[$fromAddress])) {
$this->_cellCache[$toAddress] = &$this->_cellCache[$fromAddress];
unset($this->_cellCache[$fromAddress]);
}
return TRUE;
} // function moveCell()
/** /**
* Add or Update a cell in cache * Add or Update a cell in cache
* *
@ -188,6 +214,23 @@ abstract class PHPExcel_CachedObjectStorage_CacheBase {
} }
public function getCurrentAddress()
{
return $this->_currentObjectID;
}
public function getCurrentColumn()
{
list($column,$row) = sscanf($this->_currentObjectID, '%[A-Z]%d');
return $column;
}
public function getCurrentRow()
{
list($column,$row) = sscanf($this->_currentObjectID, '%[A-Z]%d');
return $row;
}
/** /**
* Get highest worksheet column * Get highest worksheet column
* *
@ -237,7 +280,7 @@ abstract class PHPExcel_CachedObjectStorage_CacheBase {
$this->_parent = $parent; $this->_parent = $parent;
if (($this->_currentObject !== NULL) && (is_object($this->_currentObject))) { if (($this->_currentObject !== NULL) && (is_object($this->_currentObject))) {
$this->_currentObject->attach($parent); $this->_currentObject->attach($this);
} }
} // function copyCellCollection() } // function copyCellCollection()

View File

@ -124,8 +124,8 @@ class PHPExcel_CachedObjectStorage_DiscISAM extends PHPExcel_CachedObjectStorage
$this->_currentObjectID = $pCoord; $this->_currentObjectID = $pCoord;
fseek($this->_fileHandle,$this->_cellCache[$pCoord]['ptr']); fseek($this->_fileHandle,$this->_cellCache[$pCoord]['ptr']);
$this->_currentObject = unserialize(fread($this->_fileHandle,$this->_cellCache[$pCoord]['sz'])); $this->_currentObject = unserialize(fread($this->_fileHandle,$this->_cellCache[$pCoord]['sz']));
// Re-attach the parent worksheet // Re-attach this as the cell's parent
$this->_currentObject->attach($this->_parent); $this->_currentObject->attach($this);
// Return requested entry // Return requested entry
return $this->_currentObject; return $this->_currentObject;

View File

@ -96,8 +96,8 @@ class PHPExcel_CachedObjectStorage_Igbinary extends PHPExcel_CachedObjectStorage
// Set current entry to the requested entry // Set current entry to the requested entry
$this->_currentObjectID = $pCoord; $this->_currentObjectID = $pCoord;
$this->_currentObject = igbinary_unserialize($this->_cellCache[$pCoord]); $this->_currentObject = igbinary_unserialize($this->_cellCache[$pCoord]);
// Re-attach the parent worksheet // Re-attach this as the cell's parent
$this->_currentObject->attach($this->_parent); $this->_currentObject->attach($this);
// Return requested entry // Return requested entry
return $this->_currentObject; return $this->_currentObject;

View File

@ -158,8 +158,8 @@ class PHPExcel_CachedObjectStorage_Memcache extends PHPExcel_CachedObjectStorage
// Set current entry to the requested entry // Set current entry to the requested entry
$this->_currentObjectID = $pCoord; $this->_currentObjectID = $pCoord;
$this->_currentObject = unserialize($obj); $this->_currentObject = unserialize($obj);
// Re-attach the parent worksheet // Re-attach this as the cell's parent
$this->_currentObject->attach($this->_parent); $this->_currentObject->attach($this);
// Return requested entry // Return requested entry
return $this->_currentObject; return $this->_currentObject;

View File

@ -48,11 +48,15 @@ class PHPExcel_CachedObjectStorage_Memory extends PHPExcel_CachedObjectStorage_C
* *
* @param string $pCoord Coordinate address of the cell to update * @param string $pCoord Coordinate address of the cell to update
* @param PHPExcel_Cell $cell Cell to update * @param PHPExcel_Cell $cell Cell to update
* @return void * @return PHPExcel_Cell
* @throws PHPExcel_Exception * @throws PHPExcel_Exception
*/ */
public function addCacheData($pCoord, PHPExcel_Cell $cell) { public function addCacheData($pCoord, PHPExcel_Cell $cell) {
$this->_cellCache[$pCoord] = $cell; $this->_cellCache[$pCoord] = $cell;
// Set current entry to the new/updated entry
$this->_currentObjectID = $pCoord;
return $cell; return $cell;
} // function addCacheData() } // function addCacheData()
@ -67,10 +71,14 @@ class PHPExcel_CachedObjectStorage_Memory extends PHPExcel_CachedObjectStorage_C
public function getCacheData($pCoord) { public function getCacheData($pCoord) {
// Check if the entry that has been requested actually exists // Check if the entry that has been requested actually exists
if (!isset($this->_cellCache[$pCoord])) { if (!isset($this->_cellCache[$pCoord])) {
$this->_currentObjectID = NULL;
// Return null if requested entry doesn't exist in cache // Return null if requested entry doesn't exist in cache
return null; return null;
} }
// Set current entry to the requested entry
$this->_currentObjectID = $pCoord;
// Return requested entry // Return requested entry
return $this->_cellCache[$pCoord]; return $this->_cellCache[$pCoord];
} // function getCacheData() } // function getCacheData()

View File

@ -96,8 +96,8 @@ class PHPExcel_CachedObjectStorage_MemoryGZip extends PHPExcel_CachedObjectStora
// Set current entry to the requested entry // Set current entry to the requested entry
$this->_currentObjectID = $pCoord; $this->_currentObjectID = $pCoord;
$this->_currentObject = unserialize(gzinflate($this->_cellCache[$pCoord])); $this->_currentObject = unserialize(gzinflate($this->_cellCache[$pCoord]));
// Re-attach the parent worksheet // Re-attach this as the cell's parent
$this->_currentObject->attach($this->_parent); $this->_currentObject->attach($this);
// Return requested entry // Return requested entry
return $this->_currentObject; return $this->_currentObject;

View File

@ -96,8 +96,8 @@ class PHPExcel_CachedObjectStorage_MemorySerialized extends PHPExcel_CachedObjec
// Set current entry to the requested entry // Set current entry to the requested entry
$this->_currentObjectID = $pCoord; $this->_currentObjectID = $pCoord;
$this->_currentObject = unserialize($this->_cellCache[$pCoord]); $this->_currentObject = unserialize($this->_cellCache[$pCoord]);
// Re-attach the parent worksheet // Re-attach this as the cell's parent
$this->_currentObject->attach($this->_parent); $this->_currentObject->attach($this);
// Return requested entry // Return requested entry
return $this->_currentObject; return $this->_currentObject;

View File

@ -116,8 +116,8 @@ class PHPExcel_CachedObjectStorage_PHPTemp extends PHPExcel_CachedObjectStorage_
$this->_currentObjectID = $pCoord; $this->_currentObjectID = $pCoord;
fseek($this->_fileHandle,$this->_cellCache[$pCoord]['ptr']); fseek($this->_fileHandle,$this->_cellCache[$pCoord]['ptr']);
$this->_currentObject = unserialize(fread($this->_fileHandle,$this->_cellCache[$pCoord]['sz'])); $this->_currentObject = unserialize(fread($this->_fileHandle,$this->_cellCache[$pCoord]['sz']));
// Re-attach the parent worksheet // Re-attach this as the cell's parent
$this->_currentObject->attach($this->_parent); $this->_currentObject->attach($this);
// Return requested entry // Return requested entry
return $this->_currentObject; return $this->_currentObject;

View File

@ -116,8 +116,8 @@ class PHPExcel_CachedObjectStorage_SQLite extends PHPExcel_CachedObjectStorage_C
$cellResult = $cellResultSet->fetchSingle(); $cellResult = $cellResultSet->fetchSingle();
$this->_currentObject = unserialize($cellResult); $this->_currentObject = unserialize($cellResult);
// Re-attach the parent worksheet // Re-attach this as the cell's parent
$this->_currentObject->attach($this->_parent); $this->_currentObject->attach($this);
// Return requested entry // Return requested entry
return $this->_currentObject; return $this->_currentObject;
@ -169,6 +169,32 @@ class PHPExcel_CachedObjectStorage_SQLite extends PHPExcel_CachedObjectStorage_C
} // function deleteCacheData() } // function deleteCacheData()
/**
* Move a cell object from one address to another
*
* @param string $fromAddress Current address of the cell to move
* @param string $toAddress Destination address of the cell to move
* @return boolean
*/
public function moveCell($fromAddress, $toAddress) {
if ($fromAddress === $this->_currentObjectID) {
$this->_currentObjectID = $toAddress;
}
$query = "DELETE FROM kvp_".$this->_TableName." WHERE id='".$toAddress."'";
$result = $this->_DBHandle->exec($query);
if ($result === false)
throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg());
$query = "UPDATE kvp_".$this->_TableName." SET id='".$toAddress."' WHERE id='".$fromAddress."'";
$result = $this->_DBHandle->exec($query);
if ($result === false)
throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg());
return TRUE;
} // function moveCell()
/** /**
* Get a list of all cell addresses currently held in cache * Get a list of all cell addresses currently held in cache
* *
@ -256,6 +282,10 @@ class PHPExcel_CachedObjectStorage_SQLite extends PHPExcel_CachedObjectStorage_C
* Destroy this cell collection * Destroy this cell collection
*/ */
public function __destruct() { public function __destruct() {
if (!is_null($this->_DBHandle)) {
$this->_DBHandle->queryExec('DROP TABLE kvp_'.$this->_TableName);
$this->_DBHandle->close();
}
$this->_DBHandle = null; $this->_DBHandle = null;
} // function __destruct() } // function __destruct()

View File

@ -49,6 +49,11 @@ class PHPExcel_CachedObjectStorage_SQLite3 extends PHPExcel_CachedObjectStorage_
*/ */
private $_DBHandle = null; private $_DBHandle = null;
private $_selectQuery;
private $_insertQuery;
private $_updateQuery;
private $_deleteQuery;
/** /**
* Store cell data in cache for the current cell object if it's "dirty", * Store cell data in cache for the current cell object if it's "dirty",
* and the 'nullify' the current cell object * and the 'nullify' the current cell object
@ -60,10 +65,9 @@ class PHPExcel_CachedObjectStorage_SQLite3 extends PHPExcel_CachedObjectStorage_
if ($this->_currentCellIsDirty) { if ($this->_currentCellIsDirty) {
$this->_currentObject->detach(); $this->_currentObject->detach();
$query = $this->_DBHandle->prepare("INSERT OR REPLACE INTO kvp_".$this->_TableName." VALUES(:id,:data)"); $this->_insertQuery->bindValue('id',$this->_currentObjectID,SQLITE3_TEXT);
$query->bindValue('id',$this->_currentObjectID,SQLITE3_TEXT); $this->_insertQuery->bindValue('data',serialize($this->_currentObject),SQLITE3_BLOB);
$query->bindValue('data',serialize($this->_currentObject),SQLITE3_BLOB); $result = $this->_insertQuery->execute();
$result = $query->execute();
if ($result === false) if ($result === false)
throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg()); throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg());
$this->_currentCellIsDirty = false; $this->_currentCellIsDirty = false;
@ -106,21 +110,23 @@ class PHPExcel_CachedObjectStorage_SQLite3 extends PHPExcel_CachedObjectStorage_
} }
$this->_storeData(); $this->_storeData();
$query = "SELECT value FROM kvp_".$this->_TableName." WHERE id='".$pCoord."'"; $this->_selectQuery->bindValue('id',$pCoord,SQLITE3_TEXT);
$cellResult = $this->_DBHandle->querySingle($query); $cellResult = $this->_selectQuery->execute();
if ($cellResult === false) { if ($cellResult === FALSE) {
throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg()); throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg());
} elseif (is_null($cellResult)) { }
$cellData = $cellResult->fetchArray(SQLITE3_ASSOC);
if ($cellData === FALSE) {
// Return null if requested entry doesn't exist in cache // Return null if requested entry doesn't exist in cache
return null; return NULL;
} }
// Set current entry to the requested entry // Set current entry to the requested entry
$this->_currentObjectID = $pCoord; $this->_currentObjectID = $pCoord;
$this->_currentObject = unserialize($cellResult); $this->_currentObject = unserialize($cellData['value']);
// Re-attach the parent worksheet // Re-attach this as the cell's parent
$this->_currentObject->attach($this->_parent); $this->_currentObject->attach($this);
// Return requested entry // Return requested entry
return $this->_currentObject; return $this->_currentObject;
@ -135,19 +141,18 @@ class PHPExcel_CachedObjectStorage_SQLite3 extends PHPExcel_CachedObjectStorage_
*/ */
public function isDataSet($pCoord) { public function isDataSet($pCoord) {
if ($pCoord === $this->_currentObjectID) { if ($pCoord === $this->_currentObjectID) {
return true; return TRUE;
} }
// Check if the requested entry exists in the cache // Check if the requested entry exists in the cache
$query = "SELECT id FROM kvp_".$this->_TableName." WHERE id='".$pCoord."'"; $this->_selectQuery->bindValue('id',$pCoord,SQLITE3_TEXT);
$cellResult = $this->_DBHandle->querySingle($query); $cellResult = $this->_selectQuery->execute();
if ($cellResult === false) { if ($cellResult === FALSE) {
throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg()); throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg());
} elseif (is_null($cellResult)) {
// Return null if requested entry doesn't exist in cache
return false;
} }
return true; $cellData = $cellResult->fetchArray(SQLITE3_ASSOC);
return ($cellData === FALSE) ? FALSE : TRUE;
} // function isDataSet() } // function isDataSet()
@ -160,17 +165,44 @@ class PHPExcel_CachedObjectStorage_SQLite3 extends PHPExcel_CachedObjectStorage_
public function deleteCacheData($pCoord) { public function deleteCacheData($pCoord) {
if ($pCoord === $this->_currentObjectID) { if ($pCoord === $this->_currentObjectID) {
$this->_currentObject->detach(); $this->_currentObject->detach();
$this->_currentObjectID = $this->_currentObject = null; $this->_currentObjectID = $this->_currentObject = NULL;
} }
// Check if the requested entry exists in the cache // Check if the requested entry exists in the cache
$query = "DELETE FROM kvp_".$this->_TableName." WHERE id='".$pCoord."'"; $this->_deleteQuery->bindValue('id',$pCoord,SQLITE3_TEXT);
$result = $this->_DBHandle->exec($query); $result = $this->_deleteQuery->execute();
if ($result === FALSE)
throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg());
$this->_currentCellIsDirty = FALSE;
} // function deleteCacheData()
/**
* Move a cell object from one address to another
*
* @param string $fromAddress Current address of the cell to move
* @param string $toAddress Destination address of the cell to move
* @return boolean
*/
public function moveCell($fromAddress, $toAddress) {
if ($fromAddress === $this->_currentObjectID) {
$this->_currentObjectID = $toAddress;
}
$this->_deleteQuery->bindValue('id',$toAddress,SQLITE3_TEXT);
$result = $this->_deleteQuery->execute();
if ($result === false) if ($result === false)
throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg()); throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg());
$this->_currentCellIsDirty = false; $this->_updateQuery->bindValue('toid',$toAddress,SQLITE3_TEXT);
} // function deleteCacheData() $this->_updateQuery->bindValue('fromid',$fromAddress,SQLITE3_TEXT);
$result = $this->_updateQuery->execute();
if ($result === false)
throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg());
return TRUE;
} // function moveCell()
/** /**
@ -253,6 +285,11 @@ class PHPExcel_CachedObjectStorage_SQLite3 extends PHPExcel_CachedObjectStorage_
if (!$this->_DBHandle->exec('CREATE TABLE kvp_'.$this->_TableName.' (id VARCHAR(12) PRIMARY KEY, value BLOB)')) if (!$this->_DBHandle->exec('CREATE TABLE kvp_'.$this->_TableName.' (id VARCHAR(12) PRIMARY KEY, value BLOB)'))
throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg()); throw new PHPExcel_Exception($this->_DBHandle->lastErrorMsg());
} }
$this->_selectQuery = $this->_DBHandle->prepare("SELECT value FROM kvp_".$this->_TableName." WHERE id = :id");
$this->_insertQuery = $this->_DBHandle->prepare("INSERT OR REPLACE INTO kvp_".$this->_TableName." VALUES(:id,:data)");
$this->_updateQuery = $this->_DBHandle->prepare("UPDATE kvp_".$this->_TableName." SET id=:toId WHERE id=:fromId");
$this->_deleteQuery = $this->_DBHandle->prepare("DELETE FROM kvp_".$this->_TableName." WHERE id = :id");
} // function __construct() } // function __construct()
@ -261,6 +298,7 @@ class PHPExcel_CachedObjectStorage_SQLite3 extends PHPExcel_CachedObjectStorage_
*/ */
public function __destruct() { public function __destruct() {
if (!is_null($this->_DBHandle)) { if (!is_null($this->_DBHandle)) {
$this->_DBHandle->exec('DROP TABLE kvp_'.$this->_TableName);
$this->_DBHandle->close(); $this->_DBHandle->close();
} }
$this->_DBHandle = null; $this->_DBHandle = null;

View File

@ -158,8 +158,8 @@ class PHPExcel_CachedObjectStorage_Wincache extends PHPExcel_CachedObjectStorage
// Set current entry to the requested entry // Set current entry to the requested entry
$this->_currentObjectID = $pCoord; $this->_currentObjectID = $pCoord;
$this->_currentObject = unserialize($obj); $this->_currentObject = unserialize($obj);
// Re-attach the parent worksheet // Re-attach this as the cell's parent
$this->_currentObject->attach($this->_parent); $this->_currentObject->attach($this);
// Return requested entry // Return requested entry
return $this->_currentObject; return $this->_currentObject;

View File

@ -0,0 +1,58 @@
<?php
/**
* PHPExcel
*
* Copyright (c) 2006 - 2012 PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPExcel
* @package PHPExcel_Calculation
* @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version ##VERSION##, ##DATE##
*/
class PHPExcel_CalcEngine_CyclicReferenceStack {
private $_stack = array();
public function count() {
return count($this->_stack);
}
public function push($value) {
$this->_stack[] = $value;
} // function push()
public function pop() {
return array_pop($this->_stack);
} // function pop()
public function onStack($value) {
return in_array($value,$this->_stack);
}
public function clear() {
$this->_stack = array();
} // function push()
public function showStack() {
return $this->_stack;
}
} // class PHPExcel_CalcEngine_CyclicReferenceStack

View File

@ -0,0 +1,121 @@
<?php
/**
* PHPExcel
*
* Copyright (c) 2006 - 2012 PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPExcel
* @package PHPExcel_Calculation
* @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version ##VERSION##, ##DATE##
*/
/**
* PHPExcel_Calculation_Logger
*
* @category PHPExcel
* @package PHPExcel_Calculation
* @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
*/
class PHPExcel_CalcEngine_Logger {
/**
* Flag to determine whether a debug log should be generated by the calculation engine
* If true, then a debug log will be generated
* If false, then a debug log will not be generated
*
* @var boolean
*
*/
private $_writeDebugLog = FALSE;
/**
* Flag to determine whether a debug log should be echoed by the calculation engine
* If true, then a debug log will be echoed
* If false, then a debug log will not be echoed
* A debug log can only be echoed if it is generated
*
* @var boolean
*
*/
private $_echoDebugLog = FALSE;
/**
* The debug log generated by the calculation engine
*
* @var string[]
*
*/
private $_debugLog = array();
/**
* The calculation engine cell reference stack
*
* @var PHPExcel_CalcEngine_CyclicReferenceStack
*
*/
private $_cellStack;
public function __construct(PHPExcel_CalcEngine_CyclicReferenceStack $stack) {
$this->_cellStack = $stack;
}
public function setWriteDebugLog($pValue = FALSE) {
$this->_writeDebugLog = $pValue;
}
public function getWriteDebugLog() {
return $this->_writeDebugLog;
}
public function setEchoDebugLog($pValue = FALSE) {
$this->_echoDebugLog = $pValue;
}
public function getEchoDebugLog() {
return $this->_echoDebugLog;
}
public function writeDebugLog() {
// Only write the debug log if logging is enabled
if ($this->_writeDebugLog) {
$message = implode(func_get_args());
$cellReference = implode(' -> ', $this->_cellStack->showStack());
if ($this->_echoDebugLog) {
echo $cellReference,
($this->_cellStack->count() > 0 ? ' => ' : ''),
$message,
PHP_EOL;
}
$this->_debugLog[] = $cellReference .
($this->_cellStack->count() > 0 ? ' => ' : '') .
$message;
}
} // function _writeDebug()
public function clearLog() {
$this->_debugLog = array();
} // function flushLogger()
public function getLog() {
return $this->_debugLog;
} // function flushLogger()
} // class PHPExcel_CalcEngine_Logger

File diff suppressed because it is too large Load Diff

View File

@ -67,7 +67,9 @@ class PHPExcel_Calculation_Token_Stack {
} // function last() } // function last()
function __construct() { function clear() {
$this->_stack = array();
$this->_count = 0;
} }
} // class PHPExcel_Calculation_Token_Stack } // class PHPExcel_Calculation_Token_Stack

View File

@ -50,13 +50,6 @@ class PHPExcel_Cell
*/ */
private static $_valueBinder = NULL; private static $_valueBinder = NULL;
/**
* Cell Address (e.g. A1)
*
* @var string
*/
private $_coordinate;
/** /**
* Value of the cell * Value of the cell
* *
@ -86,7 +79,7 @@ class PHPExcel_Cell
/** /**
* Parent worksheet * Parent worksheet
* *
* @var PHPExcel_Worksheet * @var PHPExcel_CachedObjectStorage_CacheBase
*/ */
private $_parent; private $_parent;
@ -110,7 +103,8 @@ class PHPExcel_Cell
* @return void * @return void
**/ **/
public function notifyCacheController() { public function notifyCacheController() {
$this->_parent->getCellCacheController()->updateCacheData($this); $this->_parent->updateCacheData($this);
return $this; return $this;
} }
@ -118,7 +112,9 @@ class PHPExcel_Cell
$this->_parent = NULL; $this->_parent = NULL;
} }
public function attach($parent) { public function attach(PHPExcel_CachedObjectStorage_CacheBase $parent) {
$this->_parent = $parent; $this->_parent = $parent;
} }
@ -126,23 +122,18 @@ class PHPExcel_Cell
/** /**
* Create a new Cell * Create a new Cell
* *
* @param string $pColumn
* @param int $pRow
* @param mixed $pValue * @param mixed $pValue
* @param string $pDataType * @param string $pDataType
* @param PHPExcel_Worksheet $pSheet * @param PHPExcel_Worksheet $pSheet
* @throws PHPExcel_Exception * @throws PHPExcel_Exception
*/ */
public function __construct($pCoordinate = 'A1', $pValue = NULL, $pDataType = NULL, PHPExcel_Worksheet $pSheet = NULL) public function __construct($pValue = NULL, $pDataType = NULL, PHPExcel_Worksheet $pSheet = NULL)
{ {
// Initialise cell coordinate
$this->_coordinate = strtoupper($pCoordinate);
// Initialise cell value // Initialise cell value
$this->_value = $pValue; $this->_value = $pValue;
// Set worksheet // Set worksheet cache
$this->_parent = $pSheet; $this->_parent = $pSheet->getCellCacheController();
// Set datatype? // Set datatype?
if ($pDataType !== NULL) { if ($pDataType !== NULL) {
@ -166,8 +157,7 @@ class PHPExcel_Cell
*/ */
public function getColumn() public function getColumn()
{ {
list($column) = sscanf($this->_coordinate, '%[A-Z]%d'); return $this->_parent->getCurrentColumn();
return $column;
} }
/** /**
@ -177,8 +167,7 @@ class PHPExcel_Cell
*/ */
public function getRow() public function getRow()
{ {
list(,$row) = sscanf($this->_coordinate, '%[A-Z]%d'); return $this->_parent->getCurrentRow();
return $row;
} }
/** /**
@ -188,7 +177,7 @@ class PHPExcel_Cell
*/ */
public function getCoordinate() public function getCoordinate()
{ {
return $this->_coordinate; return $this->_parent->getCurrentAddress();
} }
/** /**
@ -210,7 +199,7 @@ class PHPExcel_Cell
{ {
return (string) PHPExcel_Style_NumberFormat::toFormattedString( return (string) PHPExcel_Style_NumberFormat::toFormattedString(
$this->getCalculatedValue(), $this->getCalculatedValue(),
$this->_parent->getParent()->getCellXfByIndex($this->getXfIndex()) $this->getWorksheet()->getParent()->getCellXfByIndex($this->getXfIndex())
->getNumberFormat()->getFormatCode() ->getNumberFormat()->getFormatCode()
); );
} }
@ -284,31 +273,39 @@ class PHPExcel_Cell
*/ */
public function getCalculatedValue($resetLog = TRUE) public function getCalculatedValue($resetLog = TRUE)
{ {
// echo 'Cell '.$this->getCoordinate().' value is a '.$this->_dataType.' with a value of '.$this->getValue().'<br />'; //echo 'Cell '.$this->getCoordinate().' value is a '.$this->_dataType.' with a value of '.$this->getValue().PHP_EOL;
if ($this->_dataType == PHPExcel_Cell_DataType::TYPE_FORMULA) { if ($this->_dataType == PHPExcel_Cell_DataType::TYPE_FORMULA) {
try { try {
// echo 'Cell value for '.$this->getCoordinate().' is a formula: Calculating value<br />'; //echo 'Cell value for '.$this->getCoordinate().' is a formula: Calculating value'.PHP_EOL;
$result = PHPExcel_Calculation::getInstance()->calculateCellValue($this,$resetLog); $result = PHPExcel_Calculation::getInstance(
// echo $this->getCoordinate().' calculation result is '.$result.'<br />'; $this->getWorksheet()->getParent()
)->calculateCellValue($this,$resetLog);
//echo $this->getCoordinate().' calculation result is '.$result.PHP_EOL;
// We don't yet handle array returns
if (is_array($result)) {
while (is_array($result)) {
$result = array_pop($result);
}
}
} catch ( PHPExcel_Exception $ex ) { } catch ( PHPExcel_Exception $ex ) {
if (($ex->getMessage() === 'Unable to access External Workbook') && ($this->_calculatedValue !== NULL)) { if (($ex->getMessage() === 'Unable to access External Workbook') && ($this->_calculatedValue !== NULL)) {
// echo 'Returning fallback value of '.$this->_calculatedValue.' for cell '.$this->getCoordinate().'<br />'; //echo 'Returning fallback value of '.$this->_calculatedValue.' for cell '.$this->getCoordinate().PHP_EOL;
return $this->_calculatedValue; // Fallback for calculations referencing external files. return $this->_calculatedValue; // Fallback for calculations referencing external files.
} }
// echo 'Calculation Exception: '.$ex->getMessage().'<br />'; //echo 'Calculation Exception: '.$ex->getMessage().PHP_EOL;
$result = '#N/A'; $result = '#N/A';
throw( throw(
new PHPExcel_Calculation_Exception( new PHPExcel_Calculation_Exception(
$this->getParent()->getTitle().'!'.$this->getCoordinate().' -> '.$ex->getMessage() $this->getWorksheet()->getTitle().'!'.$this->getCoordinate().' -> '.$ex->getMessage()
) )
); );
} }
if ($result === '#Not Yet Implemented') { if ($result === '#Not Yet Implemented') {
// echo 'Returning fallback value of '.$this->_calculatedValue.' for cell '.$this->getCoordinate().'<br />'; //echo 'Returning fallback value of '.$this->_calculatedValue.' for cell '.$this->getCoordinate().PHP_EOL;
return $this->_calculatedValue; // Fallback if calculation engine does not support the formula. return $this->_calculatedValue; // Fallback if calculation engine does not support the formula.
} }
// echo 'Returning calculated value of '.$result.' for cell '.$this->getCoordinate().'<br />'; //echo 'Returning calculated value of '.$result.' for cell '.$this->getCoordinate().PHP_EOL;
return $result; return $result;
} }
@ -388,7 +385,7 @@ class PHPExcel_Cell
throw new PHPExcel_Exception('Cannot check for data validation when cell is not bound to a worksheet'); throw new PHPExcel_Exception('Cannot check for data validation when cell is not bound to a worksheet');
} }
return $this->_parent->dataValidationExists($this->getCoordinate()); return $this->getWorksheet()->dataValidationExists($this->getCoordinate());
} }
/** /**
@ -403,7 +400,7 @@ class PHPExcel_Cell
throw new PHPExcel_Exception('Cannot get data validation for cell that is not bound to a worksheet'); throw new PHPExcel_Exception('Cannot get data validation for cell that is not bound to a worksheet');
} }
return $this->_parent->getDataValidation($this->getCoordinate()); return $this->getWorksheet()->getDataValidation($this->getCoordinate());
} }
/** /**
@ -419,7 +416,7 @@ class PHPExcel_Cell
throw new PHPExcel_Exception('Cannot set data validation for cell that is not bound to a worksheet'); throw new PHPExcel_Exception('Cannot set data validation for cell that is not bound to a worksheet');
} }
$this->_parent->setDataValidation($this->getCoordinate(), $pDataValidation); $this->getWorksheet()->setDataValidation($this->getCoordinate(), $pDataValidation);
return $this->notifyCacheController(); return $this->notifyCacheController();
} }
@ -436,7 +433,7 @@ class PHPExcel_Cell
throw new PHPExcel_Exception('Cannot check for hyperlink when cell is not bound to a worksheet'); throw new PHPExcel_Exception('Cannot check for hyperlink when cell is not bound to a worksheet');
} }
return $this->_parent->hyperlinkExists($this->getCoordinate()); return $this->getWorksheet()->hyperlinkExists($this->getCoordinate());
} }
/** /**
@ -451,7 +448,7 @@ class PHPExcel_Cell
throw new PHPExcel_Exception('Cannot get hyperlink for cell that is not bound to a worksheet'); throw new PHPExcel_Exception('Cannot get hyperlink for cell that is not bound to a worksheet');
} }
return $this->_parent->getHyperlink($this->getCoordinate()); return $this->getWorksheet()->getHyperlink($this->getCoordinate());
} }
/** /**
@ -467,7 +464,7 @@ class PHPExcel_Cell
throw new PHPExcel_Exception('Cannot set hyperlink for cell that is not bound to a worksheet'); throw new PHPExcel_Exception('Cannot set hyperlink for cell that is not bound to a worksheet');
} }
$this->_parent->setHyperlink($this->getCoordinate(), $pHyperlink); $this->getWorksheet()->setHyperlink($this->getCoordinate(), $pHyperlink);
return $this->notifyCacheController(); return $this->notifyCacheController();
} }
@ -481,6 +478,15 @@ class PHPExcel_Cell
return $this->_parent; return $this->_parent;
} }
/**
* Get parent worksheet
*
* @return PHPExcel_Worksheet
*/
public function getWorksheet() {
return $this->_parent->getParent();
}
/** /**
* Re-bind parent * Re-bind parent
* *
@ -488,7 +494,7 @@ class PHPExcel_Cell
* @return PHPExcel_Cell * @return PHPExcel_Cell
*/ */
public function rebindParent(PHPExcel_Worksheet $parent) { public function rebindParent(PHPExcel_Worksheet $parent) {
$this->_parent = $parent; $this->_parent = $parent->getCellCacheController();
return $this->notifyCacheController(); return $this->notifyCacheController();
} }
@ -859,11 +865,11 @@ class PHPExcel_Cell
*/ */
public static function compareCells(PHPExcel_Cell $a, PHPExcel_Cell $b) public static function compareCells(PHPExcel_Cell $a, PHPExcel_Cell $b)
{ {
if ($a->_row < $b->_row) { if ($a->getRow() < $b->getRow()) {
return -1; return -1;
} elseif ($a->_row > $b->_row) { } elseif ($a->getRow() > $b->getRow()) {
return 1; return 1;
} elseif (self::columnIndexFromString($a->_column) < self::columnIndexFromString($b->_column)) { } elseif (self::columnIndexFromString($a->getColumn()) < self::columnIndexFromString($b->getColumn())) {
return -1; return -1;
} else { } else {
return 1; return 1;

View File

@ -86,7 +86,7 @@ class PHPExcel_Cell_AdvancedValueBinder extends PHPExcel_Cell_DefaultValueBinder
if ($matches[1] == '-') $value = 0 - $value; if ($matches[1] == '-') $value = 0 - $value;
$cell->setValueExplicit( (float) $value, PHPExcel_Cell_DataType::TYPE_NUMERIC); $cell->setValueExplicit( (float) $value, PHPExcel_Cell_DataType::TYPE_NUMERIC);
// Set style // Set style
$cell->getParent()->getStyle( $cell->getCoordinate() ) $cell->getWorksheet()->getStyle( $cell->getCoordinate() )
->getNumberFormat()->setFormatCode( '??/??' ); ->getNumberFormat()->setFormatCode( '??/??' );
return true; return true;
} elseif (preg_match('/^([+-]?)([0-9]*) +([0-9]*)\s?\/\s*([0-9]*)$/', $value, $matches)) { } elseif (preg_match('/^([+-]?)([0-9]*) +([0-9]*)\s?\/\s*([0-9]*)$/', $value, $matches)) {
@ -95,7 +95,7 @@ class PHPExcel_Cell_AdvancedValueBinder extends PHPExcel_Cell_DefaultValueBinder
if ($matches[1] == '-') $value = 0 - $value; if ($matches[1] == '-') $value = 0 - $value;
$cell->setValueExplicit( (float) $value, PHPExcel_Cell_DataType::TYPE_NUMERIC); $cell->setValueExplicit( (float) $value, PHPExcel_Cell_DataType::TYPE_NUMERIC);
// Set style // Set style
$cell->getParent()->getStyle( $cell->getCoordinate() ) $cell->getWorksheet()->getStyle( $cell->getCoordinate() )
->getNumberFormat()->setFormatCode( '# ??/??' ); ->getNumberFormat()->setFormatCode( '# ??/??' );
return true; return true;
} }
@ -106,7 +106,7 @@ class PHPExcel_Cell_AdvancedValueBinder extends PHPExcel_Cell_DefaultValueBinder
$value = (float) str_replace('%', '', $value) / 100; $value = (float) str_replace('%', '', $value) / 100;
$cell->setValueExplicit( $value, PHPExcel_Cell_DataType::TYPE_NUMERIC); $cell->setValueExplicit( $value, PHPExcel_Cell_DataType::TYPE_NUMERIC);
// Set style // Set style
$cell->getParent()->getStyle( $cell->getCoordinate() ) $cell->getWorksheet()->getStyle( $cell->getCoordinate() )
->getNumberFormat()->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE_00 ); ->getNumberFormat()->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE_00 );
return true; return true;
} }
@ -120,7 +120,7 @@ class PHPExcel_Cell_AdvancedValueBinder extends PHPExcel_Cell_DefaultValueBinder
$value = (float) trim(str_replace(array($currencyCode, $thousandsSeparator, $decimalSeparator), array('', '', '.'), $value)); $value = (float) trim(str_replace(array($currencyCode, $thousandsSeparator, $decimalSeparator), array('', '', '.'), $value));
$cell->setValueExplicit( $value, PHPExcel_Cell_DataType::TYPE_NUMERIC); $cell->setValueExplicit( $value, PHPExcel_Cell_DataType::TYPE_NUMERIC);
// Set style // Set style
$cell->getParent()->getStyle( $cell->getCoordinate() ) $cell->getWorksheet()->getStyle( $cell->getCoordinate() )
->getNumberFormat()->setFormatCode( ->getNumberFormat()->setFormatCode(
str_replace('$', $currencyCode, PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE ) str_replace('$', $currencyCode, PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE )
); );
@ -130,7 +130,7 @@ class PHPExcel_Cell_AdvancedValueBinder extends PHPExcel_Cell_DefaultValueBinder
$value = (float) trim(str_replace(array('$',','), '', $value)); $value = (float) trim(str_replace(array('$',','), '', $value));
$cell->setValueExplicit( $value, PHPExcel_Cell_DataType::TYPE_NUMERIC); $cell->setValueExplicit( $value, PHPExcel_Cell_DataType::TYPE_NUMERIC);
// Set style // Set style
$cell->getParent()->getStyle( $cell->getCoordinate() ) $cell->getWorksheet()->getStyle( $cell->getCoordinate() )
->getNumberFormat()->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE ); ->getNumberFormat()->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_USD_SIMPLE );
return true; return true;
} }
@ -142,7 +142,7 @@ class PHPExcel_Cell_AdvancedValueBinder extends PHPExcel_Cell_DefaultValueBinder
$days = $h / 24 + $m / 1440; $days = $h / 24 + $m / 1440;
$cell->setValueExplicit($days, PHPExcel_Cell_DataType::TYPE_NUMERIC); $cell->setValueExplicit($days, PHPExcel_Cell_DataType::TYPE_NUMERIC);
// Set style // Set style
$cell->getParent()->getStyle( $cell->getCoordinate() ) $cell->getWorksheet()->getStyle( $cell->getCoordinate() )
->getNumberFormat()->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME3 ); ->getNumberFormat()->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME3 );
return true; return true;
} }
@ -155,7 +155,7 @@ class PHPExcel_Cell_AdvancedValueBinder extends PHPExcel_Cell_DefaultValueBinder
// Convert value to number // Convert value to number
$cell->setValueExplicit($days, PHPExcel_Cell_DataType::TYPE_NUMERIC); $cell->setValueExplicit($days, PHPExcel_Cell_DataType::TYPE_NUMERIC);
// Set style // Set style
$cell->getParent()->getStyle( $cell->getCoordinate() ) $cell->getWorksheet()->getStyle( $cell->getCoordinate() )
->getNumberFormat()->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4 ); ->getNumberFormat()->setFormatCode( PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4 );
return true; return true;
} }
@ -170,7 +170,7 @@ class PHPExcel_Cell_AdvancedValueBinder extends PHPExcel_Cell_DefaultValueBinder
} else { } else {
$formatCode = 'yyyy-mm-dd'; $formatCode = 'yyyy-mm-dd';
} }
$cell->getParent()->getStyle( $cell->getCoordinate() ) $cell->getWorksheet()->getStyle( $cell->getCoordinate() )
->getNumberFormat()->setFormatCode($formatCode); ->getNumberFormat()->setFormatCode($formatCode);
return true; return true;
} }
@ -180,7 +180,7 @@ class PHPExcel_Cell_AdvancedValueBinder extends PHPExcel_Cell_DefaultValueBinder
$value = PHPExcel_Shared_String::SanitizeUTF8($value); $value = PHPExcel_Shared_String::SanitizeUTF8($value);
$cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING); $cell->setValueExplicit($value, PHPExcel_Cell_DataType::TYPE_STRING);
// Set style // Set style
$cell->getParent()->getStyle( $cell->getCoordinate() ) $cell->getWorksheet()->getStyle( $cell->getCoordinate() )
->getAlignment()->setWrapText(TRUE); ->getAlignment()->setWrapText(TRUE);
return true; return true;
} }

View File

@ -279,7 +279,7 @@ class PHPExcel_Chart_DataSeriesValues
public function refresh(PHPExcel_Worksheet $worksheet, $flatten = TRUE) { public function refresh(PHPExcel_Worksheet $worksheet, $flatten = TRUE) {
if ($this->_dataSource !== NULL) { if ($this->_dataSource !== NULL) {
$calcEngine = PHPExcel_Calculation::getInstance(); $calcEngine = PHPExcel_Calculation::getInstance($worksheet->getParent());
$newDataValues = PHPExcel_Calculation::_unwrapResult( $newDataValues = PHPExcel_Calculation::_unwrapResult(
$calcEngine->_calculateFormulaValue( $calcEngine->_calculateFormulaValue(
'='.$this->_dataSource, '='.$this->_dataSource,

View File

@ -204,7 +204,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
* *
* @var PHPExcel_Worksheet_AutoFilter * @var PHPExcel_Worksheet_AutoFilter
*/ */
private $_autoFilter = null; private $_autoFilter = NULL;
/** /**
* Freeze pane * Freeze pane
@ -362,12 +362,12 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
$this->_protection = new PHPExcel_Worksheet_Protection(); $this->_protection = new PHPExcel_Worksheet_Protection();
// Default row dimension // Default row dimension
$this->_defaultRowDimension = new PHPExcel_Worksheet_RowDimension(null); $this->_defaultRowDimension = new PHPExcel_Worksheet_RowDimension(NULL);
// Default column dimension // Default column dimension
$this->_defaultColumnDimension = new PHPExcel_Worksheet_ColumnDimension(null); $this->_defaultColumnDimension = new PHPExcel_Worksheet_ColumnDimension(NULL);
$this->_autoFilter = new PHPExcel_Worksheet_AutoFilter(null, $this); $this->_autoFilter = new PHPExcel_Worksheet_AutoFilter(NULL, $this);
} }
@ -376,11 +376,10 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
* typically so that the worksheet object can be unset * typically so that the worksheet object can be unset
* *
*/ */
public function disconnectCells() public function disconnectCells() {
{ if ( $this->_cellCollection !== NULL){
if ( $this->_cellCollection != null ){
$this->_cellCollection->unsetWorksheetCells(); $this->_cellCollection->unsetWorksheetCells();
$this->_cellCollection = null; $this->_cellCollection = NULL;
} }
// detach ourself from the workbook, so that it can then delete this worksheet successfully // detach ourself from the workbook, so that it can then delete this worksheet successfully
$this->_parent = null; $this->_parent = null;
@ -391,9 +390,10 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
* *
*/ */
function __destruct() { function __destruct() {
if ($this->_cellCollection !== null) { PHPExcel_Calculation::getInstance($this->_parent)
$this->disconnectCells(); ->clearCalculationCacheForWorksheet($this->_title);
}
$this->disconnectCells();
} }
/** /**
@ -401,8 +401,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
* *
* @return PHPExcel_CachedObjectStorage_xxx * @return PHPExcel_CachedObjectStorage_xxx
*/ */
public function getCellCacheController() public function getCellCacheController() {
{
return $this->_cellCollection; return $this->_cellCollection;
} // function getCellCacheController() } // function getCellCacheController()
@ -451,7 +450,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
// Re-order cell collection // Re-order cell collection
return $this->sortCellCollection(); return $this->sortCellCollection();
} }
if ($this->_cellCollection !== null) { if ($this->_cellCollection !== NULL) {
return $this->_cellCollection->getCellList(); return $this->_cellCollection->getCellList();
} }
return array(); return array();
@ -464,7 +463,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
*/ */
public function sortCellCollection() public function sortCellCollection()
{ {
if ($this->_cellCollection !== null) { if ($this->_cellCollection !== NULL) {
return $this->_cellCollection->getSortedCellList(); return $this->_cellCollection->getSortedCellList();
} }
return array(); return array();
@ -709,21 +708,22 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
// loop through all cells in the worksheet // loop through all cells in the worksheet
foreach ($this->getCellCollection(false) as $cellID) { foreach ($this->getCellCollection(false) as $cellID) {
$cell = $this->getCell($cellID); $cell = $this->getCell($cellID);
if (isset($autoSizes[$cell->getColumn()])) { if (isset($autoSizes[$this->_cellCollection->getCurrentColumn()])) {
// Determine width if cell does not participate in a merge // Determine width if cell does not participate in a merge
if (!isset($isMergeCell[$cell->getCoordinate()])) { if (!isset($isMergeCell[$this->_cellCollection->getCurrentAddress()])) {
// Calculated value // Calculated value
$cellValue = $cell->getCalculatedValue();
// To formatted string // To formatted string
$cellValue = PHPExcel_Style_NumberFormat::toFormattedString($cellValue, $this->getParent()->getCellXfByIndex($cell->getXfIndex())->getNumberFormat()->getFormatCode()); $cellValue = PHPExcel_Style_NumberFormat::toFormattedString(
$cell->getCalculatedValue(),
$this->getParent()->getCellXfByIndex($cell->getXfIndex())->getNumberFormat()->getFormatCode()
);
$autoSizes[$cell->getColumn()] = max( $autoSizes[$this->_cellCollection->getCurrentColumn()] = max(
(float)$autoSizes[$cell->getColumn()], (float) $autoSizes[$this->_cellCollection->getCurrentColumn()],
(float)PHPExcel_Shared_Font::calculateColumnWidth( (float)PHPExcel_Shared_Font::calculateColumnWidth(
$this->getParent()->getCellXfByIndex($cell->getXfIndex())->getFont(), $this->getParent()->getCellXfByIndex($cell->getXfIndex())->getFont(),
$cellValue, $cellValue,
$this->getParent()->getCellXfByIndex($cell->getXfIndex())->getAlignment()->getTextRotation(), $this->getParent()->getCellXfByIndex($cell->getXfIndex())->getAlignment()->getTextRotation(),
$this->getDefaultStyle()->getFont() $this->getDefaultStyle()->getFont()
) )
); );
@ -746,8 +746,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
* *
* @return PHPExcel * @return PHPExcel
*/ */
public function getParent() public function getParent() {
{
return $this->_parent; return $this->_parent;
} }
@ -757,8 +756,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
* @param PHPExcel $parent * @param PHPExcel $parent
* @return PHPExcel_Worksheet * @return PHPExcel_Worksheet
*/ */
public function rebindParent(PHPExcel $parent) public function rebindParent(PHPExcel $parent) {
{
$namedRanges = $this->_parent->getNamedRanges(); $namedRanges = $this->_parent->getNamedRanges();
foreach ($namedRanges as $namedRange) { foreach ($namedRanges as $namedRange) {
$parent->addNamedRange($namedRange); $parent->addNamedRange($namedRange);
@ -791,7 +789,6 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
* This should be left as the default true, unless you are * This should be left as the default true, unless you are
* certain that no formula cells on any worksheet contain * certain that no formula cells on any worksheet contain
* references to this worksheet * references to this worksheet
*
* @return PHPExcel_Worksheet * @return PHPExcel_Worksheet
*/ */
public function setTitle($pValue = 'Worksheet', $updateFormulaCellReferences = true) public function setTitle($pValue = 'Worksheet', $updateFormulaCellReferences = true)
@ -807,16 +804,16 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
// Old title // Old title
$oldTitle = $this->getTitle(); $oldTitle = $this->getTitle();
if ($this->getParent()) { if ($this->_parent) {
// Is there already such sheet name? // Is there already such sheet name?
if ($this->getParent()->sheetNameExists($pValue)) { if ($this->_parent->sheetNameExists($pValue)) {
// Use name, but append with lowest possible integer // Use name, but append with lowest possible integer
if (PHPExcel_Shared_String::CountCharacters($pValue) > 29) { if (PHPExcel_Shared_String::CountCharacters($pValue) > 29) {
$pValue = PHPExcel_Shared_String::Substring($pValue,0,29); $pValue = PHPExcel_Shared_String::Substring($pValue,0,29);
} }
$i = 1; $i = 1;
while ($this->getParent()->sheetNameExists($pValue . ' ' . $i)) { while ($this->_parent->sheetNameExists($pValue . ' ' . $i)) {
++$i; ++$i;
if ($i == 10) { if ($i == 10) {
if (PHPExcel_Shared_String::CountCharacters($pValue) > 28) { if (PHPExcel_Shared_String::CountCharacters($pValue) > 28) {
@ -838,11 +835,13 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
$this->_title = $pValue; $this->_title = $pValue;
$this->_dirty = true; $this->_dirty = true;
if ($this->getParent()) { if ($this->_parent) {
// New title // New title
$newTitle = $this->getTitle(); $newTitle = $this->getTitle();
PHPExcel_Calculation::getInstance($this->_parent)
->renameCalculationCacheForWorksheet($oldTitle, $newTitle);
if ($updateFormulaCellReferences) if ($updateFormulaCellReferences)
PHPExcel_ReferenceHelper::getInstance()->updateNamedFormulas($this->getParent(), $oldTitle, $newTitle); PHPExcel_ReferenceHelper::getInstance()->updateNamedFormulas($this->_parent, $oldTitle, $newTitle);
} }
return $this; return $this;
@ -853,8 +852,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
* *
* @return string Sheet state (visible, hidden, veryHidden) * @return string Sheet state (visible, hidden, veryHidden)
*/ */
public function getSheetState() public function getSheetState() {
{
return $this->_sheetState; return $this->_sheetState;
} }
@ -864,8 +862,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
* @param string $value Sheet state (visible, hidden, veryHidden) * @param string $value Sheet state (visible, hidden, veryHidden)
* @return PHPExcel_Worksheet * @return PHPExcel_Worksheet
*/ */
public function setSheetState($value = PHPExcel_Worksheet::SHEETSTATE_VISIBLE) public function setSheetState($value = PHPExcel_Worksheet::SHEETSTATE_VISIBLE) {
{
$this->_sheetState = $value; $this->_sheetState = $value;
return $this; return $this;
} }
@ -1110,14 +1107,14 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
// Worksheet reference? // Worksheet reference?
if (strpos($pCoordinate, '!') !== false) { if (strpos($pCoordinate, '!') !== false) {
$worksheetReference = PHPExcel_Worksheet::extractSheetTitle($pCoordinate, true); $worksheetReference = PHPExcel_Worksheet::extractSheetTitle($pCoordinate, true);
return $this->getParent()->getSheetByName($worksheetReference[0])->getCell($worksheetReference[1]); return $this->_parent->getSheetByName($worksheetReference[0])->getCell($worksheetReference[1]);
} }
// Named range? // Named range?
if ((!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_CELLREF.'$/i', $pCoordinate, $matches)) && if ((!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_CELLREF.'$/i', $pCoordinate, $matches)) &&
(preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_NAMEDRANGE.'$/i', $pCoordinate, $matches))) { (preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_NAMEDRANGE.'$/i', $pCoordinate, $matches))) {
$namedRange = PHPExcel_NamedRange::resolveRange($pCoordinate, $this); $namedRange = PHPExcel_NamedRange::resolveRange($pCoordinate, $this);
if ($namedRange !== null) { if ($namedRange !== NULL) {
$pCoordinate = $namedRange->getRange(); $pCoordinate = $namedRange->getRange();
return $namedRange->getWorksheet()->getCell($pCoordinate); return $namedRange->getWorksheet()->getCell($pCoordinate);
} }
@ -1136,7 +1133,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
// Coordinates // Coordinates
$aCoordinates = PHPExcel_Cell::coordinateFromString($pCoordinate); $aCoordinates = PHPExcel_Cell::coordinateFromString($pCoordinate);
$cell = $this->_cellCollection->addCacheData($pCoordinate,new PHPExcel_Cell($pCoordinate, null, PHPExcel_Cell_DataType::TYPE_NULL, $this)); $cell = $this->_cellCollection->addCacheData($pCoordinate,new PHPExcel_Cell(NULL, PHPExcel_Cell_DataType::TYPE_NULL, $this));
$this->_cellCollectionIsSorted = false; $this->_cellCollectionIsSorted = false;
if (PHPExcel_Cell::columnIndexFromString($this->_cachedHighestColumn) < PHPExcel_Cell::columnIndexFromString($aCoordinates[0])) if (PHPExcel_Cell::columnIndexFromString($this->_cachedHighestColumn) < PHPExcel_Cell::columnIndexFromString($aCoordinates[0]))
@ -1176,7 +1173,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
$coordinate = $columnLetter . $pRow; $coordinate = $columnLetter . $pRow;
if (!$this->_cellCollection->isDataSet($coordinate)) { if (!$this->_cellCollection->isDataSet($coordinate)) {
$cell = $this->_cellCollection->addCacheData($coordinate, new PHPExcel_Cell($coordinate, null, PHPExcel_Cell_DataType::TYPE_NULL, $this)); $cell = $this->_cellCollection->addCacheData($coordinate, new PHPExcel_Cell(NULL, PHPExcel_Cell_DataType::TYPE_NULL, $this));
$this->_cellCollectionIsSorted = false; $this->_cellCollectionIsSorted = false;
if (PHPExcel_Cell::columnIndexFromString($this->_cachedHighestColumn) < $pColumn) if (PHPExcel_Cell::columnIndexFromString($this->_cachedHighestColumn) < $pColumn)
@ -1202,14 +1199,14 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
// Worksheet reference? // Worksheet reference?
if (strpos($pCoordinate, '!') !== false) { if (strpos($pCoordinate, '!') !== false) {
$worksheetReference = PHPExcel_Worksheet::extractSheetTitle($pCoordinate, true); $worksheetReference = PHPExcel_Worksheet::extractSheetTitle($pCoordinate, true);
return $this->getParent()->getSheetByName($worksheetReference[0])->cellExists($worksheetReference[1]); return $this->_parent->getSheetByName($worksheetReference[0])->cellExists($worksheetReference[1]);
} }
// Named range? // Named range?
if ((!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_CELLREF.'$/i', $pCoordinate, $matches)) && if ((!preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_CELLREF.'$/i', $pCoordinate, $matches)) &&
(preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_NAMEDRANGE.'$/i', $pCoordinate, $matches))) { (preg_match('/^'.PHPExcel_Calculation::CALCULATION_REGEXP_NAMEDRANGE.'$/i', $pCoordinate, $matches))) {
$namedRange = PHPExcel_NamedRange::resolveRange($pCoordinate, $this); $namedRange = PHPExcel_NamedRange::resolveRange($pCoordinate, $this);
if ($namedRange !== null) { if ($namedRange !== NULL) {
$pCoordinate = $namedRange->getRange(); $pCoordinate = $namedRange->getRange();
if ($this->getHashCode() != $namedRange->getWorksheet()->getHashCode()) { if ($this->getHashCode() != $namedRange->getWorksheet()->getHashCode()) {
if (!$namedRange->getLocalOnly()) { if (!$namedRange->getLocalOnly()) {
@ -1522,7 +1519,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
* *
* Please note that this will overwrite existing cell styles for cells in range! * Please note that this will overwrite existing cell styles for cells in range!
* *
* @param [PHPExcel_Style_Conditional] $pCellStyle Cell style to duplicate * @param array of PHPExcel_Style_Conditional $pCellStyle Cell style to duplicate
* @param string $pRange Range of cells (i.e. "A1:B10"), or just one cell (i.e. "A1") * @param string $pRange Range of cells (i.e. "A1:B10"), or just one cell (i.e. "A1")
* @throws PHPExcel_Exception * @throws PHPExcel_Exception
* @return PHPExcel_Worksheet * @return PHPExcel_Worksheet
@ -1899,7 +1896,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
*/ */
public function removeAutoFilter() public function removeAutoFilter()
{ {
$this->_autoFilter->setRange(null); $this->_autoFilter->setRange(NULL);
return $this; return $this;
} }
@ -2179,7 +2176,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
/** /**
* Set comments array for the entire sheet. * Set comments array for the entire sheet.
* *
* @param [PHPExcel_Comment] $pValue * @param array of PHPExcel_Comment
* @return PHPExcel_Worksheet * @return PHPExcel_Worksheet
*/ */
public function setComments($pValue = array()) public function setComments($pValue = array())
@ -2397,10 +2394,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
* True - Return rows and columns indexed by their actual row and column IDs * True - Return rows and columns indexed by their actual row and column IDs
* @return array * @return array
*/ */
public function rangeToArray( public function rangeToArray($pRange = 'A1', $nullValue = null, $calculateFormulas = true, $formatData = true, $returnCellRef = false) {
$pRange = 'A1', $nullValue = null, $calculateFormulas = true,
$formatData = true, $returnCellRef = false)
{
// Returnvalue // Returnvalue
$returnValue = array(); $returnValue = array();
// Identify the range that we need to extract from the worksheet // Identify the range that we need to extract from the worksheet
@ -2445,7 +2439,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
); );
} }
} else { } else {
// Cell holds a null // Cell holds a NULL
$returnValue[$rRef][$cRef] = $nullValue; $returnValue[$rRef][$cRef] = $nullValue;
} }
} else { } else {
@ -2472,20 +2466,14 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
* @return array * @return array
* @throws PHPExcel_Exception * @throws PHPExcel_Exception
*/ */
public function namedRangeToArray( public function namedRangeToArray($pNamedRange = '', $nullValue = null, $calculateFormulas = true, $formatData = true, $returnCellRef = false) {
$pNamedRange = '', $nullValue = null, $calculateFormulas = true,
$formatData = true, $returnCellRef = false
)
{
$namedRange = PHPExcel_NamedRange::resolveRange($pNamedRange, $this); $namedRange = PHPExcel_NamedRange::resolveRange($pNamedRange, $this);
if ($namedRange !== null) { if ($namedRange !== NULL) {
$pWorkSheet = $namedRange->getWorksheet(); $pWorkSheet = $namedRange->getWorksheet();
$pCellRange = $namedRange->getRange(); $pCellRange = $namedRange->getRange();
return $pWorkSheet->rangeToArray( return $pWorkSheet->rangeToArray( $pCellRange,
$pCellRange, $nullValue, $calculateFormulas, $formatData, $returnCellRef);
$nullValue, $calculateFormulas, $formatData, $returnCellRef
);
} }
throw new PHPExcel_Exception('Named Range '.$pNamedRange.' does not exist.'); throw new PHPExcel_Exception('Named Range '.$pNamedRange.' does not exist.');
@ -2502,8 +2490,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
* True - Return rows and columns indexed by their actual row and column IDs * True - Return rows and columns indexed by their actual row and column IDs
* @return array * @return array
*/ */
public function toArray($nullValue = null, $calculateFormulas = true, $formatData = true, $returnCellRef = false) public function toArray($nullValue = null, $calculateFormulas = true, $formatData = true, $returnCellRef = false) {
{
// Garbage collect... // Garbage collect...
$this->garbageCollect(); $this->garbageCollect();
@ -2511,10 +2498,8 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
$maxCol = $this->getHighestColumn(); $maxCol = $this->getHighestColumn();
$maxRow = $this->getHighestRow(); $maxRow = $this->getHighestRow();
// Return // Return
return $this->rangeToArray( return $this->rangeToArray( 'A1:'.$maxCol.$maxRow,
'A1:'.$maxCol.$maxRow, $nullValue, $calculateFormulas, $formatData, $returnCellRef);
$nullValue, $calculateFormulas, $formatData, $returnCellRef
);
} }
/** /**
@ -2523,8 +2508,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
* @param integer $startRow The row number at which to start iterating * @param integer $startRow The row number at which to start iterating
* @return PHPExcel_Worksheet_RowIterator * @return PHPExcel_Worksheet_RowIterator
*/ */
public function getRowIterator($startRow = 1) public function getRowIterator($startRow = 1) {
{
return new PHPExcel_Worksheet_RowIterator($this,$startRow); return new PHPExcel_Worksheet_RowIterator($this,$startRow);
} }
@ -2533,8 +2517,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
* *
* @return PHPExcel_Worksheet * @return PHPExcel_Worksheet
*/ */
public function garbageCollect() public function garbageCollect() {
{
// Flush cache // Flush cache
$this->_cellCollection->getCacheData('A1'); $this->_cellCollection->getCacheData('A1');
// Build a reference table from images // Build a reference table from images
@ -2578,8 +2561,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
* *
* @return string Hash code * @return string Hash code
*/ */
public function getHashCode() public function getHashCode() {
{
if ($this->_dirty) { if ($this->_dirty) {
$this->_hash = md5( $this->_title . $this->_hash = md5( $this->_title .
$this->_autoFilter . $this->_autoFilter .
@ -2601,8 +2583,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
* @param bool $returnRange Return range? (see example) * @param bool $returnRange Return range? (see example)
* @return mixed * @return mixed
*/ */
public static function extractSheetTitle($pRange, $returnRange = false) public static function extractSheetTitle($pRange, $returnRange = false) {
{
// Sheet title included? // Sheet title included?
if (($sep = strpos($pRange, '!')) === false) { if (($sep = strpos($pRange, '!')) === false) {
return ''; return '';
@ -2733,8 +2714,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
* @param string $range * @param string $range
* @return string Adjusted range value * @return string Adjusted range value
*/ */
public function shrinkRangeToFit($range) public function shrinkRangeToFit($range) {
{
$maxCol = $this->getHighestColumn(); $maxCol = $this->getHighestColumn();
$maxRow = $this->getHighestRow(); $maxRow = $this->getHighestRow();
$maxCol = PHPExcel_Cell::columnIndexFromString($maxCol); $maxCol = PHPExcel_Cell::columnIndexFromString($maxCol);
@ -2762,7 +2742,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
*/ */
public function getTabColor() public function getTabColor()
{ {
if ($this->_tabColor === null) if ($this->_tabColor === NULL)
$this->_tabColor = new PHPExcel_Style_Color(); $this->_tabColor = new PHPExcel_Style_Color();
return $this->_tabColor; return $this->_tabColor;
@ -2788,7 +2768,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
*/ */
public function isTabColorSet() public function isTabColorSet()
{ {
return ($this->_tabColor !== null); return ($this->_tabColor !== NULL);
} }
/** /**
@ -2796,8 +2776,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
* *
* @return PHPExcel_Worksheet * @return PHPExcel_Worksheet
*/ */
public function copy() public function copy() {
{
$copied = clone $this; $copied = clone $this;
return $copied; return $copied;
@ -2806,8 +2785,7 @@ class PHPExcel_Worksheet implements PHPExcel_IComparable
/** /**
* Implement PHP __clone to create a deep clone, not just a shallow copy. * Implement PHP __clone to create a deep clone, not just a shallow copy.
*/ */
public function __clone() public function __clone() {
{
foreach ($this as $key => $val) { foreach ($this as $key => $val) {
if ($key == '_parent') { if ($key == '_parent') {
continue; continue;

View File

@ -102,8 +102,8 @@ class PHPExcel_Writer_CSV extends PHPExcel_Writer_Abstract implements PHPExcel_W
// Fetch sheet // Fetch sheet
$sheet = $this->_phpExcel->getSheet($this->_sheetIndex); $sheet = $this->_phpExcel->getSheet($this->_sheetIndex);
$saveDebugLog = PHPExcel_Calculation::getInstance()->writeDebugLog; $saveDebugLog = PHPExcel_Calculation::getInstance($this->_phpExcel)->getDebugLog()->getWriteDebugLog();
PHPExcel_Calculation::getInstance()->writeDebugLog = false; PHPExcel_Calculation::getInstance($this->_phpExcel)->getDebugLog()->setWriteDebugLog(FALSE);
$saveArrayReturnType = PHPExcel_Calculation::getArrayReturnType(); $saveArrayReturnType = PHPExcel_Calculation::getArrayReturnType();
PHPExcel_Calculation::setArrayReturnType(PHPExcel_Calculation::RETURN_ARRAY_AS_VALUE); PHPExcel_Calculation::setArrayReturnType(PHPExcel_Calculation::RETURN_ARRAY_AS_VALUE);
@ -139,7 +139,7 @@ class PHPExcel_Writer_CSV extends PHPExcel_Writer_Abstract implements PHPExcel_W
fclose($fileHandle); fclose($fileHandle);
PHPExcel_Calculation::setArrayReturnType($saveArrayReturnType); PHPExcel_Calculation::setArrayReturnType($saveArrayReturnType);
PHPExcel_Calculation::getInstance()->writeDebugLog = $saveDebugLog; PHPExcel_Calculation::getInstance($this->_phpExcel)->getDebugLog()->setWriteDebugLog($saveDebugLog);
} }
/** /**

View File

@ -179,8 +179,8 @@ class PHPExcel_Writer_Excel2007 extends PHPExcel_Writer_Abstract implements PHPE
} }
} }
$saveDebugLog = PHPExcel_Calculation::getInstance()->writeDebugLog; $saveDebugLog = PHPExcel_Calculation::getInstance($this->_spreadSheet)->getDebugLog()->getWriteDebugLog();
PHPExcel_Calculation::getInstance()->writeDebugLog = false; PHPExcel_Calculation::getInstance($this->_spreadSheet)->getDebugLog()->setWriteDebugLog(FALSE);
$saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType(); $saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType();
PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL); PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL);
@ -341,7 +341,7 @@ class PHPExcel_Writer_Excel2007 extends PHPExcel_Writer_Abstract implements PHPE
} }
PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType); PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType);
PHPExcel_Calculation::getInstance()->writeDebugLog = $saveDebugLog; PHPExcel_Calculation::getInstance($this->_spreadSheet)->getDebugLog()->setWriteDebugLog($saveDebugLog);
// Close file // Close file
if ($objZip->close() === false) { if ($objZip->close() === false) {

View File

@ -1074,12 +1074,9 @@ class PHPExcel_Writer_Excel2007_Worksheet extends PHPExcel_Writer_Excel2007_Writ
$objWriter->writeAttribute('t', $mappedType); $objWriter->writeAttribute('t', $mappedType);
break; break;
case 'f': // Formula case 'f': // Formula
$calculatedValue = null; $calculatedValue = ($this->getParentWriter()->getPreCalculateFormulas()) ?
if ($this->getParentWriter()->getPreCalculateFormulas()) { $pCell->getCalculatedValue() :
$calculatedValue = $pCell->getCalculatedValue(); $cellValue;
} else {
$calculatedValue = $cellValue;
}
if (is_string($calculatedValue)) { if (is_string($calculatedValue)) {
$objWriter->writeAttribute('t', 'str'); $objWriter->writeAttribute('t', 'str');
} }
@ -1125,7 +1122,7 @@ class PHPExcel_Writer_Excel2007_Worksheet extends PHPExcel_Writer_Excel2007_Writ
} }
if ($this->getParentWriter()->getOffice2003Compatibility() === false) { if ($this->getParentWriter()->getOffice2003Compatibility() === false) {
if ($this->getParentWriter()->getPreCalculateFormulas()) { if ($this->getParentWriter()->getPreCalculateFormulas()) {
$calculatedValue = $pCell->getCalculatedValue(); // $calculatedValue = $pCell->getCalculatedValue();
if (!is_array($calculatedValue) && substr($calculatedValue, 0, 1) != '#') { if (!is_array($calculatedValue) && substr($calculatedValue, 0, 1) != '#') {
$objWriter->writeElement('v', PHPExcel_Shared_String::FormatNumber($calculatedValue)); $objWriter->writeElement('v', PHPExcel_Shared_String::FormatNumber($calculatedValue));
} else { } else {

View File

@ -120,8 +120,8 @@ class PHPExcel_Writer_Excel5 extends PHPExcel_Writer_Abstract implements PHPExce
// garbage collect // garbage collect
$this->_phpExcel->garbageCollect(); $this->_phpExcel->garbageCollect();
$saveDebugLog = PHPExcel_Calculation::getInstance()->writeDebugLog; $saveDebugLog = PHPExcel_Calculation::getInstance($this->_phpExcel)->getDebugLog()->getWriteDebugLog();
PHPExcel_Calculation::getInstance()->writeDebugLog = false; PHPExcel_Calculation::getInstance($this->_phpExcel)->getDebugLog()->setWriteDebugLog(FALSE);
$saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType(); $saveDateReturnType = PHPExcel_Calculation_Functions::getReturnDateType();
PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL); PHPExcel_Calculation_Functions::setReturnDateType(PHPExcel_Calculation_Functions::RETURNDATE_EXCEL);
@ -226,7 +226,7 @@ class PHPExcel_Writer_Excel5 extends PHPExcel_Writer_Abstract implements PHPExce
$res = $root->save($pFilename); $res = $root->save($pFilename);
PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType); PHPExcel_Calculation_Functions::setReturnDateType($saveDateReturnType);
PHPExcel_Calculation::getInstance()->writeDebugLog = $saveDebugLog; PHPExcel_Calculation::getInstance($this->_phpExcel)->getDebugLog()->setWriteDebugLog($saveDebugLog);
} }
/** /**

View File

@ -152,8 +152,8 @@ class PHPExcel_Writer_HTML extends PHPExcel_Writer_Abstract implements PHPExcel_
// garbage collect // garbage collect
$this->_phpExcel->garbageCollect(); $this->_phpExcel->garbageCollect();
$saveDebugLog = PHPExcel_Calculation::getInstance()->writeDebugLog; $saveDebugLog = PHPExcel_Calculation::getInstance($this->_phpExcel)->getDebugLog()->getWriteDebugLog();
PHPExcel_Calculation::getInstance()->writeDebugLog = false; PHPExcel_Calculation::getInstance($this->_phpExcel)->getDebugLog()->setWriteDebugLog(FALSE);
$saveArrayReturnType = PHPExcel_Calculation::getArrayReturnType(); $saveArrayReturnType = PHPExcel_Calculation::getArrayReturnType();
PHPExcel_Calculation::setArrayReturnType(PHPExcel_Calculation::RETURN_ARRAY_AS_VALUE); PHPExcel_Calculation::setArrayReturnType(PHPExcel_Calculation::RETURN_ARRAY_AS_VALUE);
@ -184,7 +184,7 @@ class PHPExcel_Writer_HTML extends PHPExcel_Writer_Abstract implements PHPExcel_
fclose($fileHandle); fclose($fileHandle);
PHPExcel_Calculation::setArrayReturnType($saveArrayReturnType); PHPExcel_Calculation::setArrayReturnType($saveArrayReturnType);
PHPExcel_Calculation::getInstance()->writeDebugLog = $saveDebugLog; PHPExcel_Calculation::getInstance($this->_phpExcel)->getDebugLog()->setWriteDebugLog($saveDebugLog);
} }
/** /**

View File

@ -0,0 +1,126 @@
<?php
/**
* PHPExcel
*
* Copyright (C) 2006 - 2012 PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPExcel
* @package PHPExcel
* @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version ##VERSION##, ##DATE##
*/
/** Error reporting */
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '<br />');
date_default_timezone_set('Europe/London');
/** Include PHPExcel */
require_once '../Classes/PHPExcel.php';
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_sqlite;
PHPExcel_Settings::setCacheStorageMethod($cacheMethod);
echo date('H:i:s') , " Enable Cell Caching using " , $cacheMethod , " method" , EOL;
// Create new PHPExcel object
echo date('H:i:s') , " Create new PHPExcel object" , EOL;
$objPHPExcel = new PHPExcel();
// Set document properties
echo date('H:i:s') , " Set properties" , EOL;
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw")
->setLastModifiedBy("Maarten Balliauw")
->setTitle("Office 2007 XLSX Test Document")
->setSubject("Office 2007 XLSX Test Document")
->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")
->setKeywords("office 2007 openxml php")
->setCategory("Test result file");
// Create a first sheet
echo date('H:i:s') , " Add data" , EOL;
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->setCellValue('A1', "Firstname");
$objPHPExcel->getActiveSheet()->setCellValue('B1', "Lastname");
$objPHPExcel->getActiveSheet()->setCellValue('C1', "Phone");
$objPHPExcel->getActiveSheet()->setCellValue('D1', "Fax");
$objPHPExcel->getActiveSheet()->setCellValue('E1', "Is Client ?");
// Hide "Phone" and "fax" column
echo date('H:i:s') , " Hide 'Phone' and 'fax' columns" , EOL;
$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setVisible(false);
$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setVisible(false);
// Set outline levels
echo date('H:i:s') , " Set outline levels" , EOL;
$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setOutlineLevel(1)
->setVisible(false)
->setCollapsed(true);
// Freeze panes
echo date('H:i:s') , " Freeze panes" , EOL;
$objPHPExcel->getActiveSheet()->freezePane('A2');
// Rows to repeat at top
echo date('H:i:s') , " Rows to repeat at top" , EOL;
$objPHPExcel->getActiveSheet()->getPageSetup()->setRowsToRepeatAtTopByStartAndEnd(1, 1);
// Add data
for ($i = 2; $i <= 5000; $i++) {
$objPHPExcel->getActiveSheet()->setCellValue('A' . $i, "FName $i")
->setCellValue('B' . $i, "LName $i")
->setCellValue('C' . $i, "PhoneNo $i")
->setCellValue('D' . $i, "FaxNo $i")
->setCellValue('E' . $i, true);
}
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);
// Save Excel 2007 file
echo date('H:i:s') , " Write to Excel2007 format" , EOL;
$callStartTime = microtime(true);
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save(str_replace('.php', '.xlsx', __FILE__));
$callEndTime = microtime(true);
$callTime = $callEndTime - $callStartTime;
echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL;
echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL;
// Echo memory usage
echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL;
// Echo memory peak usage
echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL;
// Echo done
echo date('H:i:s') , " Done writing file" , EOL;
echo 'File has been created in ' , getcwd() , EOL;

View File

@ -0,0 +1,126 @@
<?php
/**
* PHPExcel
*
* Copyright (C) 2006 - 2012 PHPExcel
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* @category PHPExcel
* @package PHPExcel
* @copyright Copyright (c) 2006 - 2012 PHPExcel (http://www.codeplex.com/PHPExcel)
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt LGPL
* @version ##VERSION##, ##DATE##
*/
/** Error reporting */
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '<br />');
date_default_timezone_set('Europe/London');
/** Include PHPExcel */
require_once '../Classes/PHPExcel.php';
$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_sqlite3;
PHPExcel_Settings::setCacheStorageMethod($cacheMethod);
echo date('H:i:s') , " Enable Cell Caching using " , $cacheMethod , " method" , EOL;
// Create new PHPExcel object
echo date('H:i:s') , " Create new PHPExcel object" , EOL;
$objPHPExcel = new PHPExcel();
// Set document properties
echo date('H:i:s') , " Set properties" , EOL;
$objPHPExcel->getProperties()->setCreator("Maarten Balliauw")
->setLastModifiedBy("Maarten Balliauw")
->setTitle("Office 2007 XLSX Test Document")
->setSubject("Office 2007 XLSX Test Document")
->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")
->setKeywords("office 2007 openxml php")
->setCategory("Test result file");
// Create a first sheet
echo date('H:i:s') , " Add data" , EOL;
$objPHPExcel->setActiveSheetIndex(0);
$objPHPExcel->getActiveSheet()->setCellValue('A1', "Firstname");
$objPHPExcel->getActiveSheet()->setCellValue('B1', "Lastname");
$objPHPExcel->getActiveSheet()->setCellValue('C1', "Phone");
$objPHPExcel->getActiveSheet()->setCellValue('D1', "Fax");
$objPHPExcel->getActiveSheet()->setCellValue('E1', "Is Client ?");
// Hide "Phone" and "fax" column
echo date('H:i:s') , " Hide 'Phone' and 'fax' columns" , EOL;
$objPHPExcel->getActiveSheet()->getColumnDimension('C')->setVisible(false);
$objPHPExcel->getActiveSheet()->getColumnDimension('D')->setVisible(false);
// Set outline levels
echo date('H:i:s') , " Set outline levels" , EOL;
$objPHPExcel->getActiveSheet()->getColumnDimension('E')->setOutlineLevel(1)
->setVisible(false)
->setCollapsed(true);
// Freeze panes
echo date('H:i:s') , " Freeze panes" , EOL;
$objPHPExcel->getActiveSheet()->freezePane('A2');
// Rows to repeat at top
echo date('H:i:s') , " Rows to repeat at top" , EOL;
$objPHPExcel->getActiveSheet()->getPageSetup()->setRowsToRepeatAtTopByStartAndEnd(1, 1);
// Add data
for ($i = 2; $i <= 5000; $i++) {
$objPHPExcel->getActiveSheet()->setCellValue('A' . $i, "FName $i")
->setCellValue('B' . $i, "LName $i")
->setCellValue('C' . $i, "PhoneNo $i")
->setCellValue('D' . $i, "FaxNo $i")
->setCellValue('E' . $i, true);
}
// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objPHPExcel->setActiveSheetIndex(0);
// Save Excel 2007 file
echo date('H:i:s') , " Write to Excel2007 format" , EOL;
$callStartTime = microtime(true);
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save(str_replace('.php', '.xlsx', __FILE__));
$callEndTime = microtime(true);
$callTime = $callEndTime - $callStartTime;
echo date('H:i:s') , " File written to " , str_replace('.php', '.xlsx', pathinfo(__FILE__, PATHINFO_BASENAME)) , EOL;
echo 'Call time to write Workbook was ' , sprintf('%.4f',$callTime) , " seconds" , EOL;
// Echo memory usage
echo date('H:i:s') , ' Current memory usage: ' , (memory_get_usage(true) / 1024 / 1024) , " MB" , EOL;
// Echo memory peak usage
echo date('H:i:s') , " Peak memory usage: " , (memory_get_peak_usage(true) / 1024 / 1024) , " MB" , EOL;
// Echo done
echo date('H:i:s') , " Done writing file" , EOL;
echo 'File has been created in ' , getcwd() , EOL;

View File

@ -23,7 +23,7 @@
************************************************************************************** **************************************************************************************
Fixed in develop branch: Fixed in develop branch for release v1.7.9:
- Feature: (MBaker) Include charts option for HTML Writer - Feature: (MBaker) Include charts option for HTML Writer
- Feature: (MBaker) Added composer file - Feature: (MBaker) Added composer file
- Bugfix: (Asker) Work item 18777 - Error in PHPEXCEL/Calculation.php script on line 2976 (stack pop check) - Bugfix: (Asker) Work item 18777 - Error in PHPEXCEL/Calculation.php script on line 2976 (stack pop check)
@ -41,6 +41,8 @@ Fixed in develop branch:
- General: (cfhay) Work item 18958 - Memory and Speed improvements in PHPExcel_Reader_Excel5 - General: (cfhay) Work item 18958 - Memory and Speed improvements in PHPExcel_Reader_Excel5
- General: (MBaker) Work item GH-78 - Modify listWorksheetNames() and listWorksheetInfo to use XMLReader with streamed XML rather than SimpleXML - General: (MBaker) Work item GH-78 - Modify listWorksheetNames() and listWorksheetInfo to use XMLReader with streamed XML rather than SimpleXML
- General: (dbonsch) Restructuring of PHPExcel Exceptions - General: (dbonsch) Restructuring of PHPExcel Exceptions
- General: (MBaker) Work items 16926 and 15145 - Refactor Calculation Engine from singleton to a Multiton
Ensures that calculation cache is maintained independently for different workbooks
- Bugfix: (techhead) Work item GH-70 - Fixed formula/formatting bug when removing rows - Bugfix: (techhead) Work item GH-70 - Fixed formula/formatting bug when removing rows
- Bugfix: (alexgann) Work item GH-63 - Fix to cellExists for non-existent namedRanges - Bugfix: (alexgann) Work item GH-63 - Fix to cellExists for non-existent namedRanges
- Bugfix: (MBaker) Work item 18844 - cache_in_memory_gzip "eats" last worksheet line, cache_in_memory doesn't - Bugfix: (MBaker) Work item 18844 - cache_in_memory_gzip "eats" last worksheet line, cache_in_memory doesn't
@ -52,6 +54,7 @@ Fixed in develop branch:
- Bugfix: (MBaker) Work item GH-113 - canRead() Error for GoogleDocs ODS files: in ODS files from Google Docs there is no mimetype file - Bugfix: (MBaker) Work item GH-113 - canRead() Error for GoogleDocs ODS files: in ODS files from Google Docs there is no mimetype file
- Bugfix: (MBaker) Work item GH-80 - "Sheet index is out of bounds." Exception - Bugfix: (MBaker) Work item GH-80 - "Sheet index is out of bounds." Exception
- Bugfix: (ccorliss) Work item GH-105 - Fixed number format fatal error - Bugfix: (ccorliss) Work item GH-105 - Fixed number format fatal error
- Bugfix: (MBaker) - Add DROP TABLE in destructor for SQLite and SQLite3 cache controllers
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
BREAKING CHANGE! As part of the planned changes for handling array formulae in BREAKING CHANGE! As part of the planned changes for handling array formulae in

View File

@ -35,7 +35,16 @@ class AdvancedValueBinderTest extends PHPUnit_Framework_TestCase
*/ */
public function testCurrency($value, $valueBinded, $format, $thousandsSeparator, $decimalSeparator, $currencyCode) public function testCurrency($value, $valueBinded, $format, $thousandsSeparator, $decimalSeparator, $currencyCode)
{ {
$sheet = $this->getMock('PHPExcel_Worksheet', array('getStyle', 'getNumberFormat', 'setFormatCode')); $sheet = $this->getMock(
'PHPExcel_Worksheet',
array('getStyle', 'getNumberFormat', 'setFormatCode','getCellCacheController')
);
$cache = $this->getMockBuilder('PHPExcel_CachedObjectStorage_Memory')
->disableOriginalConstructor()
->getMock();
$cache->expects($this->any())
->method('getParent')
->will($this->returnValue($sheet));
$sheet->expects($this->once()) $sheet->expects($this->once())
->method('getStyle') ->method('getStyle')
@ -47,12 +56,15 @@ class AdvancedValueBinderTest extends PHPUnit_Framework_TestCase
->method('setFormatCode') ->method('setFormatCode')
->with($format) ->with($format)
->will($this->returnSelf()); ->will($this->returnSelf());
$sheet->expects($this->any())
->method('getCellCacheController')
->will($this->returnValue($cache));
PHPExcel_Shared_String::setCurrencyCode($currencyCode); PHPExcel_Shared_String::setCurrencyCode($currencyCode);
PHPExcel_Shared_String::setDecimalSeparator($decimalSeparator); PHPExcel_Shared_String::setDecimalSeparator($decimalSeparator);
PHPExcel_Shared_String::setThousandsSeparator($thousandsSeparator); PHPExcel_Shared_String::setThousandsSeparator($thousandsSeparator);
$cell = new PHPExcel_Cell('A', 1, null, PHPExcel_Cell_DataType::TYPE_STRING, $sheet); $cell = new PHPExcel_Cell(NULL, PHPExcel_Cell_DataType::TYPE_STRING, $sheet);
$binder = new PHPExcel_Cell_AdvancedValueBinder(); $binder = new PHPExcel_Cell_AdvancedValueBinder();
$binder->bindValue($cell, $value); $binder->bindValue($cell, $value);

View File

@ -18,6 +18,12 @@ class AutoFilterTest extends PHPUnit_Framework_TestCase
$this->_mockWorksheetObject = $this->getMockBuilder('PHPExcel_Worksheet') $this->_mockWorksheetObject = $this->getMockBuilder('PHPExcel_Worksheet')
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
$this->_mockCacheController = $this->getMockBuilder('PHPExcel_CachedObjectStorage_Memory')
->disableOriginalConstructor()
->getMock();
$this->_mockWorksheetObject->expects($this->any())
->method('getCellCacheController')
->will($this->returnValue($this->_mockCacheController));
$this->_testAutoFilterObject = new PHPExcel_Worksheet_AutoFilter( $this->_testAutoFilterObject = new PHPExcel_Worksheet_AutoFilter(
$this->_testInitialRange, $this->_testInitialRange,

View File

@ -35,11 +35,11 @@
"22 August 98", 36029 "22 August 98", 36029
"1st March 2007", 39142 // MS Excel will fail with a #VALUE return, but PHPExcel can parse this date "1st March 2007", 39142 // MS Excel will fail with a #VALUE return, but PHPExcel can parse this date
"The 1st day of March 2007", "#VALUE!" "The 1st day of March 2007", "#VALUE!"
"1 Jan", 40909 "1 Jan", 41275
"31/12", 41274 "31/12", 41639
"12/31", 11658 // Excel reads as 1st December 1931, not 31st December in current year "12/31", 11658 // Excel reads as 1st December 1931, not 31st December in current year
"5-JUL", 41095 "5-JUL", 41460
"5 Jul", 41095 "5 Jul", 41460
"12/2008", 39783 "12/2008", 39783
"10/32", 11963 "10/32", 11963
11, "#VALUE!" 11, "#VALUE!"