Laravel-Excel-zip 解决导出的 Excel 数据过大

相信导出 Excel 这个功能大多开发者都接触过,但假如你要导出数十万条数据甚至更多的数据的时候,怎么办?如果不限制很容易出现内存不足的情况。难道条件限制业务人员导出?(说真的我是觉得限制是最优解,但人在江湖身不由己)

https://github.com/cblink/laravel-excel-zi... 为了解决这个问题,可以通过自定义每个 Excel 数据量,把多个 Excel 压缩成一个 zip 下载

安装

composer require cblink/laravel-excel-zip -vvv

使用

执行以下语句去创建 config/excel_zip.php

php artisan vendor:publish --provider="Cblink\ExcelZip\ExcelZipServiceProvider"

config/excel_zip.php 中有两个属性

  • always_zip true 时无论数据多少是否多个或者一个Excel,都始终下载 zip;false 时当数据只足以下载一个Excel时只会下载 xlsx,多个才会下载 zip
  • chunk 每 chunk 条数据为一个 Excel 文件,默认 5000

Export

Exportmaatwebsite/excel excel 包的概念,详细可以去看他的文档。

在你的 Export 中加上 use CustomCollection 如果你不是很熟源码,建议 不要定义collection方法,除非你可以根据源码适当修改

<?php

use Cblink\ExcelZip\CustomCollection;
use Maatwebsite\Excel\Concerns\FromCollection;

class MemberExport implements FromCollection
{
    use CustomCollection;
}

Controller

<?php

use Cblink\ExcelZip\ExcelZip;
use App\Http\Controllers\Controller;

class MemberController extends Controller
{
    // 通过数据库 chunk 分批导出(推荐!)
    public function export1(ExcelZip $excelZip, MemberExport $export)
    {
        // set_time_limit(0); 提醒,小心脚本超时
        $excelZip = $excelZip->setExport($export);

        Member::chunk(5000, function ($members) use ($excelZip) {
                $excelZip->excel($members);
        });

        return $excelZip->zip();
    }

    // 包内 chunk 实现(不推荐,如果数据量过大会出现 DB 层面的内存溢出)
    public function export2(ExcelZip $excelZip, MemberExport $export)
    {
        return $excelZip->download(Member::all(), $export);
    }
}

各位看官给个 star ? https://github.com/cblink/laravel-excel-zi...

本作品采用《CC 协议》,转载必须注明作者和本文链接
❤️ 微信生态自动智能化方案加微信:hansonskr ❤️ 备注:vbot
本帖由系统于 5年前 自动加精
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 42

感谢 QQ 群友的意见,之后会考虑加上队列生成异步下载 等功能

5年前 评论

似乎不支持 laravel-excel 2.1

5年前 评论

@MarksGui 对的,直接用的 3.0

5年前 评论
qbhy

@Hanson 啥群友的意见,明明是我的意见。

5年前 评论

@96qbhy 你不就是群友么 🤨

5年前 评论

这个群里大佬多吗?还是光吹水啊?

5年前 评论
qbhy

@Hanson 错,我是群管理。

5年前 评论

require 的时候提示没有匹配版本,laravel-excel 版本是3.0

5年前 评论

直接丢队列更好吧,产品和运营很多都不会忍受下载下来是个zip的。。。或者懒得写队列的话,可以for循环个总数,然后每次循环插入1W条数据进去,循环一次sleep三秒,这样也可以简单实现下载大文件excel

5年前 评论

@Jaywade sleep三秒意义在哪?

5年前 评论

@Hanson 服务器和数据库扛得住压力的话,完全可以不sleep

5年前 评论

@Jaywade sleep 还可以解决压力? :joy:

5年前 评论

@Hanson :joy:肯定不能啊

5年前 评论

@Hanson 可能是我表达错了,不是php的sleep;是指在导出大量数据的时候,页面展示的时候可以循环3秒去查一次导出了多少数据,然后比较友好的展示给用户。。。不好意思,是我表达上不是很好 :sweat_smile:

5年前 评论

@Jaywade 如果是查进度,我有更好的包,到时会发布一下,你这个也是很糟糕的处理方式

5年前 评论

@Hanson 坐等大神封装一个 :+1:

5年前 评论

@Hanson hanson大神有 查进度 的包了吗...

5年前 评论

导出 .csv 会比导出 .xlsx 效率高很多

5年前 评论
Complicated

没看明白怎么用呢?

5年前 评论
hainuo

不错 感觉独立出来不依赖于 phpspreadsheet 应该会更好些,主要是感觉太慢很多同步场景满足不了 我现在都是直接导出csv 文件。

5年前 评论

@Hanson
说真的我是觉得限制是最优解,但人在江湖身不由己
一语道破

5年前 评论
Golx

报错了

5年前 评论
hookover

支持csv文件吗?
可以考虑最后处理完的时候合并成一个文件

5年前 评论
um-summer 1年前

看看,我是一个没有留言跟帖水平的留言

4年前 评论

列表页面筛选了的话,导出的是筛选过后的数据吗

4年前 评论

phpoffice/phpspreadsheet/src/PhpSpreadsheet/Cell/DefaultValueBinder.php(56): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(8, 'Undefined offset: 0'
这是我返回的数据不对嘛

4年前 评论

把代码贴出来

4年前 评论
use App\Models\Order;
use Cblink\ExcelZip\ExcelZip;
use App\Exports\ExportExcel;
use Exception;
public function export(ExcelZip $excelZip, ExportExcel $excel)
    {
        try {
            $excelZip = $excelZip->setExport($excel);

            Order::chunk(5000, function ($members) use ($excelZip) {
                $excelZip->excel($members);
            });

            return $excelZip->zip();
        } catch (Exception $e) {
            Log::error('Failed to export order list:'.$e->getMessage());
        }
    }
<?php

namespace App\Exports;

use Cblink\ExcelZip\CustomCollection;
use Maatwebsite\Excel\Concerns\FromCollection;

class ExportExcel implements FromCollection
{
    use CustomCollection;
}
4年前 评论

@Hanson 代码和你是一致的,奇怪啊

4年前 评论

解决了,是我本地数据存在json格式,数据转化的时候是数组找不到0,嘿嘿,不过这个也还是存在内存撑满的情况
Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes)

4年前 评论

@Hanson 安装失败是怎么回事? composer require cblink/laravel-excel-zip -vvv

file

4年前 评论

@jxdr 这个不是报错内容,一般安装失败是出现不兼容的版本包

4年前 评论

@Hanson 那我这个不兼容的版本包 , 怎么解决。 百度也没有啊。

4年前 评论

@jxdr 先找出哪个包出现不兼容

4年前 评论

chumper/zipper 这个依赖包是不是得换了,不更新了,二是在新的laravel装不了,依赖通不过, chumper/zipper好像不支持最新版的laravel

3年前 评论
a2691702

为什么我会报 The file "/data/wwwroot/jinbing.huang/code/kbb_gasoline_galaxy_server/storage/member_0XHp8Y.zip" does not exist

3年前 评论

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