2011-11-01 63 views
4

使用PHPExcel我可以分别运行每个选项卡并获得我想要的结果,但是如果我将它们全部添加到一个excel中,它只会停止,没有错误或任何事情。PHPExcel带有多个选项卡的大型数据集 - 内存耗尽

每个选项卡包含大约60到80,000条记录,我有大约15到20个选项卡。所以大约有1600000个记录分成多个标签(这个数字可能会增长)。

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

伪代码:

读取DB数据 启动PHPExcel过程 解析出的数据为每个页面(一些造型/格式化,但不是很多) (每个数字字段的值并得到一个总数列总结在使用公式SUM 的Excel文件)的底部保存Excel(XLSX格式)

我有3GB的内存,所以这是不是一个问题和脚本的设置没有超时执行。

我已经在很多项目中使用了PHPExcel,并且取得了很好的结果,但拥有这么大的数据集似乎是个问题。

任何人都有这个问题?解决?提示?等等......

UPDATE:在错误日志

---内存耗尽

除了增加更多的RAM盒子有任何其他提示我可以做什么?

任何人都保存当前状态并编辑新数据?

+0

你检查了你的错误日志吗?什么是PHP的内存限制?剧本很可能会尝试分配更多的RAM而不是允许的。 – Maerlyn

+0

废话错误日志---内存耗尽 –

+0

你可以提高内存限制到它的工作点。如果它的特定脚本我没有看到它在您的机器上造成任何问题。例如ini_set('memory_limit','32M'); –

回答

4

我有完全相同的问题,并且使用谷歌搜索没有找到有价值的解决方案。由于PHPExcel生成对象并将所有数据存储在内存中,因此在最终生成本身也存储在内存中的文档文件之前,在PHP中设置更高的内存限制永远不会完全解决此问题 - 该解决方案不能很好地扩展。

要真正解决问题,您需要“即时”生成XLS文件。这就是我所做的,现在我可以确定,“下载SQL结果集为XLS”无论数据库返回多少(百万)行都有效。可惜的是,我找不到任何具有“drive-by”XLS(X)代的图书馆。

我发现这篇文章在IBM开发工程,其给出了如何生成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

可能它也可以生成压缩档案“即时”,但这种方法看起来很复杂。

+0

哇,很好的答案!我将不得不试一试,并尝试发回一些结果。 –

+0

谢谢@ kaii,对不起,我仍然要测试这可能需要几个星期,但如果它确实解决了我的问题,我会作为接受的答案。再次感谢您的努力,+1来自我。是的,例如代码总是欢迎:) –

+0

不是最好的质量代码,但它给你一个粗略的例子,如何做到这一点:http://pastebin.com/k1LHbz3W – Kaii