簡體   English   中英

使用 PHPSpreadsheet 構建非常大的電子表格

[英]Building very large spreadsheet with PHPSpreadsheet

我正在測試 PHPSpreadsheet 如何與大型 excel 電子表格一起使用。 初步測試表明,對於大型電子表格,memory 將很快用完。

有沒有辦法逐步編寫電子表格?

我有一段舊代碼,我一直在使用它來從 PHP 創建電子表格。 它使用了一個非常古老的標准,並且需要更新。 但是我的舊代碼的一個優點是我可以在文件運行時寫入文件,而不是在 memory 中構建整個內容,因此可以輕松處理非常大的電子表格,而不會超出 memory 限制。

可以在 PHPSpreadsheet 中做類似的事情嗎? 我已經嘗試閱讀文檔,並搜索了各種論壇,但大多數回復似乎只是“增加可用內存”。

不幸的是 PHPExcel 和 PHPSpreadsheet 對於大文件的性能不是很好。

您的選擇非常有限:

  • 不斷增加內存限制
  • 將數據分塊到單獨的電子表格中
  • 回退到 CSV(使用 PHP 的內置函數)

Maarten 的緩存建議是一個不錯的主意,但根據我的經驗,它帶來了巨大的速度成本,完全抵消了任何內存優勢。


我的建議是完全放棄 PHPSpreadsheet 並嘗試box/ spout

它在構建時考慮到了性能,並承諾無論文件大小如何都使用不到 3MB 的內存! 它不僅內存效率高,而且比 PHPSpreadsheet 快 20-30 倍。

它有一些限制(僅支持 3 種文件格式,沒有自動列寬,沒有列號/字符串格式)但我認為其中一些缺失的功能是計划好的,現在它是我處理編寫大量電子表格的最佳選擇.

注意:在解決版本 3 的性能問題之前,您可能希望堅持使用 2.7

我還沒有嘗試過的另一個選項是PHP_XLSXWriter 似乎與 spout 有相似的目標

他們的文檔中有一個關於此的主題:

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);

如果您使用 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);

tl;dr:截至 2022 年 8 月的建議Openspout可能是您應對挑戰的正確選擇。 對我來說,它工作得很好。

關於原因的一點解釋:

我還遇到了 PhpSpreadsheet 的 memory 問題,並在幾年前發現了這個問題。 為了讓您的生活更輕松:

為 PhpSpreadsheet 使用其他緩存似乎太慢了- Jason Klein 分析了 PhpSpreadsheet 的不同緩存選項,但它們都沒有真正為大工作表提供有用的性能(大工作表是您閱讀這篇文章的原因,對嗎?)

PhpSpreadsheet 的架構在很大程度上依賴於對單元的內存訪問。 任何用於緩存的文件或網絡流量都會極大地影響性能。

box/spout 不再活躍- 但有一個后繼者: Openspout ,它是 box/spout 的一個分支,目前正在積極維護。 這似乎是目前通過 PHP 處理大型 Excel 文件的首選選項。

另一種方法是https://packagist.org/packages/avadim/fast-excel-writer

它僅支持 XLSX 文件(不支持 XLS),但比 PhpSpreadsheet 快 7-9 倍,並且使用更少的 memory,具有自動列寬和列/單元格格式。 我使用這個庫在 100K 行中生成巨大的 XLSX 文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM