带有多个选项卡的PHPExcel大型数据集 - 内存耗尽

时间:2011-11-01 16:06:04

标签: php performance phpexcel large-data

使用PHPExcel我可以单独运行每个选项卡并获得我想要的结果但是如果我将它们全部添加到一个excel中它就会停止,没有错误或任何事情。

每个标签包含大约60到8万条记录,我有大约15到20个标签。因此,大约有1600000条记录分成多个标签(这个数字也可能会增长)。

此外,我使用.xlsx扩展名测试了65000行限制,使用.xlsx扩展名没有任何问题,如果我运行每个选项卡它自己的excel文件。

伪代码:

从db读取数据 启动PHPExcel进程 解析每个页面的数据(一些样式/格式但不多) (使用公式SUM将每个数字字段值汇总到Excel的底部的总计列中) 保存excel(xlsx格式)

我有3GB的RAM,所以这不是问题,并且脚本设置为执行时没有超时。

我在许多项目中使用过PHPExcel并且效果很好但是拥有如此庞大的数据集似乎是一个问题。

每个人都有这个问题吗?解决?提示?等...

更新:

错误日志---内存耗尽

除了在盒子中添加更多内存之外,我还能做其他任何提示吗?

每个保存当前状态和编辑的人都有新数据吗?

1 个答案:

答案 0 :(得分:4)

我有完全相同的问题,谷歌搜索没有找到有价值的解决方案。

由于PHPExcel生成对象并将所有数据存储在内存中,在最终生成本身也存储在内存中的文档文件之前,在PHP中设置更高的内存限制永远不会完全解决这个问题 - 该解决方案不能很好地扩展。 / p>

要真正解决问题,您需要“动态”生成XLS文件。多数民众赞成我做了什么,现在我可以肯定,无论数据库返回多少(百万)行,“将SQL结果集下载为XLS”都可以正常工作。

可惜的是,我找不到任何具有“驱逐”XLS(X)生成功能的库。

我在IBM Developer Works上发现了这篇文章,它提供了一个如何“即时”生成XLS XML的示例: http://www.ibm.com/developerworks/opensource/library/os-phpexcel/#N101FC

对我来说效果非常好 - 我有多张数据表,并且甚至没有触及PHP内存限制。很好地扩展。

请注意,此示例使用Excel纯XML格式(文件扩展名为“xml”),因此您可以将未压缩的数据直接发送到浏览器。 http://en.wikipedia.org/wiki/Microsoft_Office_XML_formats#Excel_XML_Spreadsheet_example

如果你真的需要生成XLSX,事情会变得更加复杂。 XLSX是包含多个XML文件的压缩存档。为此,您必须将所有数据写入磁盘(或内存 - 与PHPExcel相同的问题),然后使用该数据创建存档。 http://en.wikipedia.org/wiki/Office_Open_XML

可能它还可以“动态”生成压缩档案,但这种方法似乎非常复杂。