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

如何在Laravel中通过Maatwebsite实现数据库动态表头导出至Excel

动态生成Maatwebsite Excel导出的表头(无需手动编写headings方法)

当然可行,你可以借助Laravel模型的内置方法或数据库查询,自动获取表结构字段作为导出表头,无需手动维护headings()方法里的字段列表。以下是两种常用实现方式:

方法一:利用模型的getFillable()属性

如果你的Account模型定义了$fillable属性(通常用于批量赋值),可以直接提取这些字段作为表头:

<?php

namespace App\Exports;

use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use App\Models\Account;

class ExportTable implements FromCollection, WithHeadings
{
    public function collection()
    {
        return Account::all();
    }

    public function headings(): array
    {
        // 直接获取模型允许批量赋值的字段作为表头
        return Account::getFillable();
    }
}

方法二:直接查询数据库获取全表字段

如果需要导出表的所有字段(包括未在$fillable中定义的),可以通过数据库查询获取表结构:

<?php

namespace App\Exports;

use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use App\Models\Account;
use Illuminate\Support\Facades\DB;

class ExportTable implements FromCollection, WithHeadings
{
    public function collection()
    {
        return Account::all();
    }

    public function headings(): array
    {
        $tableName = (new Account)->getTable();
        // 查询表的所有字段信息
        $columns = DB::select("SHOW COLUMNS FROM $tableName");
        
        // 提取字段名组成表头数组
        return array_column($columns, 'Field');
    }
}

额外优化:字段名格式化

如果需要将数据库的蛇形命名(如user_id)转为更友好的标题格式(如User Id),可以在返回表头前做处理:

public function headings(): array
{
    $fields = Account::getFillable();
    
    return array_map(function($field) {
        return ucwords(str_replace('_', ' ', $field));
    }, $fields);
}

内容的提问来源于stack exchange,提问作者rizcrime

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:25:16