提交的内容
This commit is contained in:
52
vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Calculation.php
vendored
Executable file → Normal file
52
vendor/phpoffice/phpspreadsheet/src/PhpSpreadsheet/Calculation/Calculation.php
vendored
Executable file → Normal file
@ -19,6 +19,7 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;
|
||||
use ReflectionClassConstant;
|
||||
use ReflectionMethod;
|
||||
use ReflectionParameter;
|
||||
use Throwable;
|
||||
|
||||
class Calculation
|
||||
{
|
||||
@ -3556,7 +3557,7 @@ class Calculation
|
||||
}
|
||||
}
|
||||
|
||||
throw new Exception($e->getMessage());
|
||||
throw new Exception($e->getMessage(), $e->getCode(), $e);
|
||||
}
|
||||
|
||||
if ((is_array($result)) && (self::$returnArrayAsType != self::RETURN_ARRAY_AS_ARRAY)) {
|
||||
@ -4210,7 +4211,7 @@ class Calculation
|
||||
try {
|
||||
$this->branchPruner->closingBrace($d['value']);
|
||||
} catch (Exception $e) {
|
||||
return $this->raiseFormulaError($e->getMessage());
|
||||
return $this->raiseFormulaError($e->getMessage(), $e->getCode(), $e);
|
||||
}
|
||||
|
||||
$functionName = $matches[1]; // Get the function name
|
||||
@ -4249,7 +4250,7 @@ class Calculation
|
||||
} elseif ($expectedArgumentCount != '*') {
|
||||
$isOperandOrFunction = preg_match('/(\d*)([-+,])(\d*)/', $expectedArgumentCount, $argMatch);
|
||||
self::doNothing($isOperandOrFunction);
|
||||
switch ($argMatch[2]) {
|
||||
switch ($argMatch[2] ?? '') {
|
||||
case '+':
|
||||
if ($argumentCount < $argMatch[1]) {
|
||||
$argumentCountError = true;
|
||||
@ -4282,7 +4283,7 @@ class Calculation
|
||||
try {
|
||||
$this->branchPruner->argumentSeparator();
|
||||
} catch (Exception $e) {
|
||||
return $this->raiseFormulaError($e->getMessage());
|
||||
return $this->raiseFormulaError($e->getMessage(), $e->getCode(), $e);
|
||||
}
|
||||
|
||||
while (($o2 = $stack->pop()) && $o2['value'] !== '(') { // Pop off the stack back to the last (
|
||||
@ -4364,8 +4365,12 @@ class Calculation
|
||||
$rangeStartCellRef = $output[count($output) - 2]['value'] ?? '';
|
||||
}
|
||||
preg_match('/^' . self::CALCULATION_REGEXP_CELLREF . '$/miu', $rangeStartCellRef, $rangeStartMatches);
|
||||
if ($rangeStartMatches[2] > '') {
|
||||
$val = $rangeStartMatches[2] . '!' . $val;
|
||||
if (array_key_exists(2, $rangeStartMatches)) {
|
||||
if ($rangeStartMatches[2] > '') {
|
||||
$val = $rangeStartMatches[2] . '!' . $val;
|
||||
}
|
||||
} else {
|
||||
$val = Information\ExcelError::REF();
|
||||
}
|
||||
} else {
|
||||
$rangeStartCellRef = $output[count($output) - 1]['value'] ?? '';
|
||||
@ -4391,7 +4396,7 @@ class Calculation
|
||||
try {
|
||||
$structuredReference = Operands\StructuredReference::fromParser($formula, $index, $matches);
|
||||
} catch (Exception $e) {
|
||||
return $this->raiseFormulaError($e->getMessage());
|
||||
return $this->raiseFormulaError($e->getMessage(), $e->getCode(), $e);
|
||||
}
|
||||
|
||||
$val = $structuredReference->value();
|
||||
@ -4434,6 +4439,8 @@ class Calculation
|
||||
}
|
||||
$val = $address;
|
||||
}
|
||||
} elseif ($val === Information\ExcelError::REF()) {
|
||||
$stackItemReference = $val;
|
||||
} else {
|
||||
$startRowColRef = $output[count($output) - 1]['value'] ?? '';
|
||||
[$rangeWS1, $startRowColRef] = Worksheet::extractSheetTitle($startRowColRef, true);
|
||||
@ -4731,7 +4738,7 @@ class Calculation
|
||||
$cellRange = $token->parse($cell);
|
||||
if (strpos($cellRange, ':') !== false) {
|
||||
$this->debugLog->writeDebugLog('Evaluating Structured Reference %s as Cell Range %s', $token->value(), $cellRange);
|
||||
$rangeValue = self::getInstance($cell->getWorksheet()->getParent())->_calculateFormulaValue("={$cellRange}", $token->value(), $cell);
|
||||
$rangeValue = self::getInstance($cell->getWorksheet()->getParent())->_calculateFormulaValue("={$cellRange}", $cellRange, $cell);
|
||||
$stack->push('Value', $rangeValue);
|
||||
$this->debugLog->writeDebugLog('Evaluated Structured Reference %s as value %s', $token->value(), $this->showValue($rangeValue));
|
||||
} else {
|
||||
@ -4745,7 +4752,7 @@ class Calculation
|
||||
$stack->push('Error', Information\ExcelError::REF(), null);
|
||||
$this->debugLog->writeDebugLog('Evaluated Structured Reference %s as error value %s', $token->value(), Information\ExcelError::REF());
|
||||
} else {
|
||||
return $this->raiseFormulaError($e->getMessage());
|
||||
return $this->raiseFormulaError($e->getMessage(), $e->getCode(), $e);
|
||||
}
|
||||
}
|
||||
} elseif (!is_numeric($token) && !is_object($token) && isset(self::BINARY_OPERATORS[$token])) {
|
||||
@ -4793,7 +4800,7 @@ class Calculation
|
||||
}
|
||||
}
|
||||
}
|
||||
if (strpos($operand1Data['reference'], '!') !== false) {
|
||||
if (strpos($operand1Data['reference'] ?? '', '!') !== false) {
|
||||
[$sheet1, $operand1Data['reference']] = Worksheet::extractSheetTitle($operand1Data['reference'], true);
|
||||
} else {
|
||||
$sheet1 = ($pCellWorksheet !== null) ? $pCellWorksheet->getTitle() : '';
|
||||
@ -4830,10 +4837,21 @@ class Calculation
|
||||
|
||||
$oData = array_merge(explode(':', $operand1Data['reference']), explode(':', $operand2Data['reference']));
|
||||
$oCol = $oRow = [];
|
||||
$breakNeeded = false;
|
||||
foreach ($oData as $oDatum) {
|
||||
$oCR = Coordinate::coordinateFromString($oDatum);
|
||||
$oCol[] = Coordinate::columnIndexFromString($oCR[0]) - 1;
|
||||
$oRow[] = $oCR[1];
|
||||
try {
|
||||
$oCR = Coordinate::coordinateFromString($oDatum);
|
||||
$oCol[] = Coordinate::columnIndexFromString($oCR[0]) - 1;
|
||||
$oRow[] = $oCR[1];
|
||||
} catch (\Exception $e) {
|
||||
$stack->push('Error', Information\ExcelError::REF(), null);
|
||||
$breakNeeded = true;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ($breakNeeded) {
|
||||
break;
|
||||
}
|
||||
$cellRef = Coordinate::stringFromColumnIndex(min($oCol) + 1) . min($oRow) . ':' . Coordinate::stringFromColumnIndex(max($oCol) + 1) . max($oRow);
|
||||
if ($pCellParent !== null && $this->spreadsheet !== null) {
|
||||
@ -4842,8 +4860,10 @@ class Calculation
|
||||
return $this->raiseFormulaError('Unable to access Cell Reference');
|
||||
}
|
||||
|
||||
$this->debugLog->writeDebugLog('Evaluation Result is %s', $this->showTypeDetails($cellValue));
|
||||
$stack->push('Cell Reference', $cellValue, $cellRef);
|
||||
} else {
|
||||
$this->debugLog->writeDebugLog('Evaluation Result is a #REF! Error');
|
||||
$stack->push('Error', Information\ExcelError::REF(), null);
|
||||
}
|
||||
|
||||
@ -5434,13 +5454,13 @@ class Calculation
|
||||
*
|
||||
* @return false
|
||||
*/
|
||||
protected function raiseFormulaError(string $errorMessage)
|
||||
protected function raiseFormulaError(string $errorMessage, int $code = 0, ?Throwable $exception = null)
|
||||
{
|
||||
$this->formulaError = $errorMessage;
|
||||
$this->cyclicReferenceStack->clear();
|
||||
$suppress = /** @scrutinizer ignore-deprecated */ $this->suppressFormulaErrors ?? $this->suppressFormulaErrorsNew;
|
||||
if (!$suppress) {
|
||||
throw new Exception($errorMessage);
|
||||
throw new Exception($errorMessage, $code, $exception);
|
||||
}
|
||||
|
||||
return false;
|
||||
@ -5603,7 +5623,7 @@ class Calculation
|
||||
|
||||
private function addDefaultArgumentValues(array $functionCall, array $args, array $emptyArguments): array
|
||||
{
|
||||
$reflector = new ReflectionMethod(implode('::', $functionCall));
|
||||
$reflector = new ReflectionMethod($functionCall[0], $functionCall[1]);
|
||||
$methodArguments = $reflector->getParameters();
|
||||
|
||||
if (count($methodArguments) > 0) {
|
||||
|
||||
Reference in New Issue
Block a user