【发布时间】:2015-11-05 20:26:02
【问题描述】:
我已经构建了一个可以将数据导出为 Excel 的报告解决方案。使用 PHPExcel,这项工作非常漂亮。但是,我们需要构建仪表板样式模板表并在运行时将它们插入到输出中,包括公式。我的所有这些工作都很好,我的问题是有时这些仪表板模板相当复杂,PHPExcel 在尝试输出时会阻塞公式。
我花了相当多的时间寻找解决方法,甚至到了forking my own branch 并添加了一种禁用计算的方法,该方法会试图阻止公式被处理,但无法让它工作。我也试过禁用计算缓存。
@MarkBaker 在这个库上做得非常出色,我多次看到他提到这不是为修改文件而设计的,但如果做得非常仔细,它似乎可以工作。
我的问题是,如何告诉 PHPExcel 停止 尝试计算公式?我希望它像对待任何其他文本值一样对待它们,并让 Excel 自己处理验证。这可能吗?
例如,下面是一个 PHPExcel 似乎不喜欢的公式:
=IFERROR(IF($L$3="UNITS",COUNTIF('K1_Current_Accounts'!$M$2:$M$10000,'Snapshot Summary'!H5)+COUNTIF('K1_Current_Available'!$M$2:$M$10000,'Snapshot Summary'!H5),IF($L$3="Cost Basis",SUMIF('K1_Current_Accounts'!$M$2:$M$10000,'Snapshot Summary'!H5,'K1_Current_Accounts'!$E$2:$E$10000)+SUMIF('K1_Current_Available'!$M$2:$M$10000,'Snapshot Summary'!H5,'K1_Current_Available'!$E$2:$E$10000),IF($L$3="Notes",SUMIFS('K1_Current_Accounts'!$AA$2:$AA$10000,'K1_Current_Accounts'!$M$2:$M$10000,'Snapshot Summary'!H5,'K1_Current_Accounts'!$R$2:$R$10000,'Snapshot Summary'!$A$7)+SUMIFS('K1_Current_Accounts'!$AA$2:$AA$10000,'K1_Current_Accounts'!$M$2:$M$10000,'Snapshot Summary'!H5,'K1_Current_Accounts'!$R$2:$R$10000,'Snapshot Summary'!$A$8)+SUMIFS('K1_Current_Accounts'!$AA$2:$AA$10000,'K1_Current_Accounts'!$M$2:$M$10000,'Snapshot Summary'!H5,'K1_Current_Accounts'!$R$2:$R$10000,'Snapshot Summary'!$A$9),IF($L$3="Cash",SUMIFS('K1_Historical_Accounts'!$AC$2:$AC$10000,'K1_Historical_Accounts'!$M$2:$M$10000,'Snapshot Summary'!H5,'K1_Historical_Accounts'!$R$2:$R$10000,'Snapshot Summary'!$A$10))))),"")
我读到SUMIFS 可能会导致问题,但我不知道如何按照建议将这些重构为SUMPRODUCT(这些仪表板由业务开发团队构建)。此外,我们将列的范围设置为 10000,因为像 A:A 这样的范围也不起作用。它们在 Excel 中运行良好,所以如果我能让 PHPExcel 停止尝试验证所有内容并让它通过,我的生活将是辉煌的!
编辑
进一步查看堆栈跟踪,它似乎在尝试编写图表时开始发生:
编辑 2
查看图表生成作为这个问题的根源,只有一个图表,它的数据源是='Sales History'!$Y$4:$CR$5,我可以看到它肯定会尝试处理,但这不应该引起问题,因为它是一个比较简单的参考。
【问题讨论】:
-
注意,目前正在为 PHPExcel 实现 SUMIFS() 函数
-
非常感谢马克!