我正在测试PHPSpreadsheet如何与大型Excel电子表格配合使用。初步测试表明,对于大型电子表格,很快就会耗尽内存。
有没有办法逐步编写电子表格?
我有一段旧代码,我长期用它来创建PHP的电子表格。它使用了一个非常古老的标准,并且是一个更新。但是我的旧代码的一个优点是我可以写入文件,而不是在内存中构建整个文件,因此可以轻松应对非常大的电子表格而不会超出内存限制。
在PHPSpreadsheet中可以做类似的事情吗?我已经尝试阅读文档,并搜索各种论坛,但大多数回复似乎只是“增加可用内存”。
答案 0 :(得分:10)
不幸的是,PHPExcel和PHPSpreadsheet对于大型文件的性能不是很好。
您的选择非常有限:
Maarten的缓存建议是一个不错的主意,但以我的经验,它付出了巨大的速度代价,而这完全抵消了任何内存方面的好处。
我的建议是完全抛弃PHPSpreadsheet,然后尝试box/spout
它在构建时考虑了性能,并且无论文件大小如何,使用的内存都将少于3MB!它不仅内存效率高,而且比PHPSpreadsheet快20-30倍。
它有一些局限性(仅支持3种文件格式,没有自动列宽,没有列号/字符串格式),但我认为其中一些缺失的功能已经计划好了,目前,这是我处理书写的最佳选择庞大的电子表格。
注意:我与该项目无关
答案 1 :(得分:2)
在他们的文档中有一个主题:
您基本上可以将单元格存储在缓存中,例如Redis( from their documentation ):
$client = new \Redis();
$client->connect('127.0.0.1', 6379);
$pool = new \Cache\Adapter\Redis\RedisCachePool($client);
$simpleCache = new \Cache\Bridge\SimpleCache\SimpleCacheBridge($pool);
\PhpOffice\PhpSpreadsheet\Settings::setCache($simpleCache);
如果您使用Predis,则可以使用以下存储库:
https://phpspreadsheet.readthedocs.io/en/latest/topics/memory_saving/#memory-saving
并使用此代码:
$client = new \Predis\Client($yourParameters, $yourOptions);
$pool = new \Cache\Adapter\Predis\PredisCachePool($client);
$simpleCache = new \Cache\Bridge\SimpleCache\SimpleCacheBridge($pool);
\PhpOffice\PhpSpreadsheet\Settings::setCache($simpleCache);