Laravel Excel 怎么导出 50W+ 的数据

跪求

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 40

推荐一下个人写的Excel处理工具 dcat/easy-excel,目前已在公司内项目中使用。

这个工具的特点是简单实用,导出大量数据仅需占用极小的内存(不论多大的数据一般只占用20M左右内存),支持分批读取数据并导出等多种实用功能。

安装

composer require dcat/easy-excel

分批读取数据并导出

chunkById

use Dcat\EasyExcel\Excel;
use App\User;

$lastId = 0;
$titles = ['id' => 'ID', 'name' => '名称', ...];

Excel::export()
    ->headings($titles) // 设置标题
    ->chunk(function () use (&$lastId) {
         // 每次获取1000条数据导入
         $chunkSize = 1000;

         // 这里使用forPageAfterId批量读取数据,也可以用forPage
         $collection = User::query()->forPageAfterId($chunkSize, $lastId)->get();

         // 暂存最后一个ID
         $lastId = $collection->last()->id;

         // 当数据库查不到值时会停止执行闭包内的逻辑
         return $collection;
     })
    ->download('users.xlsx');

更多用法请参考文档

4年前 评论
Hello_Smile (楼主) 4年前
yang_cc 4年前
Jiangqh (作者) 4年前
Yoger 4年前
hanxiao666 3年前
西巴以及 2年前

你连得上MySQL,那你干嘛不直接用phpmyadmin,或者命令行,直接导出?

4年前 评论
Hello_Smile (楼主) 4年前
mengge 4年前

@吃鱼不吐刺 那样导出的数据不是想要的,可能还有逻辑要处理。

4年前 评论

推荐一下个人写的Excel处理工具 dcat/easy-excel,目前已在公司内项目中使用。

这个工具的特点是简单实用,导出大量数据仅需占用极小的内存(不论多大的数据一般只占用20M左右内存),支持分批读取数据并导出等多种实用功能。

安装

composer require dcat/easy-excel

分批读取数据并导出

chunkById

use Dcat\EasyExcel\Excel;
use App\User;

$lastId = 0;
$titles = ['id' => 'ID', 'name' => '名称', ...];

Excel::export()
    ->headings($titles) // 设置标题
    ->chunk(function () use (&$lastId) {
         // 每次获取1000条数据导入
         $chunkSize = 1000;

         // 这里使用forPageAfterId批量读取数据,也可以用forPage
         $collection = User::query()->forPageAfterId($chunkSize, $lastId)->get();

         // 暂存最后一个ID
         $lastId = $collection->last()->id;

         // 当数据库查不到值时会停止执行闭包内的逻辑
         return $collection;
     })
    ->download('users.xlsx');

更多用法请参考文档

4年前 评论
Hello_Smile (楼主) 4年前
yang_cc 4年前
Jiangqh (作者) 4年前
Yoger 4年前
hanxiao666 3年前
西巴以及 2年前
4年前 评论
Hello_Smile (楼主) 4年前
Hello_Smile (楼主) 4年前

可以导出csv,php自带的,可以一边算一边输出到浏览器。

4年前 评论

这个可以采用队列的方式,导完了,就导出来,要么就一直阻塞!有人这么写过么?

4年前 评论
Tsukasa_Kanzaki 4年前
sane

bos/spot 看下

4年前 评论

我之前也遇到类似问题,那时候数据量有100万+,而且还要连表查,很麻烦。
可以开启缓冲,导出时,在缓冲区进行分段导,比如一次只导出1万,边导边写入

#简单示例
        set_time_limit(1200);
        ini_set('memory_limit', '1024M');

        //设置文件头
        header('Content-Description: File Transfer');
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment; filename="文件名.csv"');
        header('Expires: 0');
        header('Cache-Control: must-revalidate');
        header('Pragma: public');

        $columns = ['列1名','列2名','列3名']; //定义好表头名称

        $fp = fopen('php://output', 'a');//打开output流
        mb_convert_variables('GBK', 'UTF-8', $columns);
        fputcsv($fp, $columns);

        #在这里分段写入数据
        for(……){
               $data = xxx;//假设此段计算好的数据是$data;
               foreach($data as $key => $rowData) {
                       fputcsv($fp, $rowData);
                }
               unset($data);

                 //刷新缓冲
                 ob_flush();
                 flush();
        }

        fclose($fp);
        exit();
4年前 评论

我今天也遇到同样问题,你最后是什么方案解决了

4年前 评论

可以参考下个内容,上周我已经导下来10w+的数据了
https://www.cnblogs.com/houdj/p/6492009.ht...

4年前 评论
CrazyZard

laravel excel导出 https://xlswriter-docs.viest.me/zh-cn/read...
如果用excel/excel的话 不推荐 内存会溢出

4年前 评论

你可以将处理好的数据存入一张临时缓存表。然后你懂的 ,mysql导出excel

4年前 评论
leung0826

异步,前端 loading 等待

4年前 评论
jiangjun

不用phpoffice,就能搞定,phpoffice一个单元格消耗1k左右的内存(文档里面说的)。

4年前 评论

https://github.com/viest/php-ext-xlswriter

xlswriter是一个 PHP C 扩展,可用于在 Excel 2007+ XLSX 文件中读取数据,插入多个工作表,写入文本、数字、公式、日期、图表、图片和超链接。

导出

两种内存模式导出100万行数据(单行27列,数据类型均为字符串,单个字符串长度为19)

  • 普通模式:耗时 29S,内存只需 2083MB;
  • 固定内存模式:仅需 52S,内存仅需 <1MB;

导入

100万行数据(单行1列,数据类型为INT)

  • 全量模式:耗时 3S,内存仅 558MB;
  • 游标模式:耗时 2.8S,内存仅 <1MB;
4年前 评论
Hello_Smile (楼主) 4年前
EmptyCup 4年前
馨竹之乡 4年前
viest (作者) 4年前
Epona

50W数据的Excel,打开的时候不卡么。

4年前 评论
爆炸青山绿水 3年前
lufeijun1234

@Epona 这个问题,直击灵魂

4年前 评论

FromIterator

4年前 评论

当导出大量是数据的时候,可以使用 队列导出

3年前 评论

刚好最近又这么个需求,百万级数据,直接操作mysql导出csv吧

2年前 评论
Hello_Smile (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!