我尝试使用 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
(
)
)
)
我已尝试以下步骤来解决问题:
PHPExcel_Calculation::getInstance()->setCalculationCacheEnabled(FALSE);
PHPExcel_Calculation::getInstance()->writeDebugLog = true;
print_r(PHPExcel_Calculation::getInstance()->getDebugLog());
我不明白为什么引擎的实际日志是空的?引擎在写出任何条目之前是否停止工作或者我的调试配置有问题?
但是,我试图用Java和Apache POI评估相同的公式 - 它有效!不幸的是,我已经将PHP用于当前项目。
请帮帮我!也许有人知道公式评估有什么问题,或者至少可以给我一些提示如何正确激活调试?
谢谢!
答案 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公式。