php - 使用 PHPSpreadsheet 构建非常大的电子表格

标签 php excel memory phpspreadsheet

我正在测试 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/

相关文章:

node.js - 如何确定 node.js 的正确 "max-old-space-size"?

java - 为什么我遇到长时间的非 GC 相关应用程序暂停?

php - 运行 QTcpServer,如何正确接收或发送数据?

php - PHP内联条件不适用于PHP 5.3.29,但适用于5.6.7

php - 插入多个数据

vba - 应用公式,然后自动填充数据,直到列中的最后一个可见单元格 : VBA

vba - excel vba 打开工作簿

VBA 打印文本框中的值

PHP 为 COUNT() 准备语句,其中包含一个结果的条件

c - 为什么免费(): invalid next size (fast)