我正在测试 PHPSpreadsheet 如何与大型 Excel 电子表格一起使用。初步测试表明,对于大型电子表格,内存很快就会耗尽。
有没有办法逐步编写电子表格?
我有一段很长一段时间以来一直用于从 PHP 创建电子表格的旧代码。它使用了一个非常古老的标准,并且需要更新。但我的旧代码的一个优点是我可以在文件运行时写入文件,而不是在内存中构建整个内容,因此可以轻松处理非常大的电子表格而不会超出内存限制。
可以在 PHPSpreadsheet 中做类似的事情吗?我已经尝试阅读文档,并搜索了各种论坛,但大多数回复似乎只是“增加可用内存”。
最佳答案
不幸的是,PHPExcel 和 PHPSpreadsheet 对于大文件的性能不是很好。
您的选择非常有限:
- 不断增加内存限制
- 将数据分 block 到单独的电子表格中
- 回退到 CSV(使用 PHP 的内置函数)
来自 Maarten 的缓存建议是个好主意,但根据我的经验,它带来了巨大的速度成本,完全抵消了任何内存优势。
我的建议是完全放弃 PHPSpreadsheet 并尝试 box/spout
它在构建时考虑到了性能,并且无论文件大小如何,都 promise 使用少于 3MB 的内存!它不仅内存效率高,而且比 PHPSpreadsheet 快 20-30 倍。
它有一些限制(仅支持 3 种文件格式,没有自动列宽,没有列号/字符串格式),但我认为其中一些缺失的功能是计划好的,现在它是我处理写作的最佳选择一个庞大的电子表格。
注意: 您可能希望在 version 3 performance issues 之前一直使用 2.7 版。解决了
另一个我没有尝试过的选项是 PHP_XLSXWriter .似乎和 spout 有类似的目标
关于php - 使用 PHPSpreadsheet 构建非常大的电子表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50731704/