From abb076a8175d4c39113210098ec8e4d39b334974 Mon Sep 17 00:00:00 2001 From: Mark Baker Date: Tue, 5 Feb 2013 09:52:28 +0000 Subject: [PATCH] Use direct reference to workbook in Calc Engine rather than cell's parent's parent --- Classes/PHPExcel/Calculation.php | 36 +++++++++++++------------------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/Classes/PHPExcel/Calculation.php b/Classes/PHPExcel/Calculation.php index a2f5372..0e4f066 100644 --- a/Classes/PHPExcel/Calculation.php +++ b/Classes/PHPExcel/Calculation.php @@ -1829,7 +1829,6 @@ class PHPExcel_Calculation { return $this->_calculationCacheEnabled; } // function getCalculationCacheEnabled() - /** * Enable/disable calculation cache * @@ -2265,7 +2264,7 @@ class PHPExcel_Calculation { * @throws PHPExcel_Calculation_Exception */ public function _calculateFormulaValue($formula, $cellID=null, PHPExcel_Cell $pCell = null) { -// echo ''.$cellID.'
'; +//echo $cellID,PHP_EOL; $cellValue = ''; // Basic validation that this is indeed a formula @@ -2275,25 +2274,20 @@ class PHPExcel_Calculation { $formula = ltrim(substr($formula,1)); if (!isset($formula{0})) return self::_wrapResult($formula); - $wsTitle = "\x00Wrk"; - if ($pCell !== NULL) { - $pCellParent = $pCell->getParent(); - if ($pCellParent !== NULL) { - $wsTitle = $pCellParent->getTitle(); - } - } + $pCellParent = ($pCell !== NULL) ? $pCell->getParent() : NULL; + $wsTitle = ($pCellParent !== NULL) ? $pCellParent->getTitle() : "\x00Wrk"; // Is calculation cacheing enabled? if ($cellID !== NULL) { if ($this->_calculationCacheEnabled) { // Is the value present in calculation cache? $this->_writeDebug('Testing cache value for cell ', $cellID); -// echo 'Testing cache value
'; +//echo 'Testing cache value',PHP_EOL; if (isset($this->_calculationCache[$wsTitle][$cellID])) { -// echo 'Value is in cache
'; +//echo 'Value is in cache',PHP_EOL; $this->_writeDebug('Retrieving value for ', $cellID, ' from cache'); // Return the cached result $returnValue = $this->_calculationCache[$wsTitle][$cellID]; -// echo 'Retrieving data value of '.$returnValue.' for '.$cellID.' from cache
'; +//echo 'Retrieving data value of '.$returnValue.' for '.$cellID.' from cache',PHP_EOL; if (is_array($returnValue)) { $returnValue = PHPExcel_Calculation_Functions::flattenArray($returnValue); return array_shift($returnValue); @@ -2670,9 +2664,9 @@ class PHPExcel_Calculation { // The guts of the lexical parser // Loop through the formula extracting each operator and operand in turn while(true) { -// echo 'Assessing Expression '.substr($formula, $index).'
'; +//echo 'Assessing Expression '.substr($formula, $index),PHP_EOL; $opCharacter = $formula{$index}; // Get the first character of the value at the current index position -// echo 'Initial character of expression block is '.$opCharacter.'
'; +//echo 'Initial character of expression block is '.$opCharacter,PHP_EOL; if ((isset($comparisonOperators[$opCharacter])) && (strlen($formula) > $index) && (isset($comparisonOperators[$formula{$index+1}]))) { $opCharacter .= $formula{++$index}; // echo 'Initial character of expression block is comparison operator '.$opCharacter.'
'; @@ -3004,7 +2998,7 @@ class PHPExcel_Calculation { // 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 = ($pCell !== NULL) ? $pCell->getParent() : null; + $pCellParent = ($pCell !== NULL) ? $pCell->getParent() : NULL; $stack = new PHPExcel_Calculation_Token_Stack; // Loop through each token in turn @@ -3083,7 +3077,7 @@ class PHPExcel_Calculation { } $cellRef = PHPExcel_Cell::stringFromColumnIndex(min($oCol)).min($oRow).':'.PHPExcel_Cell::stringFromColumnIndex(max($oCol)).max($oRow); if ($pCellParent !== NULL) { - $cellValue = $this->extractCellRange($cellRef, $pCellParent->getParent()->getSheetByName($sheet1), false); + $cellValue = $this->extractCellRange($cellRef, $this->_workbook->getSheetByName($sheet1), false); } else { return $this->_raiseFormulaError('Unable to access Cell Reference'); } @@ -3203,7 +3197,7 @@ class PHPExcel_Calculation { // echo '$cellRef='.$cellRef.' in worksheet '.$matches[2].'
'; $this->_writeDebug('Evaluating Cell Range ', $cellRef, ' in worksheet ', $matches[2]); if ($pCellParent !== NULL) { - $cellValue = $this->extractCellRange($cellRef, $pCellParent->getParent()->getSheetByName($matches[2]), false); + $cellValue = $this->extractCellRange($cellRef, $this->_workbook->getSheetByName($matches[2]), false); } else { return $this->_raiseFormulaError('Unable to access Cell Reference'); } @@ -3236,8 +3230,8 @@ class PHPExcel_Calculation { // echo '$cellRef='.$cellRef.' in worksheet '.$matches[2].'
'; $this->_writeDebug('Evaluating Cell ', $cellRef, ' in worksheet ', $matches[2]); if ($pCellParent !== NULL) { - if ($pCellParent->getParent()->getSheetByName($matches[2])->cellExists($cellRef)) { - $cellValue = $this->extractCellRange($cellRef, $pCellParent->getParent()->getSheetByName($matches[2]), false); + if ($this->_workbook->getSheetByName($matches[2])->cellExists($cellRef)) { + $cellValue = $this->extractCellRange($cellRef, $this->_workbook->getSheetByName($matches[2]), false); $pCell->attach($pCellParent); } else { $cellValue = null; @@ -3618,7 +3612,7 @@ class PHPExcel_Calculation { if (strpos ($pRange, '!') !== false) { // echo '$pRange reference includes sheet reference
'; $worksheetReference = PHPExcel_Worksheet::extractSheetTitle($pRange, true); - $pSheet = $pSheet->getParent()->getSheetByName($worksheetReference[0]); + $pSheet = $this->_workbook->getSheetByName($worksheetReference[0]); // echo 'New sheet name is '.$pSheet->getTitle().'
'; $pRange = $worksheetReference[1]; // echo 'Adjusted Range reference is '.$pRange.'
'; @@ -3674,7 +3668,7 @@ class PHPExcel_Calculation { if (strpos ($pRange, '!') !== false) { // echo '$pRange reference includes sheet reference
'; $worksheetReference = PHPExcel_Worksheet::extractSheetTitle($pRange, true); - $pSheet = $pSheet->getParent()->getSheetByName($worksheetReference[0]); + $pSheet = $this->_workbook->getSheetByName($worksheetReference[0]); // echo 'New sheet name is '.$pSheet->getTitle().'
'; $pRange = $worksheetReference[1]; // echo 'Adjusted Range reference is '.$pRange.'
';