Minor performance tweak

git-svn-id: https://phpexcel.svn.codeplex.com/svn/trunk@63609 2327b42d-5241-43d6-9e2a-de5ac946f064
This commit is contained in:
Mark Baker 2010-11-11 12:30:23 +00:00
parent b16083246e
commit 3bd1ef536d
3 changed files with 111 additions and 97 deletions

View File

@ -1910,9 +1910,9 @@ class PHPExcel_Calculation {
}
private static function _translateFormula($from,$to,$formula,$fromSeparator,$toSeparator) {
$inBraces = False;
// Convert any Excel function names to the required language
if (self::$_localeLanguage !== 'en_us') {
$inBraces = False;
// If there is the possibility of braces within a quoted string, then we don't treat those as matrix indicators
if (strpos($formula,'"') !== false) {
// So instead we skip replacing in any quoted strings by only replacing in every other array element after we've exploded
@ -2211,7 +2211,7 @@ class PHPExcel_Calculation {
$formulaLength = strlen($formula);
if ($formulaLength < 1) return self::_wrapResult($formula);
$wsTitle = 'Wrk';
$wsTitle = 0x00.'Wrk';
if (!is_null($pCell)) {
$pCellParent = $pCell->getParent();
if (!is_null($pCellParent)) {
@ -2248,7 +2248,7 @@ class PHPExcel_Calculation {
}
}
if ((in_array($wsTitle.'!'.$cellID,$this->debugLogStack)) && ($wsTitle != 'Wrk')) {
if ((in_array($wsTitle.'!'.$cellID,$this->debugLogStack)) && ($wsTitle != 0x00.'Wrk')) {
if ($this->cyclicFormulaCount <= 0) {
return $this->_raiseFormulaError('Cyclic Reference in Formula');
} elseif (($this->_cyclicFormulaCount >= $this->cyclicFormulaCount) &&
@ -2441,28 +2441,29 @@ class PHPExcel_Calculation {
* @param mixed $value First matrix operand
* @return mixed
*/
private static function _showValue($value) {
$testArray = PHPExcel_Calculation_Functions::flattenArray($value);
if (count($testArray) == 1) {
$value = array_pop($testArray);
}
if (is_array($value)) {
$returnMatrix = array();
$pad = $rpad = ', ';
foreach($value as $row) {
if (is_array($row)) {
$returnMatrix[] = implode($pad,$row);
$rpad = '; ';
} else {
$returnMatrix[] = $row;
}
private function _showValue($value) {
if ($this->writeDebugLog) {
$testArray = PHPExcel_Calculation_Functions::flattenArray($value);
if (count($testArray) == 1) {
$value = array_pop($testArray);
}
return '{ '.implode($rpad,$returnMatrix).' }';
} elseif(is_bool($value)) {
return ($value) ? self::$_localeBoolean['TRUE'] : self::$_localeBoolean['FALSE'];
}
if (is_array($value)) {
$returnMatrix = array();
$pad = $rpad = ', ';
foreach($value as $row) {
if (is_array($row)) {
$returnMatrix[] = implode($pad,$row);
$rpad = '; ';
} else {
$returnMatrix[] = $row;
}
}
return '{ '.implode($rpad,$returnMatrix).' }';
} elseif(is_bool($value)) {
return ($value) ? self::$_localeBoolean['TRUE'] : self::$_localeBoolean['FALSE'];
}
}
return $value;
} // function _showValue()
@ -2473,32 +2474,34 @@ class PHPExcel_Calculation {
* @param mixed $value First matrix operand
* @return mixed
*/
private static function _showTypeDetails($value) {
$testArray = PHPExcel_Calculation_Functions::flattenArray($value);
if (count($testArray) == 1) {
$value = array_pop($testArray);
}
if (is_null($value)) {
return 'a null value';
} elseif (is_float($value)) {
$typeString = 'a floating point number';
} elseif(is_int($value)) {
$typeString = 'an integer number';
} elseif(is_bool($value)) {
$typeString = 'a boolean';
} elseif(is_array($value)) {
$typeString = 'a matrix';
} else {
if ($value == '') {
return 'an empty string';
} elseif ($value{0} == '#') {
return 'a '.$value.' error';
} else {
$typeString = 'a string';
private function _showTypeDetails($value) {
if ($this->writeDebugLog) {
$testArray = PHPExcel_Calculation_Functions::flattenArray($value);
if (count($testArray) == 1) {
$value = array_pop($testArray);
}
if (is_null($value)) {
return 'a null value';
} elseif (is_float($value)) {
$typeString = 'a floating point number';
} elseif(is_int($value)) {
$typeString = 'an integer number';
} elseif(is_bool($value)) {
$typeString = 'a boolean';
} elseif(is_array($value)) {
$typeString = 'a matrix';
} else {
if ($value == '') {
return 'an empty string';
} elseif ($value{0} == '#') {
return 'a '.$value.' error';
} else {
$typeString = 'a string';
}
}
return $typeString.' with a value of '.$this->_showValue($value);
}
return $typeString.' with a value of '.self::_showValue($value);
} // function _showTypeDetails()
@ -2950,9 +2953,9 @@ class PHPExcel_Calculation {
$operand1 = $operand1Data['value'];
$operand2 = $operand2Data['value'];
if ($token == ':') {
$this->_writeDebug('Evaluating Range '.self::_showValue($operand1Data['reference']).$token.self::_showValue($operand2Data['reference']));
$this->_writeDebug('Evaluating Range '.$this->_showValue($operand1Data['reference']).$token.$this->_showValue($operand2Data['reference']));
} else {
$this->_writeDebug('Evaluating '.self::_showValue($operand1).' '.$token.' '.self::_showValue($operand2));
$this->_writeDebug('Evaluating '.$this->_showValue($operand1).' '.$token.' '.$this->_showValue($operand2));
}
// Process the operation in the appropriate manner
switch ($token) {
@ -3058,7 +3061,7 @@ class PHPExcel_Calculation {
} else {
$result = '"'.str_replace('""','"',self::_unwrapResult($operand1,'"').self::_unwrapResult($operand2,'"')).'"';
}
$this->_writeDebug('Evaluation Result is '.self::_showTypeDetails($result));
$this->_writeDebug('Evaluation Result is '.$this->_showTypeDetails($result));
$stack->push('Value',$result);
break;
case '|' : // Intersect
@ -3072,7 +3075,7 @@ class PHPExcel_Calculation {
}
}
$cellRef = PHPExcel_Cell::stringFromColumnIndex(min($oCol)).min($oRow).':'.PHPExcel_Cell::stringFromColumnIndex(max($oCol)).max($oRow);
$this->_writeDebug('Evaluation Result is '.self::_showTypeDetails($cellIntersect));
$this->_writeDebug('Evaluation Result is '.$this->_showTypeDetails($cellIntersect));
$stack->push('Value',$cellIntersect,$cellRef);
break;
}
@ -3084,11 +3087,11 @@ class PHPExcel_Calculation {
$arg = $arg['value'];
if ($token === '~') {
// echo 'Token is a negation operator<br />';
$this->_writeDebug('Evaluating Negation of '.self::_showValue($arg));
$this->_writeDebug('Evaluating Negation of '.$this->_showValue($arg));
$multiplier = -1;
} else {
// echo 'Token is a percentile operator<br />';
$this->_writeDebug('Evaluating Percentile of '.self::_showValue($arg));
$this->_writeDebug('Evaluating Percentile of '.$this->_showValue($arg));
$multiplier = 0.01;
}
if (is_array($arg)) {
@ -3101,7 +3104,7 @@ class PHPExcel_Calculation {
$this->_writeDebug('JAMA Matrix Exception: '.$ex->getMessage());
$result = '#VALUE!';
}
$this->_writeDebug('Evaluation Result is '.self::_showTypeDetails($result));
$this->_writeDebug('Evaluation Result is '.$this->_showTypeDetails($result));
$stack->push('Value',$result);
} else {
$this->_executeNumericBinaryOperation($cellID,$multiplier,$arg,'*','arrayTimesEquals',$stack);
@ -3126,7 +3129,7 @@ class PHPExcel_Calculation {
} else {
return $this->_raiseFormulaError('Unable to access Cell Reference');
}
$this->_writeDebug('Evaluation Result for cells '.$cellRef.' in worksheet '.$matches[2].' is '.self::_showTypeDetails($cellValue));
$this->_writeDebug('Evaluation Result for cells '.$cellRef.' in worksheet '.$matches[2].' is '.$this->_showTypeDetails($cellValue));
// $cellRef = $matches[2].'!'.$cellRef;
} else {
// echo '$cellRef='.$cellRef.' in current worksheet<br />';
@ -3136,7 +3139,7 @@ class PHPExcel_Calculation {
} else {
return $this->_raiseFormulaError('Unable to access Cell Reference');
}
$this->_writeDebug('Evaluation Result for cells '.$cellRef.' is '.self::_showTypeDetails($cellValue));
$this->_writeDebug('Evaluation Result for cells '.$cellRef.' is '.$this->_showTypeDetails($cellValue));
}
}
} else {
@ -3160,7 +3163,7 @@ class PHPExcel_Calculation {
} else {
return $this->_raiseFormulaError('Unable to access Cell Reference');
}
$this->_writeDebug('Evaluation Result for cell '.$cellRef.' in worksheet '.$matches[2].' is '.self::_showTypeDetails($cellValue));
$this->_writeDebug('Evaluation Result for cell '.$cellRef.' in worksheet '.$matches[2].' is '.$this->_showTypeDetails($cellValue));
// $cellRef = $matches[2].'!'.$cellRef;
} else {
// echo '$cellRef='.$cellRef.' in current worksheet<br />';
@ -3171,7 +3174,7 @@ class PHPExcel_Calculation {
} else {
$cellValue = NULL;
}
$this->_writeDebug('Evaluation Result for cell '.$cellRef.' is '.self::_showTypeDetails($cellValue));
$this->_writeDebug('Evaluation Result for cell '.$cellRef.' is '.$this->_showTypeDetails($cellValue));
}
}
}
@ -3207,21 +3210,21 @@ class PHPExcel_Calculation {
(self::$_PHPExcelFunctions[$functionName]['passByReference'][$a])) {
if (is_null($arg['reference'])) {
$args[] = $cellID;
if ($functionName != 'MKMATRIX') { $argArrayVals[] = self::_showValue($cellID); }
if ($functionName != 'MKMATRIX') { $argArrayVals[] = $this->_showValue($cellID); }
} else {
$args[] = $arg['reference'];
if ($functionName != 'MKMATRIX') { $argArrayVals[] = self::_showValue($arg['reference']); }
if ($functionName != 'MKMATRIX') { $argArrayVals[] = $this->_showValue($arg['reference']); }
}
} else {
$args[] = self::_unwrapResult($arg['value']);
if ($functionName != 'MKMATRIX') { $argArrayVals[] = self::_showValue($arg['value']); }
if ($functionName != 'MKMATRIX') { $argArrayVals[] = $this->_showValue($arg['value']); }
}
}
// Reverse the order of the arguments
krsort($args);
if (($passByReference) && ($argCount == 0)) {
$args[] = $cellID;
$argArrayVals[] = self::_showValue($cellID);
$argArrayVals[] = $this->_showValue($cellID);
}
// echo 'Arguments are: ';
// print_r($args);
@ -3233,22 +3236,22 @@ class PHPExcel_Calculation {
// Process each argument in turn, building the return value as an array
// if (($argCount == 1) && (is_array($args[1])) && ($functionName != 'MKMATRIX')) {
// $operand1 = $args[1];
// $this->_writeDebug('Argument is a matrix: '.self::_showValue($operand1));
// $this->_writeDebug('Argument is a matrix: '.$this->_showValue($operand1));
// $result = array();
// $row = 0;
// foreach($operand1 as $args) {
// if (is_array($args)) {
// foreach($args as $arg) {
// $this->_writeDebug('Evaluating '.self::_localeFunc($functionName).'( '.self::_showValue($arg).' )');
// $this->_writeDebug('Evaluating '.self::_localeFunc($functionName).'( '.$this->_showValue($arg).' )');
// $r = call_user_func_array($functionCall,$arg);
// $this->_writeDebug('Evaluation Result for '.self::_localeFunc($functionName).'() function call is '.self::_showTypeDetails($r));
// $this->_writeDebug('Evaluation Result for '.self::_localeFunc($functionName).'() function call is '.$this->_showTypeDetails($r));
// $result[$row][] = $r;
// }
// ++$row;
// } else {
// $this->_writeDebug('Evaluating '.self::_localeFunc($functionName).'( '.self::_showValue($args).' )');
// $this->_writeDebug('Evaluating '.self::_localeFunc($functionName).'( '.$this->_showValue($args).' )');
// $r = call_user_func_array($functionCall,$args);
// $this->_writeDebug('Evaluation Result for '.self::_localeFunc($functionName).'() function call is '.self::_showTypeDetails($r));
// $this->_writeDebug('Evaluation Result for '.self::_localeFunc($functionName).'() function call is '.$this->_showTypeDetails($r));
// $result[] = $r;
// }
// }
@ -3268,7 +3271,7 @@ class PHPExcel_Calculation {
}
// }
if ($functionName != 'MKMATRIX') {
$this->_writeDebug('Evaluation Result for '.self::_localeFunc($functionName).'() function call is '.self::_showTypeDetails($result));
$this->_writeDebug('Evaluation Result for '.self::_localeFunc($functionName).'() function call is '.$this->_showTypeDetails($result));
}
$stack->push('Value',self::_wrapResult($result));
}
@ -3279,7 +3282,7 @@ class PHPExcel_Calculation {
$excelConstant = strtoupper($token);
// echo 'Token is a PHPExcel constant: '.$excelConstant.'<br />';
$stack->push('Constant Value',self::$_ExcelConstants[$excelConstant]);
$this->_writeDebug('Evaluating Constant '.$excelConstant.' as '.self::_showTypeDetails(self::$_ExcelConstants[$excelConstant]));
$this->_writeDebug('Evaluating Constant '.$excelConstant.' as '.$this->_showTypeDetails(self::$_ExcelConstants[$excelConstant]));
} elseif ((is_numeric($token)) || (is_bool($token)) || (is_null($token)) || ($token == '') || ($token{0} == '"') || ($token{0} == '#')) {
// echo 'Token is a number, boolean, string, null or an Excel error<br />';
$stack->push('Value',$token);
@ -3291,7 +3294,7 @@ class PHPExcel_Calculation {
$this->_writeDebug('Evaluating Named Range '.$namedRange);
$cellValue = $this->extractNamedRange($namedRange, ((null !== $pCell) ? $pCellParent : null), false);
$pCell->attach($pCellParent);
$this->_writeDebug('Evaluation Result for named range '.$namedRange.' is '.self::_showTypeDetails($cellValue));
$this->_writeDebug('Evaluation Result for named range '.$namedRange.' is '.$this->_showTypeDetails($cellValue));
$stack->push('Named Range',$cellValue,$namedRange);
} else {
return $this->_raiseFormulaError("undefined variable '$token'");
@ -3321,12 +3324,12 @@ class PHPExcel_Calculation {
// If not a numeric, test to see if the value is an Excel error, and so can't be used in normal binary operations
if ($operand > '' && $operand{0} == '#') {
$stack->push('Value', $operand);
$this->_writeDebug('Evaluation Result is '.self::_showTypeDetails($operand));
$this->_writeDebug('Evaluation Result is '.$this->_showTypeDetails($operand));
return false;
} elseif (!PHPExcel_Shared_String::convertToNumberIfFraction($operand)) {
// If not a numeric or a fraction, then it's a text string, and so can't be used in mathematical binary operations
$stack->push('Value', '#VALUE!');
$this->_writeDebug('Evaluation Result is a '.self::_showTypeDetails('#VALUE!'));
$this->_writeDebug('Evaluation Result is a '.$this->_showTypeDetails('#VALUE!'));
return false;
}
}
@ -3343,14 +3346,14 @@ class PHPExcel_Calculation {
$result = array();
if ((is_array($operand1)) && (!is_array($operand2))) {
foreach($operand1 as $x => $operandData) {
$this->_writeDebug('Evaluating '.self::_showValue($operandData).' '.$operation.' '.self::_showValue($operand2));
$this->_writeDebug('Evaluating '.$this->_showValue($operandData).' '.$operation.' '.$this->_showValue($operand2));
$this->_executeBinaryComparisonOperation($cellID,$operandData,$operand2,$operation,$stack);
$r = $stack->pop();
$result[$x] = $r['value'];
}
} elseif ((!is_array($operand1)) && (is_array($operand2))) {
foreach($operand2 as $x => $operandData) {
$this->_writeDebug('Evaluating '.self::_showValue($operand1).' '.$operation.' '.self::_showValue($operandData));
$this->_writeDebug('Evaluating '.$this->_showValue($operand1).' '.$operation.' '.$this->_showValue($operandData));
$this->_executeBinaryComparisonOperation($cellID,$operand1,$operandData,$operation,$stack);
$r = $stack->pop();
$result[$x] = $r['value'];
@ -3358,14 +3361,14 @@ class PHPExcel_Calculation {
} else {
if (!$recursingArrays) { self::_checkMatrixOperands($operand1,$operand2,2); }
foreach($operand1 as $x => $operandData) {
$this->_writeDebug('Evaluating '.self::_showValue($operandData).' '.$operation.' '.self::_showValue($operand2[$x]));
$this->_writeDebug('Evaluating '.$this->_showValue($operandData).' '.$operation.' '.$this->_showValue($operand2[$x]));
$this->_executeBinaryComparisonOperation($cellID,$operandData,$operand2[$x],$operation,$stack,True);
$r = $stack->pop();
$result[$x] = $r['value'];
}
}
// Log the result details
$this->_writeDebug('Evaluation Result is '.self::_showTypeDetails($result));
$this->_writeDebug('Evaluation Result is '.$this->_showTypeDetails($result));
// And push the result onto the stack
$stack->push('Array',$result);
return true;
@ -3404,7 +3407,7 @@ class PHPExcel_Calculation {
}
// Log the result details
$this->_writeDebug('Evaluation Result is '.self::_showTypeDetails($result));
$this->_writeDebug('Evaluation Result is '.$this->_showTypeDetails($result));
// And push the result onto the stack
$stack->push('Value',$result);
return true;
@ -3452,7 +3455,7 @@ class PHPExcel_Calculation {
if ($operand2 == 0) {
// Trap for Divide by Zero error
$stack->push('Value','#DIV/0!');
$this->_writeDebug('Evaluation Result is '.self::_showTypeDetails('#DIV/0!'));
$this->_writeDebug('Evaluation Result is '.$this->_showTypeDetails('#DIV/0!'));
return false;
} else {
$result = $operand1/$operand2;
@ -3466,7 +3469,7 @@ class PHPExcel_Calculation {
}
// Log the result details
$this->_writeDebug('Evaluation Result is '.self::_showTypeDetails($result));
$this->_writeDebug('Evaluation Result is '.$this->_showTypeDetails($result));
// And push the result onto the stack
$stack->push('Value',$result);
return true;

View File

@ -479,13 +479,12 @@ class PHPExcel_Cell
*/
public static function coordinateFromString($pCoordinateString = 'A1')
{
if (strpos($pCoordinateString,':') !== false) {
if (preg_match("/^([$]?[A-Z]{1,3})([$]?\d{1,5})$/", $pCoordinateString, $matches)) {
return array($matches[1],$matches[2]);
} elseif ((strpos($pCoordinateString,':') !== false) || (strpos($pCoordinateString,',') !== false)) {
throw new Exception('Cell coordinate string can not be a range of cells.');
} else if ($pCoordinateString == '') {
} elseif ($pCoordinateString == '') {
throw new Exception('Cell coordinate can not be zero-length string.');
} else if (preg_match("/([$]?[A-Z]+)([$]?\d+)/", $pCoordinateString, $matches)) {
array_shift($matches);
return $matches;
} else {
throw new Exception('Invalid cell coordinate.');
}
@ -503,6 +502,8 @@ class PHPExcel_Cell
if (strpos($pCoordinateString,':') === false && strpos($pCoordinateString,',') === false) {
// Create absolute coordinate
list($column, $row) = PHPExcel_Cell::coordinateFromString($pCoordinateString);
if ($column[0] == '$') $column = substr($column,1);
if ($row[0] == '$') $row = substr($row,1);
return '$' . $column . '$' . $row;
} else {
throw new Exception("Coordinate string should not be a cell range.");

View File

@ -199,10 +199,10 @@ class PHPExcel_Writer_HTML implements PHPExcel_Writer_IWriter {
*/
private function _mapVAlign($vAlign) {
switch ($vAlign) {
case PHPExcel_Style_Alignment::VERTICAL_BOTTOM: return 'bottom';
case PHPExcel_Style_Alignment::VERTICAL_TOP: return 'top';
case PHPExcel_Style_Alignment::VERTICAL_BOTTOM: return 'bottom';
case PHPExcel_Style_Alignment::VERTICAL_TOP: return 'top';
case PHPExcel_Style_Alignment::VERTICAL_CENTER:
case PHPExcel_Style_Alignment::VERTICAL_JUSTIFY: return 'middle';
case PHPExcel_Style_Alignment::VERTICAL_JUSTIFY: return 'middle';
default: return 'baseline';
}
}
@ -214,11 +214,12 @@ class PHPExcel_Writer_HTML implements PHPExcel_Writer_IWriter {
*/
private function _mapHAlign($hAlign) {
switch ($hAlign) {
case PHPExcel_Style_Alignment::HORIZONTAL_GENERAL: return false;
case PHPExcel_Style_Alignment::HORIZONTAL_LEFT: return 'left';
case PHPExcel_Style_Alignment::HORIZONTAL_RIGHT: return 'right';
case PHPExcel_Style_Alignment::HORIZONTAL_CENTER: return 'center';
case PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY: return 'justify';
case PHPExcel_Style_Alignment::HORIZONTAL_GENERAL: return false;
case PHPExcel_Style_Alignment::HORIZONTAL_LEFT: return 'left';
case PHPExcel_Style_Alignment::HORIZONTAL_RIGHT: return 'right';
case PHPExcel_Style_Alignment::HORIZONTAL_CENTER:
case PHPExcel_Style_Alignment::HORIZONTAL_CENTER_CONTINUOUS: return 'center';
case PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY: return 'justify';
default: return false;
}
}
@ -228,11 +229,20 @@ class PHPExcel_Writer_HTML implements PHPExcel_Writer_IWriter {
*/
private function _mapBorderStyle($borderStyle) {
switch ($borderStyle) {
case PHPExcel_Style_Border::BORDER_NONE: return '0px';
case PHPExcel_Style_Border::BORDER_DASHED: return '1px dashed';
case PHPExcel_Style_Border::BORDER_DOTTED: return '1px dotted';
case PHPExcel_Style_Border::BORDER_DOUBLE: return '3px double';
case PHPExcel_Style_Border::BORDER_THICK: return '2px solid';
case PHPExcel_Style_Border::BORDER_NONE: return '0px';
case PHPExcel_Style_Border::BORDER_DASHDOT: return '1px dashed';
case PHPExcel_Style_Border::BORDER_DASHDOTDOT: return '1px dotted';
case PHPExcel_Style_Border::BORDER_DASHED: return '1px dashed';
case PHPExcel_Style_Border::BORDER_DOTTED: return '1px dotted';
case PHPExcel_Style_Border::BORDER_DOUBLE: return '3px double';
case PHPExcel_Style_Border::BORDER_HAIR: return '1px solid';
case PHPExcel_Style_Border::BORDER_MEDIUM: return '2px solid';
case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOT: return '2px dashed';
case PHPExcel_Style_Border::BORDER_MEDIUMDASHDOTDOT: return '2px dotted';
case PHPExcel_Style_Border::BORDER_MEDIUMDASHED: return '2px dashed';
case PHPExcel_Style_Border::BORDER_SLANTDASHDOT: return '2px dashed';
case PHPExcel_Style_Border::BORDER_THICK: return '3px solid';
case PHPExcel_Style_Border::BORDER_THIN return '1px solid';
default: return '1px solid'; // map others to thin
}
}