【问题标题】:phpEXCEL getCalculatedValue not returning desired resultsphpEXCEL getCalculatedValue 未返回所需结果
【发布时间】: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格式

【问题讨论】:

    标签: php phpexcel


    【解决方案1】:

    评估条目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);
    

    对于3 的$taxrate 值,这会将0.03 存储在单元格中,但将其显示为3%。 0.03 是在公式表达式中使用的正确值。

    【讨论】:

    • 非常感谢您的友好回复。我是新手,不知道在哪里放置这个刷新实例。我在函数的顶部尝试了这个,但效果不佳。感谢您的帮助。
    • 如果你把它放在函数里面,你需要把它放在调用getCalculatedValue()之前,你需要修改它为PHPExcel_Calculation::getInstance( $sheet->getParent() )->flushInstance();
    • 好吧,它在尝试获取输出后由于数字乘以 3% 而丢失。我认为发生这种情况是因为它将 3% 视为字符串。我尝试更改格式,但这也无济于事。 $objPHPExcel->getActiveSheet()->getStyle('F28:F36')->getNumberFormat()->setFormatCode('#0%');我还尝试使用以下代码将其设置为百分比格式: setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE_00);
    • 如果您有一个包含3% 作为字符串的单元格,那么这可能等同于公式中的3(取决于它的使用方式),但充其量结果是不可预料的;如果单元格包含带有% 数字格式掩码的0.03,那么您将得到不同的结果。
    • 百分比应始终使用格式掩码存储在 Excel 中,而不是作为包含 % 符号的字符串,否则 MS Excel 本身将无法在公式中正确解析它们
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    相关资源
    最近更新 更多