本文最后更新于 2024-04-17,文章内容可能已经过时,请注意发布时间。

要在 Maatwebsite/Excel 中使用特定的 Excel 模板,你需要使用 "WithEvents" 接口,并在 "registerEvents" 方法中指定一个 "BeforeExport" 事件。在这个事件中,你可以修改 Excel 对象,以便在导出数据之前应用你的模板。

以下是一个示例,展示如何在 Laravel 中使用 Maatwebsite/Excel 配置特定的 Excel 模板:

  1. 首先,确保你已经安装了 Maatwebsite/Excel 包。如果没有,请使用以下命令安装:

composer require maatwebsite/excel
  1. app/Exports 目录下创建一个新的导出类,例如 MyExcelExport.php

<?php

namespace App\Exports;

use App\Models\MyModel;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Events\BeforeExport;
use Maatwebsite\Excel\Events\BeforeWriting;
use Maatwebsite\Excel\Events\BeforeSheet;

class MyExcelExport implements FromQuery, WithHeadings, WithMapping, WithEvents
{
    use Exportable;

    public function query()
    {
        return MyModel::query();
    }

    public function headings(): array
    {
        return [
            'ID',
            'Name',
            'Email',
            'Created At',
            'Updated At',
        ];
    }

    public function map($row): array
    {
        return [
            $row->id,
            $row->name,
            $row->email,
            $row->created_at,
            $row->updated_at,
        ];
    }

    public function registerEvents(): array
    {
        return [
            BeforeExport::class => function (BeforeExport $event) {
                $event->writer->getProperties()->setCreator('Your Name');
                $event->writer->getProperties()->setTitle('Your Custom Title');
            },
            BeforeWriting::class => function (BeforeWriting $event) {
                $templateFile = storage_path('app/templates/my_template.xlsx');
                $event->writer->reopen($templateFile, \Maatwebsite\Excel\Excel::XLSX);
            },
            BeforeSheet::class => function (BeforeSheet $event) {
                $event->sheet->setCellValue('A1', 'Custom Header');
            },
        ];
    }
}

在这个例子中,我们从 MyModel 模型中导出数据。你需要将其替换为你自己的模型。

  1. 将你的 Excel 模板文件(例如 my_template.xlsx)保存到 storage/app/templates 目录下。

  2. 在控制器中使用 MyExcelExport 类导出数据:

<?php

namespace App\Http\Controllers;

use App\Exports\MyExcelExport;
use Maatwebsite\Excel\Facades\Excel;

class MyController extends Controller
{
    public function export()
    {
        return Excel::download(new MyExcelExport(), 'my_data.xlsx');
    }
}
  1. 最后,在路由文件(例如 routes/web.php)中添加一个路由,以便访问导出功能:

use App\Http\Controllers\MyController;

Route::get('/export', [MyController::class, 'export']);

现在,当你访问 /export 路径时,Laravel 将会导出数据并应用你的自定义 Excel 模板。