PHP百万数据级导出excel
单次导出一百万条数据,保证服务器的资源不会因为这个导出变卡。导出的时间要求不作限制,大家有没有比较好的解决方案哈。
本帖已被设为精华帖!
本帖由系统于 2年前 自动加精
关于 LearnKu
本站有一个大佬 @viest ,写了一个扩展
xlswriter导出百万不在话下。xlswriter扩展 + 队列,一次性导出的话应该会内存溢出或者超时
在 Laravel 中导出大量数据,避免内存溢出或者超时问题可以使用流式输出,将数据一行一行地输出到浏览器或者文件中,而不是将所有数据都加载到内存中。Laravel 中可以使用 Chunk 方法来实现流式输出,Chunk 方法将查询结果分块处理,每次处理一定数量的数据
在这个示例代码中,我们使用 php://output 创建一个流,将数据输出到这个流中。这样可以避免将所有数据读入内存中,降低内存占用。
我们通过循环分块读取数据,每次读取 $chunkSize 条数据,然后将这些数据写入到流中。在写入数据后,我们使用 ob_flush() 和 flush() 强制刷新输出缓冲区,将已经写入的数据发送到客户端,避免输出缓冲区占用过多内存。
最后,我们通过 Response 返回一个空内容的响应,同时设置相应的 Content-Type 和 Content-Disposition 头,告诉浏览器下载这个 CSV 文件。
为了避免超时和内存溢出问题,我们可以在 php.ini 中设置 max_execution_time 和 memory_limit。如果需要在代码中设置这些限制,可以使用 set_time_limit() 和 ini_set() 函数。
这是我写的一段导出百万数据的测试代码,其整个运行时间40秒左右,这个xslwriter真是厉害哈
如果仅仅是数据,完全可以先导出为 csv。然后本地转换为 excel 即可。
大数据导出,要防止内存溢出,需要用游标读取(laravel封装的cursor是使用生成器完成的),再用xlswriter,最近我也根据这个写了大数据导入导出,导出就是前面说的这个逻辑,导入用分片上传,再游标读取每行,在分批存入数据库
yield + csv 怎么样?到处多少都没有问题吧?
博客:PHP导出大量数据,保存为CSV文件
写成csv,用工具转成excel。
异步导出,最后压缩 下载
我不是杠,我就是想知道这么多的数据,office可以打开吗?另外,Excel最大好像是1048576行。
学习了,很赞
我是这样写的,分批查询,边查询边输出的,截取一段代码:
我是这么写的,贴个代码参考一下,当时测试20几秒
我这样写的
导出excel内存超了主要就是因为执行期间,整个excel都放到内存里,这样子数据越多就越卡
用
xlswriter扩展,然后队列消费。sql查询导出的话有条件的最好用chunkById,chunk最终是offset,复杂点的后面会一言难尽~我这里有个问题,我想通过多个队列任务给一个xlsx文件添加多个sheet的方式来减少内存开销。但我发现下次加载相同的文件会覆盖上一次生成的文件。是否有通过不同的队列任务打开相同的文件,追加sheet的方法?
我用的方案是 队列,因为导出的数据较大(带图片),高清图,一张好几 MB,还得限制 Excel 文件的大小。