phpExcel: getCalculatedValue() returns #VALUE



谁能帮我一下phpExcel代码:

这个代码:

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

的回报:

#VALUE!
#VALUE!
=AE19*I19

提前感谢!:)

为了帮助调试问题,请在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');

该命令的输出应该有助于诊断问题

如果您不确定单元格的内容(包括值或公式),我建议您首先检查单元格是否有公式,然后进行相应的复制粘贴。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()函数非常麻烦,需要大量内存才能正确执行。

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

原因最终是引用的单元格之一包含NULL值,即使Excel正确处理了这个。我所要做的就是给这个单元格添加一个0值它就可以计算出来了

您应该尝试打开原始Excel文件并查看单元格AF19。最有可能的是,即使MS Excel本身在计算值时也有问题,因为位于AF19的公式有问题。

可能是

这个公式试图将两个不包含数字

的单元格相乘

= AE19 * I19

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

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

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

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

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

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

//你可以这样设置

$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);

最新更新