maatwebsite/excel使用:导出——导出集合
导出集合
创建一个名为 InvoicesExport
导出类:
<?php
namespace App\Exports;
use App\Invoice;
use Maatwebsite\Excel\Concerns\FromCollection;
class InvoicesExport implements FromCollection
{
public function collection()
{
return Invoice::all();
}
}
下载:
public function export()
{
return Excel::download(new InvoicesExport, 'invoices.xlsx');
}
选择传入是否输出标头和自定义响应标头:
public function export()
{
return Excel::download(new InvoicesExport, 'invoices.xlsx', true, ['X-Vapor-Base64-Encode' => 'True']);
}
使用自定义结构
如果你没有使用 Eloquent 或有其他数据源(例如 API、MongoDB、Cache 等),你也可以返回一个自定义集合:
<?php
namespace App\Exports;
use App\Invoice;
use Maatwebsite\Excel\Concerns\FromCollection;
class InvoicesExport implements FromCollection
{
public function collection()
{
return new Collection([
[1, 2, 3],
[4, 5, 6]
]);
}
}
使用数组
如果你更喜欢使用普通数组而不是集合,则可以使用 FromArray
:
<?php
namespace App\Exports;
use App\Invoice;
use Maatwebsite\Excel\Concerns\FromArray;
class InvoicesExport implements FromArray
{
public function array(): array
{
return [
[1, 2, 3],
[4, 5, 6]
];
}
}
如果需要将数据从控制器传递到导出,可以使用构造函数来实现:
<?php
namespace App\Exports;
use App\Invoice;
use Maatwebsite\Excel\Concerns\FromArray;
class InvoicesExport implements FromArray
{
protected $invoices;
public function __construct(array $invoices)
{
$this->invoices = $invoices;
}
public function array(): array
{
return $this->invoices;
}
}
在控制器中可以使用导出类的构造函数:
public function export()
{
$export = new InvoicesExport([
[1, 2, 3],
[4, 5, 6]
]);
return Excel::download($export, 'invoices.xlsx');
}
依赖注入
如果你的导出需要依赖项,你可以注入导出类:
<?php
namespace App\Exports;
use Maatwebsite\Excel\Concerns\FromCollection;
class InvoicesExport implements FromCollection
{
public function __construct(InvoicesRepository $invoices)
{
$this->invoices = $invoices;
}
public function collection()
{
return $this->invoices->all();
}
}
public function export(Excel $excel, InvoicesExport $export)
{
return $excel->download($export, 'invoices.xlsx');
}
严格的空比较
如果你希望 Excel 工作表中的 0 值为实际的 0 值,而不是 null
(空单元格),可以使用WithStrictNullComparison
。
<?php
namespace App\Exports;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithStrictNullComparison;
class InvoicesExport implements FromCollection, WithStrictNullComparison
{
public function __construct(InvoicesRepository $invoices)
{
$this->invoices = $invoices;
}
public function collection()
{
return $this->invoices->all();
}
}
自定义起始单元格
默认起始单元格为A1。在导出类中实现 WithCustomStartCell
以自定义起始单元格。
<?php
namespace App\Exports;
use App\Invoice;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithCustomStartCell;
class InvoicesExport implements FromCollection, WithCustomStartCell
{
public function collection()
{
return Invoice::all();
}
public function startCell(): string
{
return 'B2';
}
}
WithCustomStartCell
仅支持FromCollection
导出。
从查询导出
通过使用 FromQuery
我们可以为导出准备查询。在幕后,这个查询是分块执行的。
在 InvoicesExport
类中,添加 FromQuery
并返回查询。一定不要 ->get()
结果!
<?php
namespace App\Exports;
use App\Invoice;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\Exportable;
class InvoicesExport implements FromQuery
{
use Exportable;
public function query()
{
return Invoice::query();
}
}
我们仍然可以用同样的方式下载导出:
return (new InvoicesExport)->download('invoices.xlsx');
自定义查询
将自定义参数传递给查询很容易,只需将它们作为依赖项传递给导出类即可。
作为构造函数参数
<?php
namespace App\Exports;
use App\Invoice;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\Exportable;
class InvoicesExport implements FromQuery
{
use Exportable;
public function __construct(int $year)
{
$this->year = $year;
}
public function query()
{
return Invoice::query()->whereYear('created_at', $this->year);
}
}
现在可以将年份作为依赖项传递给导出类:
return (new InvoicesExport(2018))->download('invoices.xlsx');
作为设置
<?php
namespace App\Exports;
use App\Invoice;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\Exportable;
class InvoicesExport implements FromQuery
{
use Exportable;
public function forYear(int $year)
{
$this->year = $year;
return $this;
}
public function query()
{
return Invoice::query()->whereYear('created_at', $this->year);
}
}
我们可以使用 forYear
方法调整年份:
return (new InvoicesExport)->forYear(2018)->download('invoices.xlsx');
从视图导出
通过使用 FromView
问题,可以从 Blade
视图创建导出。
<?php
namespace App\Exports;
use App\Invoice;
use Illuminate\Contracts\View\View;
use Maatwebsite\Excel\Concerns\FromView;
class InvoicesExport implements FromView
{
public function view(): View
{
return view('exports.invoices', [
'invoices' => Invoice::all()
]);
}
}
它将把HTML表格转换成Excel电子表格。例如invoices.blade.php
:
<table>
<thead>
<tr>
<th>Name</th>
<th>Email</th>
</tr>
</thead>
<tbody>
@foreach($invoices as $invoice)
<tr>
<td>{{ $invoice->name }}</td>
<td>{{ $invoice->email }}</td>
</tr>
@endforeach
</tbody>
</table>
在控制器中下载导出:
public function export()
{
return Excel::download(new InvoicesExport, 'invoices.xlsx');
}
本作品采用《CC 协议》,转载必须注明作者和本文链接