PHPExcel getCalculatedValue()导致#REF

时间:2012-02-06 17:39:33

标签: phpexcel

我在PHPExcel中使用getCalculatedValue()来读取34个Excel文件。不幸的是,有些用户将i:\ drive \ test [month.xls] $ C $ 1放入单元格,导致PHPExcel无法读取和存储#REF!在mysql中。

我知道getCalculatedValue()会读取单元格中的公式,但链接怎么样?此外,Excel文件中找到的链接是外部链接,我无法访问。

虽然单元格包含指向另一个工作表的链接,但在单元格本身上显示了一些值。最好的解决方案是复制所有和粘贴值。但是,为此目的打开34个Excel文件似乎不切实际。

我感谢有人可以启发我。

感谢。

3 个答案:

答案 0 :(得分:5)

如果遇到对外部工作簿的引用,PHPExcel的最新SVN代码将抛出异常。您可以将getCalculatedValue()调用包装在try / catch块中,如果抛出此异常,请使用getOldCalculatedValue()从MS Excel本身上次计算此单元格的值时检索结果。

#REF!响应可能是公式中完全有效的响应,因此仅仅为了捕获它是不够的,这就是在这种特定情况下抛出异常的原因。

请注意,这不能保证 - 可以在Excel中禁用自动计算,或者因为保存了您正在阅读的工作簿而修改了引用的外部工作簿 - 在这两种情况下,getOldCalculatedValue()都可能返回错误的结果,你无法知道是否是这种情况......但它通常非常准确。 SVN代码的修改正是出于这个原因,当我和12月份一起工作的客户有相同的情况时;并且代码将包含在PHPExcel的1.7.7生产版本中,该版本将于本周末发布。

修改

try {
    $calculatedValue = $objPHPExcel->getActiveSheet()->getCell('A1')->getCalculatedValue();
} catch (Exception $e) {
    $calculatedValue = $objPHPExcel->getActiveSheet()->getCell('A1')->getOldCalculatedValue();
}

答案 1 :(得分:0)

好的,但解决方案并不干净整洁。我正在使用Try方法,代码可以看作如下:

try{
if($objPHPExcel->setActiveSheetIndexByName($caRef)->getCell($cells)->getCalculatedValue() == '#REF!' || $objPHPExcel->setActiveSheetIndexByName($caRef)->getCell($cells)->getCalculatedValue() == '#VALUE!')
{
    $value = $objPHPExcel->setActiveSheetIndexByName($caRef)->getCell($cells)->getOldCalculatedValue();
}
    else
{
    $value = $objPHPExcel->setActiveSheetIndexByName($caRef)->getCell($cells)->getCalculatedValue();
}

}

正如你所看到的,我不是在使用Catch和Throw,因为我真的希望PHPExcel能够获取值并将其放入MySQl中。但是,这真的有效,虽然不是整洁而且整洁的脚本。

答案 2 :(得分:0)

@Mark Ba​​ker非常感谢答案。对于我自己的外部link.addtional来说,Excel文件中的链接真的很有用。

$cell = $activeSheet->getCellByColumnAndRow($colIndex,$rowIndex)->getValue();
                    if($cell instanceof PHPExcel_RichText)     //richText with color etc 
                        $cell = $cell->__toString();  
                    if(substr($cell,0,1)=='='){ //with fomula
                        try{
                            if($activeSheet->getCellByColumnAndRow($colIndex,$rowIndex)->getCalculatedValue() == '#REF!' || $activeSheet->getCellByColumnAndRow($colIndex,$rowIndex)->getCalculatedValue() == '#VALUE!')
                            {
                                $cell = $activeSheet->getCellByColumnAndRow($colIndex,$rowIndex)->getOldCalculatedValue();
                            }
                                else
                            {
                                $cell= $activeSheet->getCellByColumnAndRow($colIndex,$rowIndex)->getCalculatedValue();
                            }
                        }catch(Exception $e){
                            $cell = $activeSheet->getCellByColumnAndRow($colIndex,$rowIndex)->getOldCalculatedValue();
                        }
}

我希望它会有用!