我尝试使用在回复类似问题时发布的调试工具,但无法找到问题的解决方案。我的Excel表格如下: G36 = SUM(G24:G28)。 G24-> G28 = SUM(B24:G24)等等。
它返回带有getValue()和#Value的公式和getCalculatedValue()
以下是调试工具的输出。
公式值= SUM(G28:G34)预期值为UNKNOWN Parser Stack : - 数组([0] =>数组([类型] =>单元格参考[值] => G28 [参考] => G28)[1] =>数组([type] =>单元格参考[值] => G34 [参考] => G34)[2] =>数组([type] =>二元运算符[value] =>:[reference] =>)[3] =>数组([type] =>操作数计数 for Function SUM()[value] => 1 [参考] => )[4] =>数组([类型] =>函数[value] => SUM([reference] =>))计算值为0评估日志:数组([0] =>测试单元格的缓存值 工作表!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 Parser Stack : - 数组([0] =>数组([类型] =>单元格参考[值] => G28 [参考] => G28)[1] =>数组([type] =>单元格参考[值] => G34 [参考] => G34)[2] =>数组([type] =>二元运算符[value] =>:[reference] =>)[3] =>数组([type] =>操作数计数 for Function SUM()[value] => 1 [参考] => )[4] =>数组([类型] =>函数[value] => SUM([reference] =>))计算值为0评估日志:数组([0] =>测试单元格的缓存值 工作表!G36 [1] =>工作表!G36 =>在电流中评估电池G28 工作表[2] =>工作表!G36 =>测试单元格的缓存值 工作表!G28 [3] =>工作表!G36 - >工作表!G28 =>评估细胞 当前工作表中的D28 [4] =>工作表!G36 - >工作表!G28 => 测试单元格工作表的缓存值!D28 [5] =>工作表!G36 - > 工作表!G28 - >工作表!D28 =>评估当前的细胞B28 工作表[6] =>工作表!G36 - >工作表!G28 - >工作表!D28 => 单元工作表的评估结果!B28是浮点数 值为10000 [7] =>工作表!G36 - >工作表!G28 - > 工作表!D28 =>评估当前工作表中的单元格C28 [8] => 工作表!G36 - >工作表!G28 - >工作表!D28 =>评价结果 单元格工作表!C28是浮点数,值为140 [9] =>工作表!G36 - >工作表!G28 - >工作表!D28 =>评估 10000 * 140 [10] =>工作表!G36 - >工作表!G28 - >工作表!D28 => 评估结果是一个浮点数,值为1400000 [11] =>工作表!G36 - >工作表!G28 =>细胞的评估结果 工作表!D28是一个浮点数,值为1400000 [12] =>工作表!G36 - >工作表!G28 =>评估当前工作表中的单元格F28 [13] =>工作表!G36 - >工作表!G28 =>测试缓存 单元格工作表的值!F28 [14] =>工作表!G36 - >工作表!G28 - > 工作表!F28 =>评估当前工作表中的单元格D28 [15] => 工作表!G36 - >工作表!G28 - >工作表!F28 =>测试缓存值 for cell Worksheet!D28 [16] =>工作表!G36 - >工作表!G28 - > 工作表!F28 =>从缓存中检索单元格Worksheet!D28的值 [17] =>工作表!G36 - >工作表!G28 - >工作表!F28 =>评估 单元格工作表的结果!D28是带有值的浮点数 1400000 [18] =>工作表!G36 - >工作表!G28 - >工作表!F28 => 评估当前工作表中的单元格E28 [19] =>工作表!G36 - > 工作表!G28 - >工作表!F28 =>细胞的评估结果 工作表!E28是一个字符串,其值为" 3%" [20] =>工作表!G36 - >工作表!G28 - >工作表!F28 =>评估1400000 *" 3%" [21] =>工作表!G36 - >工作表!G28 - >工作表!F28 =>评价结果 是一个#VALUE!错误[22] =>工作表!G36 - >工作表!G28 => 单元格工作表的评估结果!F28是#VALUE!错误[23] => 工作表!G36 - >工作表!G28 =>评估1400000 +" #VALUE!" [24] =>工作表!G36 - >工作表!G28 =>评估结果是#VALUE!错误[25] =>工作表!G36 =>细胞的评估结果 工作表!G28是#VALUE!错误[26] =>工作表!G36 =>评估 当前工作表中的单元格G34 [27] =>工作表!G36 =>评估 单元格工作表的结果!G34是NULL值[28] =>工作表!G36 => 评估范围"工作表!G28" :"工作表!G34" [29] => 工作表!G36 =>测试单元格工作表的缓存值!G28 [30] => 工作表!G36 =>从缓存中检索单元格Worksheet!G28的值 [31] =>工作表!G36 =>测试单元格工作表的缓存值!G29 [32] =>工作表!G36 - >工作表!G29 =>评估细胞D29 当前工作表[33] =>工作表!G36 - >工作表!G29 =>测试 单元格工作表的缓存值!D29 [34] =>工作表!G36 - > 工作表!G29 - >工作表!D29 =>评估当前的Cell B29 工作表[35] =>工作表!G36 - >工作表!G29 - >工作表!D29 => 单元工作表的评估结果!B29是浮点数 值为5000 [36] =>工作表!G36 - >工作表!G29 - > 工作表!D29 =>评估当前工作表中的单元格C29 [37] => 工作表!G36 - >工作表!G29 - >工作表!D29 =>评价结果 for cell Worksheet!C29是一个浮点数,值为102 [38] =>工作表!G36 - >工作表!G29 - >工作表!D29 =>评估 5000 * 102 [39] =>工作表!G36 - >工作表!G29 - >工作表!D29 => 评估结果是一个浮点数,值为510000 [40] =>工作表!G36 - >工作表!G29 =>细胞的评估结果 工作表!D29是一个浮点数,值为510000 [41] =>工作表!G36 - >工作表!G29 =>评估当前工作表中的单元格F29 [42] =>工作表!G36 - >工作表!G29 =>测试缓存 单元格工作表的值!F29 [43] =>工作表!G36 - >工作表!G29 - > 工作表!F29 =>评估当前工作表中的单元格D29 [44] => 工作表!G36 - >工作表!G29 - >工作表!F29 =>测试缓存值 for cell Worksheet!D29 [45] =>工作表!G36 - >工作表!G29 - > 工作表!F29 =>从缓存中检索单元格Worksheet!D29的值 [46] =>工作表!G36 - >工作表!G29 - >工作表!F29 =>评估 单元格工作表的结果!D29是带有值的浮点数 510000 [47] =>工作表!G36 - >工作表!G29 - >工作表!F29 => 评估当前工作表中的单元格E29 [48] =>工作表!G36 - > 工作表!G29 - >工作表!F29 =>细胞的评估结果 工作表!E29是一个字符串,其值为" 3%" [49] =>工作表!G36 - >工作表!G29 - >工作表!F29 =>评估510000 *" 3%" [50] =>工作表!G36 - >工作表!G29 - >工作表!F29 =>评价结果 是一个#VALUE!错误[51] =>工作表!G36 - >工作表!G29 => 单元工作表的评估结果!F29是#VALUE!错误[52] => 工作表!G36 - >工作表!G29 =>评估510000 +" #VALUE!" [53] =>工作表!G36 - >工作表!G29 =>评估结果是#VALUE!错误[54] =>工作表!G36 =>使用1评估函数SUM() 参数[55] =>工作表!G36 =>评估SUM({" #VALUE!&#34 ;; "!#VALUE&#34 ;; ; ; ; ; })[56] =>工作表!G36 =>评估结果 SUM()函数调用是一个整数,值为0)14:16:49 写入Excel2007格式
答案 0 :(得分:2)
评估条目Retrieving value for cell Worksheet!G36 from cache
告诉您计算引擎正在检索先前已缓存的getCalculatedValue()
请求中的数据。
也许您应该尝试刷新计算缓存,然后通过记录器重新运行计算。
您可以使用
刷新计算缓存PHPExcel_Calculation::getInstance(
$objPHPExcel
)->flushInstance();
然后您将能够完整地重新计算公式,并查看计算的执行方式
修改强>
使用PHPExcel设置包含百分比值的单元格:
$objPHPExcel->getActiveSheet()
->getCell("E$a")
->setValue($taxrate / 100);
$objPHPExcel->getActiveSheet()
->getCell("E$a")
->getNumberFormat()
->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE);
对于$taxrate
3
的值,这会将0.03
存储在单元格中,但会将其显示为3%
。 0.03是在公式表达式中使用的正确值。