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

xte*_*ore 10 php memory excel phpspreadsheet

我正在测试PHPSpreadsheet如何与大型Excel电子表格配合使用.初步测试表明,对于大型电子表格,会很快耗尽内存.

有没有办法逐步编写电子表格?

我有一段旧代码,我已经用了很长时间来创建PHP的电子表格.它使用了一个非常古老的标准,并且是一个更新.但是我的旧代码的一个优点是我可以写入文件而不是在内存中构建整个文件,因此可以轻松应对非常大的电子表格而不会超出内存限制.

在PHPSpreadsheet中可以做类似的事情吗?我已经尝试阅读文档,搜索各种论坛,但大多数回复似乎只是"增加可用内存".

and*_*ber 12

不幸的是PHPExcel和PHPSpreadsheet对于大文件来说效率不高.

您的选择非常有限:

  • 继续增加内存限制
  • 将数据块分成不同的电子表格
  • 回退到CSV(使用PHP的内置函数)

来自Maarten的缓存建议是一个不错的主意,但根据我的经验,它带来了巨大的速度成本,完全否定了任何内存优势.


我的建议是完全抛弃PHPSpreadsheet并尝试盒子/喷口

它的构建考虑了性能,并承诺使用不到3MB的内存,无论文件大小!它不仅内存效率高,而且比PHPSpreadsheet快20-30倍.

它有一些限制(只支持3种文件格式,没有自动列宽,没有列号/字符串格式)但我认为其中一些缺少的功能是有计划的,现在它是处理编写大量电子表格的最佳选择.

注意:我不隶属于该项目

  • 我已经尝试过`box/spout`,它非常适合处理非常大的ex​​cel文件,但它并不完全支持样式/设置列宽/自动宽度/单元格合并。 (2认同)

Maa*_*ers 6

他们的文档中有一个关于此的主题:

https://phpspreadsheet.readthedocs.io/en/latest/topics/memory_saving/#memory-saving

您基本上可以将单元存储在缓存中,例如在 Redis 中(来自他们的文档):

$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);
Run Code Online (Sandbox Code Playgroud)

如果您使用 Predis,则可以使用以下存储库:

https://github.com/php-cache/predis-adapter

并使用此代码:

$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);
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,至少在我的经验中,速度成本很高:( (2认同)
  • 同意!有一个临界点,PHPSpreadsheet 变得无法使用,因为它太慢了。这一点取决于所使用的缓存机制和您的机器。另一方面,Spout 提供近乎恒定的性能。 (2认同)