【发布时间】:2016-02-03 06:16:31
【问题描述】:
我曾尝试使用在回复类似问题时发布的调试工具,但无法找到解决问题的方法。我的 excel 表如下所示: G36 = 总和(G24:G28)。 G24->G28 = SUM(B24:G24) 等等。
它用 getValue() 和 #Value 用 getCalculatedValue() 返回公式
以下是调试工具的输出。
公式值为=SUM(G28:G34) 预期值为 UNKNOWN 解析器堆栈 :- Array ( [0] => Array ( [type] => Cell Reference [value] => G28 [参考] => G28 ) [1] => 数组 ( [类型] => 单元格参考 [值] => G34 [reference] => G34 ) [2] => Array ( [type] => Binary Operator [value] => : [reference] => ) [3] => Array ( [type] => Operand Count 对于函数 SUM() [value] => 1 [reference] => ) [4] => Array ( [type] => Function [value] => SUM( [reference] => ) ) 计算值为 0 评估日志:Array ( [0] => 测试单元格的缓存值 Worksheet!G36 [1] => 检索单元格 Worksheet!G36 的值 缓存)
function testFormula($sheet,$cell) {
$formulaValue = $sheet->getCell($cell)->getValue();
echo 'Formula Value is' , $formulaValue , PHP_EOL;
$expectedValue = $sheet->getCell($cell)->getOldCalculatedValue();
echo 'Expected Value is ' , ((!is_null($expectedValue)) ? $expectedValue : 'UNKNOWN') , PHP_EOL;
$calculate = false;
try {
$tokens = PHPExcel_Calculation::getInstance(
$sheet->getParent()
)->parseFormula(
$formulaValue,
$sheet->getCell($cell)
);
echo 'Parser Stack :-' , PHP_EOL;
print_r($tokens);
echo PHP_EOL;
$calculate = true;
} catch (Exception $e) {
echo 'PARSER ERROR: ' , $e->getMessage() , PHP_EOL;
echo 'Parser Stack :-' , PHP_EOL;
print_r($tokens);
echo PHP_EOL;
}
if ($calculate) {
PHPExcel_Calculation::getInstance(
$sheet->getParent()
)->getDebugLog()
->setWriteDebugLog(true);
try {
$cellValue = $sheet->getCell($cell)->getCalculatedValue();
echo 'Calculated Value is ' , $cellValue , PHP_EOL;
echo 'Evaluation Log:' , PHP_EOL;
print_r(
PHPExcel_Calculation::getInstance(
$sheet->getParent()
)->getDebugLog()
->getLog()
);
echo PHP_EOL;
} catch (Exception $e) {
echo 'CALCULATION ENGINE ERROR: ' , $e->getMessage() , PHP_EOL;
echo 'Evaluation Log:' , PHP_EOL;
print_r(
PHPExcel_Calculation::getInstance(
$sheet->getParent()
)->debugLog
->getLog()
);
echo PHP_EOL;
}
}
}
$sheet = $objPHPExcel->getActiveSheet();
testFormula($sheet,'G36');
以下是我在下面的回答中实施@MarkBaker 建议的更改后的输出。
公式值为=SUM(G28:G34) 预期值为 UNKNOWN 解析器堆栈 :- Array ( [0] => Array ( [type] => Cell Reference [value] => G28 [参考] => G28 ) [1] => 数组 ( [类型] => 单元格参考 [值] => G34 [reference] => G34 ) [2] => Array ( [type] => Binary Operator [value] => : [reference] => ) [3] => Array ( [type] => Operand Count 对于函数 SUM() [value] => 1 [reference] => ) [4] => Array ( [type] => Function [value] => SUM( [reference] => ) ) 计算值为 0 评估日志:Array ( [0] => 测试单元格的缓存值 Worksheet!G36 [1] => Worksheet!G36 => 评估当前单元格 G28 工作表 [2] => 工作表!G36 => 测试单元格的缓存值 工作表!G28 [3] => 工作表!G36 -> 工作表!G28 => 评估单元格 当前工作表中的 D28 [4] => Worksheet!G36 -> Worksheet!G28 => 测试单元格 Worksheet!D28 [5] => Worksheet!G36 -> 的缓存值 Worksheet!G28 -> Worksheet!D28 => 评估当前单元格 B28 工作表 [6] => 工作表!G36 -> 工作表!G28 -> 工作表!D28 => 单元格工作表的评估结果!B28 是一个浮点数 值为 10000 [7] => Worksheet!G36 -> Worksheet!G28 -> Worksheet!D28 => 评估当前工作表 [8] 中的单元格 C28 => Worksheet!G36 -> Worksheet!G28 -> Worksheet!D28 => 评估结果 对于单元格 Worksheet!C28 是一个浮点数,值为 140 [9] => 工作表!G36 -> 工作表!G28 -> 工作表!D28 => 评估 10000 * 140 [10] => 工作表!G36 -> 工作表!G28 -> 工作表!D28 => 评估结果是一个浮点数,值为 1400000 [11] => Worksheet!G36 -> Worksheet!G28 => 单元格的评估结果 Worksheet!D28 是一个浮点数,值为 1400000 [12] => Worksheet!G36 -> Worksheet!G28 => 评估当前工作表 [13] 中的单元格 F28 => Worksheet!G36 -> Worksheet!G28 => 测试缓存 单元格 Worksheet!F28 [14] => Worksheet!G36 -> Worksheet!G28 -> 的值 Worksheet!F28 => 评估当前工作表 [15] 中的单元格 D28 => Worksheet!G36 -> Worksheet!G28 -> Worksheet!F28 => 测试缓存值 对于单元格 Worksheet!D28 [16] => Worksheet!G36 -> Worksheet!G28 -> Worksheet!F28 => 从缓存中检索单元格 Worksheet!D28 的值 [17] => 工作表!G36 -> 工作表!G28 -> 工作表!F28 => 评估 单元格 Worksheet!D28 的结果是一个带有值的浮点数 共 1400000 [18] => 工作表!G36 -> 工作表!G28 -> 工作表!F28 => 评估当前工作表 [19] 中的单元格 E28 => Worksheet!G36 -> Worksheet!G28 -> Worksheet!F28 => 单元格的评估结果 Worksheet!E28 是一个值为 "3%" [20] => Worksheet!G36 的字符串 -> Worksheet!G28 -> Worksheet!F28 => 评估 1400000 * "3%" [21] => Worksheet!G36 -> Worksheet!G28 -> Worksheet!F28 => 评估结果 是一个#VALUE!错误 [22] => 工作表!G36 -> 工作表!G28 => 单元格工作表的评估结果!F28 是#VALUE!错误 [23] => 工作表!G36 -> 工作表!G28 => 评估 1400000 + “#VALUE!” [24] => Worksheet!G36 -> Worksheet!G28 => 评估结果是#VALUE!错误 [25] => 工作表!G36 => 单元格的评估结果 工作表!G28 是#VALUE!错误 [26] => 工作表!G36 => 评估 当前工作表 [27] 中的单元格 G34 => 工作表!G36 => 评估 单元格 Worksheet!G34 的结果是 NULL 值 [28] => Worksheet!G36 => 评估范围“工作表!G28”:“工作表!G34”[29] => Worksheet!G36 => 测试单元格的缓存值 Worksheet!G28 [30] => Worksheet!G36 => 从缓存中检索单元格 Worksheet!G28 的值 [31] => Worksheet!G36 => 测试单元格 Worksheet!G29 的缓存值 [32] => Worksheet!G36 -> Worksheet!G29 => 计算单元格 D29 当前工作表 [33] => 工作表!G36 -> 工作表!G29 => 测试 单元格的缓存值 Worksheet!D29 [34] => Worksheet!G36 -> Worksheet!G29 -> Worksheet!D29 => 评估当前单元格 B29 工作表 [35] => 工作表!G36 -> 工作表!G29 -> 工作表!D29 => 单元格工作表的评估结果!B29 是浮点数 值为 5000 [36] => Worksheet!G36 -> Worksheet!G29 -> Worksheet!D29 => 评估当前工作表 [37] 中的单元格 C29 => Worksheet!G36 -> Worksheet!G29 -> Worksheet!D29 => 评估结果 对于单元格 Worksheet!C29 是一个浮点数,值为 102 [38] => 工作表!G36 -> 工作表!G29 -> 工作表!D29 => 评估 5000 * 102 [39] => 工作表!G36 -> 工作表!G29 -> 工作表!D29 => 评估结果是一个浮点数,值为 510000 [40] => Worksheet!G36 -> Worksheet!G29 => 单元格的评估结果 Worksheet!D29 是一个浮点数,值为 510000 [41] => Worksheet!G36 -> Worksheet!G29 => 评估当前工作表 [42] 中的单元格 F29 => Worksheet!G36 -> Worksheet!G29 => 测试缓存 单元格 Worksheet!F29 [43] => Worksheet!G36 -> Worksheet!G29 -> 的值 Worksheet!F29 => 评估当前工作表 [44] 中的单元格 D29 => Worksheet!G36 -> Worksheet!G29 -> Worksheet!F29 => 测试缓存值 对于单元格 Worksheet!D29 [45] => Worksheet!G36 -> Worksheet!G29 -> Worksheet!F29 => 从缓存中检索单元格 Worksheet!D29 的值 [46] => 工作表!G36 -> 工作表!G29 -> 工作表!F29 => 评估 单元格 Worksheet!D29 的结果是具有值的浮点数 510000 [47] => 工作表!G36 -> 工作表!G29 -> 工作表!F29 => 评估当前工作表 [48] 中的单元格 E29 => Worksheet!G36 -> Worksheet!G29 -> Worksheet!F29 => 单元格的评估结果 Worksheet!E29 是一个值为 "3%" [49] => Worksheet!G36 的字符串 -> Worksheet!G29 -> Worksheet!F29 => 评估 510000 * "3%" [50] => Worksheet!G36 -> Worksheet!G29 -> Worksheet!F29 => 评估结果 是一个#VALUE!错误 [51] => 工作表!G36 -> 工作表!G29 => 单元格工作表的评估结果!F29 是#VALUE!错误 [52] => 工作表!G36 -> 工作表!G29 => 评估 510000 + “#VALUE!” [53] => Worksheet!G36 -> Worksheet!G29 => 评估结果是#VALUE!错误 [54] => Worksheet!G36 => 用 1 评估函数 SUM() 参数 [55] => Worksheet!G36 => 评估 SUM( { "#VALUE!"; “#价值!”; ; ; ; ; } ) [56] => 工作表!G36 => 评估结果 SUM() 函数调用是一个整数,值为 0 ) 14:16:49 写入Excel2007格式
【问题讨论】: