php excel导出十万数据的解决方案?

使用PHP spreadsheet包导出至.xlsx文件,一次性循环万级的数据就容易内存溢出,有没有什么比较靠谱的导出方案呢?

阅读 4.4k
6 个回答

首先提问一问题。导出数据为什么要用xlsx格式。如果你不需要合并表格,然后表格有富文本的话。
那么你可以考虑导出为csv
csv导出可以采取追加写到文件。Excel却不行,它只能写到内存,一次性输出。

提供个思路:

  1. 放开内存限制 ini_set('memory_limit', '1024M');
  2. excel 可以导出为 xml 文件,反过来也可以打开 xml 文件;
    这样就可以通过拼接生成 xml 文件实现导出十万数据;
    xml 文件头 + 遍历数据分批写入文件(数据可以增量从数据库读取) + 文件尾。

咱们打开一下思路,或许可以让前端来把几个csv分别下载之后,通过前端来合并成出excel文件,不但能减少后端阻塞、网络阻塞,还把相当一部分内存压力转给用户的客户端。
希望能帮助到你。

换个库把 比如box/spout https://opensource.box.com/sp...

Spout is a PHP library to read and write spreadsheet files (CSV, XLSX and ODS), in a fast and scalable way. Unlike other file readers or writers, it is capable of processing very large files, while keeping the memory usage really low (less than 3MB).

亲测导出导入10w+行xlsx没啥问题

推荐使用PHP的扩展xlswriter, 亲测,导出10万数据的xlsx,没啥问题。
xlswriter有内存模式导出,节省内存,不用担心内存会溢出,就是用内存模式,导出会慢一点。

一种:加buffer, 批量写进去,写完部分就释放内存
另一种:生成多个 excel, 打个zip 包让用户下载

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏