如何使用Laravel Excel基于多查询结果导出多工作表Excel文件
Laravel 8 多工作表Excel导出实现方案
实现逻辑
Laravel Excel 3.x 原生支持多工作表导出,核心逻辑是通过主导出类声明需要加载的工作表,每个工作表对应独立的查询、数据格式化逻辑。
前置要求
确保已安装适配Laravel 8的Maatwebsite Excel 3.x版本:
composer require maatwebsite/excel
具体实现步骤
1. 定义第一个工作表类(对应有效课程查询结果)
创建app/Exports/Sheets/CursosVigentesSheet.php,实现数据查询和输出:
<?php namespace App\Exports\Sheets; use App\Models\Reporte; use Maatwebsite\Excel\Concerns\FromCollection; use Maatwebsite\Excel\Concerns\WithHeadings; class CursosVigentesSheet implements FromCollection, WithHeadings { protected $date; // 传入查询需要的日期参数 public function __construct($date) { $this->date = $date; } public function collection() { return Reporte::selectRaw('concat(users.firstSurname, " ", users.secondSurname) AS fullSurname, concat(users.firstName," ", users.secondName) AS fullName, users.documento, capacitaciones.capacitacion, capacitaciones.fi, capacitaciones.fv, datediff(capacitaciones.fv, ?) AS diff',[$this->date]) ->join('users','capacitaciones.id_usuario','=','users.documento') ->whereRaw(' datediff(capacitaciones.fv, ? ) < ?', [$this->date, 30]) ->whereRaw(' datediff(capacitaciones.fv, ? ) > ?', [$this->date, 0]) ->get(); } // 定义表头,可根据实际需要调整 public function headings(): array { return [ '姓氏', '名字', '证件号', '培训名称', '培训开始日期', '培训结束日期', '剩余天数' ]; } }
2. 定义第二个工作表类(对应员工数据查询结果)
创建app/Exports/Sheets/DatosTrabajadoresSheet.php:
<?php namespace App\Exports\Sheets; use App\Models\User; use Maatwebsite\Excel\Concerns\FromCollection; use Maatwebsite\Excel\Concerns\WithHeadings; class DatosTrabajadoresSheet implements FromCollection, WithHeadings { public function collection() { return User::select('documento')->get(); } public function headings(): array { return [ '员工证件号' ]; } }
3. 定义主导出类,绑定所有工作表
创建app/Exports/MultiSheetReportExport.php,实现WithMultipleSheets接口:
<?php namespace App\Exports; use Maatwebsite\Excel\Concerns\WithMultipleSheets; use App\Exports\Sheets\CursosVigentesSheet; use App\Exports\Sheets\DatosTrabajadoresSheet; class MultiSheetReportExport implements WithMultipleSheets { protected $date; public function __construct($date) { $this->date = $date; } // 按顺序返回所有需要生成的工作表 public function sheets(): array { return [ new CursosVigentesSheet($this->date), // 第一个工作表 new DatosTrabajadoresSheet(), // 第二个工作表 ]; } }
4. 控制器中调用导出
<?php namespace App\Http\Controllers; use Maatwebsite\Excel\Facades\Excel; use App\Exports\MultiSheetReportExport; class ReportController extends Controller { public function export() { $date = now(); // 替换为你实际需要的日期参数 return Excel::download(new MultiSheetReportExport($date), '培训报表.xlsx'); } }
自定义调整说明
- 可以给每个工作表设置自定义名称:在Sheet类中实现
WithTitle接口,添加public function title(): string { return '有效课程'; }方法即可 - 如需自定义单元格格式、列宽等,可以在对应Sheet类中实现对应的Laravel Excel接口即可
内容的提问来源于stack exchange,提问作者Arley Steven Lache Rueda
相关产品推荐
相关产品推荐

