我正在使用 phpexcel 编写一个 xlsx 文件。
它工作正常,除了我的内存不足。
这是因为我正在将两张纸写入同一个文件,两者都有 15k+ 行。
我想做的是
创建一张纸,然后将其保存到文件中,或在某处进行消毒,这样它就不会占用太多空间。
创建下一张表。
处理输出。
有没有办法做到这一点?
基本上:
while(... have sheet 1 data...) {
build sheet 1
}
while(... have sheet 2 data...) {
build sheet 2
}
代替
while (... have data...) {
add to sheet 1
add to sheet 2
}
如果您不能将整个电子表格保存在内存中,那么您将不得不增加内存限制。据我所知,PHPExcel 和其他电子表格构建库不适用于磁盘上的表示,只是可以放入内存中。
虽然 PHPExcel 被描述为“内存中”电子表格,并且受到 PHP 内存限制的限制,但可以通过使用单元缓存来减少所需的内存。此技术在开发人员文档(第 4.2.1 节)中有完整描述,可配置为将单元对象压缩到内存中,或将单元数据缓存到内存缓存(如 APC、Wincache 或 memcache)或磁盘。它可以将内存使用量减少多达 60%,但会以速度为代价。使用单元缓存可能允许您在同一个工作簿中创建两个工作表而不会耗尽内存。
如果您想创建两个工作簿,每个工作簿都有一个工作表,而不是一个工作簿有两个工作表,那么您需要在保存后从内存中刷新第一个工作簿,然后再开始构建第二个......否则你会节省很少的内存。由于工作簿对象中的循环引用,您需要在取消设置 PHPExcel 对象之前打破这些引用。这在开发人员文档第 4.3 节中进行了描述