phpEXCEL getCalculatedValue未返回所需结果

phpEXCEL getCalculatedValue未返回所需结果,php,phpexcel,Php,Phpexcel,我曾尝试使用在回复类似问题时发布的调试工具,但未能找到问题的解决方案。我的excel工作表如下所示: G36=总和(G24:G28)。G24->G28=总和(B24:G24),依此类推 它使用getValue()返回公式,使用getCalculatedValue()返回#Value 以下是调试工具的输出 公式值为=总和(G28:G34)预期值为未知解析器堆栈 :-数组([0]=>数组([type]=>单元格引用[value]=>G28 [reference]=>G28[1]=>Array([ty

我曾尝试使用在回复类似问题时发布的调试工具,但未能找到问题的解决方案。我的excel工作表如下所示: G36=总和(G24:G28)。G24->G28=总和(B24:G24),依此类推

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

以下是调试工具的输出

公式值为=总和(G28:G34)预期值为未知解析器堆栈 :-数组([0]=>数组([type]=>单元格引用[value]=>G28 [reference]=>G28[1]=>Array([type]=>Cell reference[value] =>G34[reference]=>G34[2]=>数组([type]=>二进制运算符[value]=>:[reference]=>)[3]=>数组([type]=>操作数计数 对于函数SUM()[value]=>1[reference]=>)[4]=>Array([type] =>函数[value]=>求和([reference]=>)计算值为0评估日志:数组([0]=>测试单元格的缓存值 工作表!G36[1]=>正在从中检索单元格工作表!G36的值 缓存)

以下是我实施@MarkBaker在下面的答案中建议的更改后的输出

公式值为=总和(G28:G34)预期值为未知解析器堆栈 :-数组([0]=>数组([type]=>单元格引用[value]=>G28 [reference]=>G28[1]=>Array([type]=>Cell reference[value] =>G34[reference]=>G34[2]=>数组([type]=>二进制运算符[value]=>:[reference]=>)[3]=>数组([type]=>操作数计数 对于函数SUM()[value]=>1[reference]=>)[4]=>Array([type] =>函数[value]=>求和([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=>计算当前工作表[13]中的单元格F28=>工作表!G36->工作表!G28=>测试缓存 单元格工作表的值!F28[14]=>工作表!G36->工作表!G28-> 工作表!F28=>计算当前工作表中的单元格D28[15]=> 工作表!G36->工作表!G28->工作表!F28=>测试缓存值 对于单元格工作表!D28[16]=>工作表!G36->工作表!G28-> 工作表!F28=>正在从缓存中检索单元格工作表!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=>评估结果 是a值!错误[22]=>工作表!G36->工作表!G28=> 单元格工作表的评估结果!F28是一个#值!错误[23]=> 工作表!G36->工作表!G28=>评估1400000+“#值!”[24] =>工作表!G36->工作表!G28=>计算结果是一个#值!错误[25]=>工作表!G36=>单元格的计算结果 工作表!G28是一个#值!错误[26]=>工作表!G36=>评估 当前工作表中的单元格G34[27]=>工作表!G36=>评估 单元格工作表!G34的结果为空值[28]=>工作表!G36=> 评估范围“工作表!G28”:“工作表!G34”[29]=> 工作表!G36=>测试单元格工作表的缓存值!G28[30]=> 工作表!G36=>正在从缓存中检索单元格工作表!G28的值 [31]=>工作表!G36=>测试单元格工作表的缓存值!G29 [32]=>工作表!G36->工作表!G29=>计算中的单元格D29 当前工作表[33]=>工作表!G36->工作表!G29=>测试 单元格工作表的缓存值!D29[34]=>工作表!G36-> 工作表!G29->工作表!D29=>计算当前单元格中的B29 工作表[35]=>工作表!G36->工作表!G29->工作表!D29=> 单元格工作表的计算结果!B29是一个浮点数 值为5000[36]=>工作表!G36->工作表!G29-> 工作表!D29=>计算当前工作表中的单元格C29[37]=> 工作表!G36->工作表!G29->工作表!D29=>评估结果 对于单元格工作表!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->工作表!
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');
PHPExcel_Calculation::getInstance(
    $objPHPExcel
)->flushInstance();
$objPHPExcel->getActiveSheet()
    ->getCell("E$a")
    ->setValue($taxrate / 100);
$objPHPExcel->getActiveSheet()
    ->getCell("E$a")
    ->getNumberFormat()
    ->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE);