phpEXCEL getCalculatedValue 未返回所需结果

标签 php phpexcel

我尝试使用在回复类似问题时发布的调试工具,但无法找到问题的解决方案。我的 Excel 工作表如下所示: G36 = 总和(G24:G28)。 G24->G28 = SUM(B24:G24) 等等。

它使用 getValue() 返回公式,并使用 getCalculatedValue() 返回 #Value

以下是调试工具的输出。

Formula Value is=SUM(G28:G34) Expected Value is UNKNOWN Parser Stack :- Array ( [0] => Array ( [type] => Cell Reference [value] => G28 [reference] => G28 ) [1] => Array ( [type] => Cell Reference [value] => G34 [reference] => G34 ) [2] => Array ( [type] => Binary Operator [value] => : [reference] => ) [3] => Array ( [type] => Operand Count for Function SUM() [value] => 1 [reference] => ) [4] => Array ( [type] => Function [value] => SUM( [reference] => ) ) Calculated Value is 0 Evaluation Log: Array ( [0] => Testing cache value for cell Worksheet!G36 [1] => Retrieving value for cell Worksheet!G36 from cache )

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 在下面的回答中建议的更改后的输出。

Formula Value is=SUM(G28:G34) Expected Value is UNKNOWN Parser Stack :- Array ( [0] => Array ( [type] => Cell Reference [value] => G28 [reference] => G28 ) [1] => Array ( [type] => Cell Reference [value] => G34 [reference] => G34 ) [2] => Array ( [type] => Binary Operator [value] => : [reference] => ) [3] => Array ( [type] => Operand Count for Function SUM() [value] => 1 [reference] => ) [4] => Array ( [type] => Function [value] => SUM( [reference] => ) ) Calculated Value is 0 Evaluation Log: Array ( [0] => Testing cache value for cell Worksheet!G36 [1] => Worksheet!G36 => Evaluating Cell G28 in current worksheet [2] => Worksheet!G36 => Testing cache value for cell Worksheet!G28 [3] => Worksheet!G36 -> Worksheet!G28 => Evaluating Cell D28 in current worksheet [4] => Worksheet!G36 -> Worksheet!G28 => Testing cache value for cell Worksheet!D28 [5] => Worksheet!G36 -> Worksheet!G28 -> Worksheet!D28 => Evaluating Cell B28 in current worksheet [6] => Worksheet!G36 -> Worksheet!G28 -> Worksheet!D28 => Evaluation Result for cell Worksheet!B28 is a floating point number with a value of 10000 [7] => Worksheet!G36 -> Worksheet!G28 -> Worksheet!D28 => Evaluating Cell C28 in current worksheet [8] => Worksheet!G36 -> Worksheet!G28 -> Worksheet!D28 => Evaluation Result for cell Worksheet!C28 is a floating point number with a value of 140 [9] => Worksheet!G36 -> Worksheet!G28 -> Worksheet!D28 => Evaluating 10000 * 140 [10] => Worksheet!G36 -> Worksheet!G28 -> Worksheet!D28 => Evaluation Result is a floating point number with a value of 1400000 [11] => Worksheet!G36 -> Worksheet!G28 => Evaluation Result for cell Worksheet!D28 is a floating point number with a value of 1400000 [12] => Worksheet!G36 -> Worksheet!G28 => Evaluating Cell F28 in current worksheet [13] => Worksheet!G36 -> Worksheet!G28 => Testing cache value for cell Worksheet!F28 [14] => Worksheet!G36 -> Worksheet!G28 -> Worksheet!F28 => Evaluating Cell D28 in current worksheet [15] => Worksheet!G36 -> Worksheet!G28 -> Worksheet!F28 => Testing cache value for cell Worksheet!D28 [16] => Worksheet!G36 -> Worksheet!G28 -> Worksheet!F28 => Retrieving value for cell Worksheet!D28 from cache [17] => Worksheet!G36 -> Worksheet!G28 -> Worksheet!F28 => Evaluation Result for cell Worksheet!D28 is a floating point number with a value of 1400000 [18] => Worksheet!G36 -> Worksheet!G28 -> Worksheet!F28 => Evaluating Cell E28 in current worksheet [19] => Worksheet!G36 -> Worksheet!G28 -> Worksheet!F28 => Evaluation Result for cell Worksheet!E28 is a string with a value of "3%" [20] => Worksheet!G36 -> Worksheet!G28 -> Worksheet!F28 => Evaluating 1400000 * "3%" [21] => Worksheet!G36 -> Worksheet!G28 -> Worksheet!F28 => Evaluation Result is a a #VALUE! error [22] => Worksheet!G36 -> Worksheet!G28 => Evaluation Result for cell Worksheet!F28 is a #VALUE! error [23] => Worksheet!G36 -> Worksheet!G28 => Evaluating 1400000 + "#VALUE!" [24] => Worksheet!G36 -> Worksheet!G28 => Evaluation Result is a #VALUE! error [25] => Worksheet!G36 => Evaluation Result for cell Worksheet!G28 is a #VALUE! error [26] => Worksheet!G36 => Evaluating Cell G34 in current worksheet [27] => Worksheet!G36 => Evaluation Result for cell Worksheet!G34 is a NULL value [28] => Worksheet!G36 => Evaluating Range "Worksheet!G28" : "Worksheet!G34" [29] => Worksheet!G36 => Testing cache value for cell Worksheet!G28 [30] => Worksheet!G36 => Retrieving value for cell Worksheet!G28 from cache [31] => Worksheet!G36 => Testing cache value for cell Worksheet!G29 [32] => Worksheet!G36 -> Worksheet!G29 => Evaluating Cell D29 in current worksheet [33] => Worksheet!G36 -> Worksheet!G29 => Testing cache value for cell Worksheet!D29 [34] => Worksheet!G36 -> Worksheet!G29 -> Worksheet!D29 => Evaluating Cell B29 in current worksheet [35] => Worksheet!G36 -> Worksheet!G29 -> Worksheet!D29 => Evaluation Result for cell Worksheet!B29 is a floating point number with a value of 5000 [36] => Worksheet!G36 -> Worksheet!G29 -> Worksheet!D29 => Evaluating Cell C29 in current worksheet [37] => Worksheet!G36 -> Worksheet!G29 -> Worksheet!D29 => Evaluation Result for cell Worksheet!C29 is a floating point number with a value of 102 [38] => Worksheet!G36 -> Worksheet!G29 -> Worksheet!D29 => Evaluating 5000 * 102 [39] => Worksheet!G36 -> Worksheet!G29 -> Worksheet!D29 => Evaluation Result is a floating point number with a value of 510000 [40] => Worksheet!G36 -> Worksheet!G29 => Evaluation Result for cell Worksheet!D29 is a floating point number with a value of 510000 [41] => Worksheet!G36 -> Worksheet!G29 => Evaluating Cell F29 in current worksheet [42] => Worksheet!G36 -> Worksheet!G29 => Testing cache value for cell Worksheet!F29 [43] => Worksheet!G36 -> Worksheet!G29 -> Worksheet!F29 => Evaluating Cell D29 in current worksheet [44] => Worksheet!G36 -> Worksheet!G29 -> Worksheet!F29 => Testing cache value for cell Worksheet!D29 [45] => Worksheet!G36 -> Worksheet!G29 -> Worksheet!F29 => Retrieving value for cell Worksheet!D29 from cache [46] => Worksheet!G36 -> Worksheet!G29 -> Worksheet!F29 => Evaluation Result for cell Worksheet!D29 is a floating point number with a value of 510000 [47] => Worksheet!G36 -> Worksheet!G29 -> Worksheet!F29 => Evaluating Cell E29 in current worksheet [48] => Worksheet!G36 -> Worksheet!G29 -> Worksheet!F29 => Evaluation Result for cell Worksheet!E29 is a string with a value of "3%" [49] => Worksheet!G36 -> Worksheet!G29 -> Worksheet!F29 => Evaluating 510000 * "3%" [50] => Worksheet!G36 -> Worksheet!G29 -> Worksheet!F29 => Evaluation Result is a a #VALUE! error [51] => Worksheet!G36 -> Worksheet!G29 => Evaluation Result for cell Worksheet!F29 is a #VALUE! error [52] => Worksheet!G36 -> Worksheet!G29 => Evaluating 510000 + "#VALUE!" [53] => Worksheet!G36 -> Worksheet!G29 => Evaluation Result is a #VALUE! error [54] => Worksheet!G36 => Evaluating Function SUM() with 1 argument [55] => Worksheet!G36 => Evaluating SUM( { "#VALUE!"; "#VALUE!"; ; ; ; ; } ) [56] => Worksheet!G36 => Evaluation Result for SUM() function call is an integer number with a value of 0 ) 14:16:49 Write to Excel2007 format

最佳答案

评估条目从缓存中检索单元格Worksheet!G36的值告诉您,计算引擎正在从先前对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 是在公式表达式中使用的正确值。

关于phpEXCEL getCalculatedValue 未返回所需结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35169797/

相关文章:

phpExcel在单元格中写入长数字

php - Kartik/Krajee Select2 未禁用

php - 如何对某些用户隐藏某些网页或链接?

php - 如何对 MediaWiki 中的 .php 文件应用补丁?

php - 写入文件时防止 PHPExcel 计算值

PHPExcel:如何在第一页标题中插入图像并将其放大以适合其内容?

php - 在 Amazon S3 中存储 PHPExcel 文件

phpexcel - PHPExcel 中的自动调整列然后添加大标题文本,而不会弄乱宽度

php - <o :p>&nbsp;</o:p> < o : p > & nbsp ; </o : p > display error

php - 在php中动态创建类事件