在 Laravel 中将 Eloquent 导出到 Excel 时如何包含列标题?

Jaq*_*arh 12 php excel laravel laravel-excel

我试图允许用户使用带有产品信息的Laravel Excel文件下载 Excel 。我当前的网络路线如下所示:

Route::get('/excel/release', 'ExcelController@create')->name('Create Excel');
Run Code Online (Sandbox Code Playgroud)

我当前的导出如下所示:

class ProductExport implements FromQuery
{
    use Exportable;

    public function __construct(int $id)
    {
        $this->id = $id;
    }

    public function query()
    {
        return ProductList::query()->where('id', $this->id);
    }
}
Run Code Online (Sandbox Code Playgroud)

我当前的控制器如下所示:

public function create(Request $request) {

    # Only alowed tables
    $alias = [
        'product_list' => ProductExport::class
    ];

    # Ensure request has properties
    if(!$request->has('alias') || !$request->has('id'))
        return Redirect::back()->withErrors(['Please fill in the required fields.'])->withInput();

    # Ensure they can use this
    if(!in_array($request->alias, array_keys($alias)))
        return Redirect::back()->withErrors(['Alias ' . $request->alias . ' is not supported'])->withInput();

    # Download
    return (new ProductExport((int) $request->id))->download('iezon_solutions_' . $request->alias . '_' . $request->id . '.xlsx');
}
Run Code Online (Sandbox Code Playgroud)

当我转到https://example.com/excel/release?alias=product_list&id=1此正确执行并返回一个excel文件时。但是,行没有列标题。数据出来是这样的:

1   150 1   3       2019-01-16 16:37:25 2019-01-16 16:37:25     10
Run Code Online (Sandbox Code Playgroud)

但是,这应该包含列标题,如 ID、成本等...如何在此输出中包含列标题?

mik*_*n32 21

根据文档,您可以更改您的类以使用该WithHeadings接口,然后定义headings函数以返回列标题数组:

<?php
namespace App;

use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\WithHeadings;

class ProductExport implements FromQuery, WithHeadings
{
    use Exportable;

    public function __construct(int $id)
    {
        $this->id = $id;
    }

    public function query()
    {
        return ProductList::query()->where('id', $this->id);
    }

    public function headings(): array
    {
        return ["your", "headings", "here"];
    }
}
Run Code Online (Sandbox Code Playgroud)

这适用于所有类型的出口(FromQueryFromCollection,等)

  • 如果您要导出表的所有列:/sf/answers/2601051561/ (2认同)

小智 15

<?php
namespace App\Exports;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use DB;
class LocationTypeExport implements FromCollection,WithHeadings
{
    public function collection()
    {
        $type = DB::table('location_type')->select('id','name')->get();
        return $type ;
    }
     public function headings(): array
    {
        return [
            'id',
            'name',
        ];
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 8

您可以将其与array_keys动态获取列标题结合起来:

use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;

class ProductExport implements FromQuery, WithHeadings
{
    use Exportable;

    public function __construct(int $id)
    {
        $this->id = $id;
    }

    public function query()
    {
        return ProductList::query()->where('id', $this->id);
    }

    public function headings(): array
    {
        return array_keys($this->query()->first()->toArray());
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您将其与集合一起使用,则可以执行以下操作:

use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;

class ProductExport implements FromCollection, WithHeadings
{
    /**
    * @return \Illuminate\Support\Collection
    */
    public function collection()
    {
        // for selecting specific fields
        //return ProductList::select('id', 'product_name', 'product_price')->get();
        // for selecting all fields
        return ProductList::all();
    }

    public function headings(): array
    {
        return $this->collection()->first()->keys()->toArray();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 导出我的用户表时,我需要使用: `array_keys($this-&gt;collection()-&gt;first()-&gt;toArray());` 即使使用 `FromCollection` 因为它是模型集合。 (2认同)