PHPExcel不评估公式

时间:2013-12-05 08:20:22

标签: php phpexcel

我尝试使用 PHPExcel 1.7.9 评估我的XSLX工作簿中的以下公式:=IF($H$7=1,$F$13,$H$227*$J$227)

在我必须更新工作簿中的某些单元格之前,我使用此行来计算值:

$sheet->getCell('L228')->getCalculatedValue();

但是,PHPExcel似乎不会正确更新包含公式的单元格。它会抛出一些通知消息,如下所示,但不会更新单元格的计算值:

注意:未定义的偏移量:第2852行的D:\ my-path \ hkc \ Classes \ PHPExcel \ Calculation.php中的2

没有例外,似乎getCalculatedValue()返回由MS Excel计算的旧缓存值。如下所述,我已经激活了计算引擎的调试日志记录,但它似乎是空的:

PHPExcel_CalcEngine_Logger Object
(
    [_writeDebugLog:PHPExcel_CalcEngine_Logger:private] => 
    [_echoDebugLog:PHPExcel_CalcEngine_Logger:private] => 
    [_debugLog:PHPExcel_CalcEngine_Logger:private] => Array
        (
        )

    [_cellStack:PHPExcel_CalcEngine_Logger:private] => PHPExcel_CalcEngine_CyclicReferenceStack Object
        (
            [_stack:PHPExcel_CalcEngine_CyclicReferenceStack:private] => Array
                (
                )

        )

)

我已尝试以下步骤来解决问题:

  1. 停用计算缓存:PHPExcel_Calculation::getInstance()->setCalculationCacheEnabled(FALSE);
  2. 激活计算引擎的调试模式:How to handle exception with PhpExcel?特别是http://phpexcel.codeplex.com/discussions/233047中对此进行了描述
    但是,我不得不稍微修改引用页面的代码 - 也许PHPExcel 1.7.9中的内容有所改变?
    激活调试:PHPExcel_Calculation::getInstance()->writeDebugLog = true;
    获取调试日志:print_r(PHPExcel_Calculation::getInstance()->getDebugLog());
  3. 我不明白为什么引擎的实际日志是空的?引擎在写出任何条目之前是否停止工作或者我的调试配置有问题?

    但是,我试图用Java和Apache POI评估相同的公式 - 它有效!不幸的是,我已经将PHP用于当前项目。

    请帮帮我!也许有人知道公式评估有什么问题,或者至少可以给我一些提示如何正确激活调试?

    谢谢!

2 个答案:

答案 0 :(得分:1)

还没有答案,但写评论的时间太长了:

PHPExcel 1.7.9将计算引擎从单例修改为multiton(同时处理多个工作簿时需要避免冲突)。因此,每个工作簿都会运行自己的calc引擎实例,并在调用

时运行
PHPExcel_Calculation::getInstance()

您现在必须指定需要访问的实例。每个PHPExcel实例都有一个ID值,在PHPExcel对象中维护,用于此目的,您需要将PHPExcel对象本身传递给getInstance()方法。因此,如果您的PHPExcel工作簿是$ objPHPExcel,则需要使用

PHPExcel_Calculation::getInstance($objPHPExcel)

在刷新缓存,启用记录器或读取日志时引用正确的calc引擎实例。

重。错误的细节:IF公式单元格引用的任何单元格是否引用包含CUBE函数或SUMIFS函数的其他公式?这些是我所知道的唯一可能触发此特定错误的函数

修改

重构SUMIFS()函数的示例

=SUMIFS(A2:A3, B2:B3, E1, C2:C3, F1)

如果B2:B3符合E1标准,则总和A2:A3,C2:C3符合F1标准。

这可以重构为

=SUMPRODUCT(A2:A3 * (B2:B3=E1) * (C2:C3=F1))

答案 1 :(得分:0)

我已经为SUMPRODUCT重构了一些SUMIFS,它似乎有效。我目前正在寻找一种通过自动化方法进行重构的方法,因为工作表中有超过50个SUMIFS公式。