【问题标题】:PHPExcel getCalculatedValue() causing #REFPHPExcel getCalculatedValue() 导致#REF
【发布时间】:2012-02-06 17:39:32
【问题描述】:

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

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

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

我很感激有人能启发我。

谢谢。

【问题讨论】:

    标签: phpexcel


    【解决方案1】:

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

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

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

    编辑

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

    【讨论】:

    • 嗨,马克,我一直在尝试使用 Try、Catch 和 Throw 方法。但是,我没有得到完全正确的解决方案。
    • @First Last - 发生了什么?
    • 我的理解是,Try, Catch & Throw 会在屏幕上给用户带来注意力。很公平,所以我将如何从单元格中使用 getOldCalculatedValue(),因为 Try、Catch 和 Throw 没有捕获任何东西。 PHPExcel 接受#REF!作为一个值。请指导我马克。谢谢。
    • 如果你尝试/捕获然后简单地再次抛出,异常将通过调用堆栈一直跳回。您需要在 catch 块中应用一些自定义异常处理。
    • @MarkBaker 我也有类似的问题,你能帮帮我吗?stackoverflow.com/questions/25580716/…
    【解决方案2】:

    好的,但解决方案不是那么干净整洁。我用的是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 and Throw,因为我真的希望 PHPExcel 获取值并将其放入 MySQl。但是,这确实有效,虽然不是整洁的脚本。

    【讨论】:

    • 这段代码中没有catch块,那么如果抛出异常你期望会发生什么?
    【解决方案3】:

    @Mark Ba​​ker 非常感谢您的回答。 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();
                            }
    }
    

    希望对你有用!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-05
      • 2015-12-08
      • 2013-10-21
      • 2018-11-02
      相关资源
      最近更新 更多