phpEXCEL getCalculatedValue未返回所需的结果

时间:2016-02-03 06:16:31

标签: php phpexcel

我尝试使用在回复类似问题时发布的调试工具,但无法找到问题的解决方案。我的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格式

1 个答案:

答案 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是在公式表达式中使用的正确值。