phpExcel:getCalculatedValue()返回#VALUE

时间:2013-05-23 07:53:37

标签: php phpexcel

有人可以帮助我使用phpExcel代码:

此代码:

$objPHPExcel->getActiveSheet()->getCell("AF19")->getCalculatedValue();
$objPHPExcel->getActiveSheet()->getCell("AF19")->getFormattedValue();
$objPHPExcel->getActiveSheet()->getCell("AF19")->getValue();

返回:

#VALUE!
#VALUE!
=AE19*I19

提前谢谢! :)

6 个答案:

答案 0 :(得分:6)

要帮助调试问题,请在DEBUG模式下运行计算:

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()->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) {
        try {
            $cellValue = $sheet->getCell($cell)->getCalculatedValue();
            echo 'Calculated Value is ' , $cellValue , PHP_EOL;

            echo 'Evaluation Log:' , PHP_EOL;
            print_r(PHPExcel_Calculation::getInstance()->debugLog);
            echo PHP_EOL;
        } catch (Exception $e) {
            echo 'CALCULATION ENGINE ERROR: ' , $e->getMessage() , PHP_EOL;

            echo 'Evaluation Log:' , PHP_EOL;
            print_r(PHPExcel_Calculation::getInstance()->debugLog);
            echo PHP_EOL;
        }
    }
}

$sheet = $objPHPExcel->getActiveSheet();
PHPExcel_Calculation::getInstance()->writeDebugLog = true;

testFormula($sheet,'AF19');

此输出应有助于诊断问题

答案 1 :(得分:3)

如果您不确定单元格的内容(包含的值或公式),我建议您主要检查单元格是否有公式,然后复制 - 相应粘贴。在这种情况下,getOldCalculatedValue()非常有用。这是一个例子:

$code = $sheet->getCell('A'.$y)->getValue();
if(strstr($code,'=')==true)
{
    $code = $sheet->getCell('A'.$y)->getOldCalculatedValue();
}
$objPHPExcel4->setActiveSheetIndex(0)
             ->setCellValue('A'.$l, $code);

对于大型数据集,getCalculatedValue()函数非常麻烦,并且需要大量内存才能正确执行。

答案 2 :(得分:1)

我遇到了类似的问题,getCalculatedValue()返回了#VALUE!在引用包含公式的另一个单元格的单元格上。

原因最终是被引用的包含NULL值的单元格之一,即使Excel正确处理了这一点。我所要做的只是在该单元格中添加0值,计算得很好。

答案 3 :(得分:0)

您应该尝试打开原始Excel文件并查看单元格AF19。很可能甚至MS Excel本身也无法计算该值,因为AF19的公式存在问题。

可能是那个

此公式试图将两个不包含数字的单元格相乘

  

= AE19 * I19

AE19包含一个逗号,未格式化为数字,因此PHPExcel将其视为字符串

在这种情况下,您可以尝试通过右键单击(在Excel中)并指定数字格式来格式化Excel中的数据。

答案 4 :(得分:0)

//你可以像这样设置

$objPHPExcel->getActiveSheet()->setCellValue('A20','=AE19 * I19');

//因为php excel在字符串中定义代码所以你会得到错误。因为在phpexcel中你必须使用公式excel。不能像这样的A1 + A2或者哦。

你可以像这样在PHP中繁殖

$bil1 = $objPHPExcel->getActiveSheet()->getCell("AE19")->getValue()

$bl2 = $objPHPExcel->getActiveSheet()->getCell("I19")->getValue()

//函数乘法。

$total=$bil1*$bil2;

之后,您可以在单元格中设置总数

$objPHPExcel->getActiveSheet()->setCellValue('A20',$total);

这在我的php中工作。

答案 5 :(得分:0)

我认为当一个单元格为空时,就会出现这个问题的根源。当单元格设置为空字符串时,某些公式可能会失败。这是一个失败的示例公式:

=TEXT(A1, "mm/dd/yyyy")

为了对付这个" #VALUE!"问题,在一个小项目中,我将空单元格设置为NULL而不是''

$target = ($target == '')? NULL: $target; // without this, empty cells end up being #VALUE! after some formulas