You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 14:24:00