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#
Export
是 maatwebsite/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 协议》,转载必须注明作者和本文链接
推荐文章: