- Notifications
You must be signed in to change notification settings - Fork 4
该文件可以在以下位置找到app/Exports:
. ├── app │ ├── Exports │ │ ├── UsersExport.php │ └── composer.json
您可以在app/Exports中创建以下内容
<?php namespace App\Exports; use App\Models\User; use Mckue\Excel\Concerns\FromCollection; class UsersExport implements FromCollection { public function collection() { return User::all(); } }
在您的控制器中,您现在可以调用此导出:
<?php namespace App\Http\Controllers; use App\Exports\UsersExport; use Mckue\Excel\Facades\Excel; class UsersController extends Controller { public function export() { return Excel::download(new UsersExport, 'users.xlsx'); } }
Route::get('users/export/', [UsersController::class, 'export']);
在您的下载文件夹中找到您的users.xlsx!
开始导出的最简单方法是创建自定义导出类。我们将使用发票导出作为示例。 InvoicesExport创建一个名为的新类app/Exports:
namespace App\Exports; use App\Invoice; use Muckue\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']); }
或者将其存储在磁盘上(例如 s3):
public function storeExcel() { return Excel::store(new InvoicesExport, 'invoices.xlsx', 's3'); }
如果您不使用 Eloquent 或有其他数据源(例如 API、MongoDB、缓存等),您还可以返回自定义集合:
namespace App\Exports; use App\Invoice; use Mckue\Excel\Concerns\FromCollection; class InvoicesExport implements FromCollection { public function collection() { return new Collection([ [1, 2, 3], [4, 5, 6] ]); } }
如果您更喜欢使用普通数组而不是集合,则可以使用以下FromArray问题:
namespace App\Exports; use App\Invoice; use Mckue\Excel\Concerns\FromArray; class InvoicesExport implements FromArray { public function array(): array { return [ [1, 2, 3], [4, 5, 6] ]; } }
如果需要将数据从控制器传递到导出,可以使用构造函数来执行此操作:
namespace App\Exports; use App\Invoice; use Mckue\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'); }
如果您的导出需要依赖项,您可以注入导出类:
namespace App\Exports; use Mckue\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'); }
如果您想接收导出文件的原始内容,可以使用以下raw()方法:
$contents = Excel::raw(new InvoicesExport);
该包为 Laravel 的集合类提供了一些宏,以轻松下载或存储集合。
User::all()->downloadExcel( $filePath, $writerType = null, $headings = false )
(new Collection([[1, 2, 3], [1, 2, 3]]))->downloadExcel( $filePath, $writerType = null, $headings = false )
User::all()->storeExcel( $filePath, $disk = null, $writerType = null, $headings = false )
public function storeExcel() { // Store on default disk Excel::store(new InvoicesExport(2018), 'invoices.xlsx'); }
public function storeExcel() { // Store on a different disk (e.g. s3) Excel::store(new InvoicesExport(2018), 'invoices.xlsx', 's3'); }
public function storeExcel() { Excel::store(new InvoicesExport(2018), 'invoices.xlsx', 's3', null, [ 'visibility' => 'private', ]); }
Laravel私有文件的快捷方式:
public function storeExcel() { Excel::store(new InvoicesExport(2018), 'invoices.xlsx', 's3', null, 'private'); }
return Excel::download(new InvoicesExport, 'invoices.xlsx', \Mckue\Excel\Excel::XLSX);
在前面的示例中,我们使用Excel::download 门面来启动导出。 Laravel Excel 还提供了一个Mckue\Excel\Concerns\Exportable特征,使导出类可导出。
namespace App\Exports; use App\Invoice; use Mckue\Excel\Concerns\FromCollection; use Mckue\Excel\Concerns\Exportable; class InvoicesExport implements FromCollection { use Exportable; public function collection() { return Invoice::all(); } }
我们现在可以下载导出而无需门面:
return (new InvoicesExport)->download('invoices.xlsx');
或者将其存储在磁盘上:
return (new InvoicesExport)->store('invoices.xlsx', 's3');
如果您愿意,还可以将选项传递到磁盘:
return (new InvoicesExport)->store('invoices.xlsx', 's3', null, 'private');
在前面的示例中,我们在导出类中进行了查询。虽然这对于小型出口来说是一个很好的解决方案,但对于较大的出口来说,这将付出高昂的性能代价。
通过使用FromQuery关注点,我们可以准备导出查询。该查询在幕后以块的形式执行。
在InvoicesExport类中,添加FromQuery关注点并返回查询。一定不要 ->get()结果!
namespace App\Exports; use App\Invoice; use Mckue\Excel\Concerns\FromQuery; use Mckue\Excel\Concerns\Exportable; class InvoicesExport implements FromQuery { use Exportable; public function query() { return Invoice::query(); } }
我们仍然可以用同样的方式下载导出
return (new InvoicesExport)->download('invoices.xlsx');
通过将自定义参数作为依赖项传递给导出类,可以轻松地将自定义参数传递给查询。
namespace App\Exports; use App\Invoice; use Mckue\Excel\Concerns\FromQuery; use Mckue\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');
我们也可以使用以下方法调整年份forYear:
namespace App\Exports; use App\Invoice; use Mckue\Excel\Concerns\FromQuery; use Mckue\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); } }
return (new InvoicesExport)->forYear(2018)->download('invoices.xlsx');
通过添加,WithMapping您可以映射需要添加为行的数据。这样您就可以控制每列的实际来源。如果使用 Eloquent 查询生成器:
use Mckue\Excel\Concerns\FromQuery; use Mckue\Excel\Concerns\WithMapping; class InvoicesExport implements FromQuery, WithMapping { /** * @var Invoice $invoice */ public function map($invoice): array { return [ $invoice->invoice_number, $invoice->user->name, Date::dateTimeToExcel($invoice->created_at), ]; } }
您还可以在映射函数内返回多行:
use Mckue\Excel\Concerns\FromQuery; use Mckue\Excel\Concerns\WithMapping; class InvoicesExport implements FromQuery, WithMapping { /** * @var Invoice $invoice */ public function map($invoice): array { // This example will return 3 rows. // First row will have 2 column, the next 2 will have 1 column return [ [ $invoice->invoice_number, Date::dateTimeToExcel($invoice->created_at), ], [ $invoice->lines->first()->description, ], [ $invoice->lines->last()->description, ] ]; } }
通过添加,WithHeadings。标题行将添加为工作表的第一行。
use Mckue\Excel\Concerns\FromQuery; use Mckue\Excel\Concerns\WithHeadings; class InvoicesExport implements FromQuery, WithHeadings { public function headings(): array { return [ '#', 'User', 'Date', ]; } }
如果您需要有多个标题行,您可以从该headings()方法返回多行:
use Mckue\Excel\Concerns\FromQuery; use Mckue\Excel\Concerns\WithHeadings; class InvoicesExport implements FromQuery, WithHeadings { public function headings(): array { return [ ['First row', 'First row'], ['Second row', 'Second row'], ]; } }
如果您需要在将这些行附加到工作表之前准备行,您可以将方法添加prepareRows到导出类中。在查询输出并调用map()之前将调用此方法。
use Mckue\Excel\Concerns\FromQuery; use Mckue\Excel\Concerns\WithHeadings; class UsersExport implements FromQuery, WithHeadings { public function prepareRows($rows): array { return [....] } }
您可以使用 轻松格式化整列WithColumnFormatting
<?php use Mckue\Excel\Concerns\WithColumnFormatting; use Mckue\Excel\Concerns\WithMapping; class InvoicesExport implements WithColumnFormatting, WithMapping { public function map($invoice): array { return [ $invoice->invoice_number, Date::dateTimeToExcel($invoice->created_at), $invoice->total ]; } public function columnFormats(Excel $worksheet) { //例如设置a列加粗: $format = new \Vtiful\Kernel\Format($worksheet->getHandle()); $boldStyle = $format->bold()->toResource() $worksheet->setColumn('A:A', 200, $boldStyle); } }
您可以使用 轻松格式化整列WithRowFormatting
<?php use Mckue\Excel\Concerns\WithRowFormatting; use Mckue\Excel\Concerns\WithMapping; class InvoicesExport implements WithRowFormatting, WithMapping { public function map($invoice): array { return [ $invoice->invoice_number, Date::dateTimeToExcel($invoice->created_at), $invoice->total ]; } public function formatRows(Excel $worksheet) { //例如设置a1列加粗: $format = new \Vtiful\Kernel\Format($worksheet->getHandle()); $boldStyle = $format->bold()->toResource() $worksheet->setRow('A1', 200, $boldStyle); } }
接口 | 作用 |
---|---|
Mckue\Excel\Concerns\FromArray | 使用数组来填充导出。 |
Mckue\Excel\Concerns\FromCollection | 使用 Laravel Collection 来填充导出。 |
Mckue\Excel\Concerns\FromGenerator | 使用生成器来填充导出。 |
Mckue\Excel\Concerns\FromIterator | 使用迭代器来填充导出。 |
Mckue\Excel\Concerns\FromQuery | 使用 Eloquent 查询来填充导出。 |
Mckue\Excel\Concerns\WithColumnFormatting | 设置某些列的格式。 |
Mckue\Excel\Concerns\WithCustomChunkSize | 允许可导出项定义其块大小。 |
Mckue\Excel\Concerns\WithCustomQuerySize | 允许实现 FromQuery 关注点的可导出对象提供自己的自定义查询大小。 |
Mckue\Excel\Concerns\WithCustomStartCell | 允许指定自定义起始单元。请注意,这仅支持 FromCollection 导出。 |
Mckue\Excel\Concerns\WithEvents | 注册事件 |
Mckue\Excel\Concerns\WithHeadings | 前置标题行。 |
Mckue\Excel\Concerns\WithMapping | 在将行写入文件之前对其进行格式化。 |
Mckue\Excel\Concerns\WithMultipleSheets | 启用多页支持。每张表都可以有自己的关注点(除了这张表)。 |
Mckue\Excel\Concerns\WithProperties | 允许设置文档的属性。 |
Mckue\Excel\Concerns\WithStyles | 允许在工作表上设置样式。 |
Mckue\Excel\Concerns\WithTitle | 设置工作簿或工作表标题。 |
导出过程有一些事件,您可以利用这些事件与底层类进行交互,以将自定义行为添加到导出中。
您可以使用事件挂钩到父包。如果您需要完全控制导出,则无需使用“查询”或“查看”等便捷方法。
这些事件将通过添加关注来激活WithEvents。在该registerEvents方法内部,您必须返回一个事件数组。键是事件的完全限定名称 (FQN),值是可调用的事件侦听器。这可以是闭包、可数组调用或可调用类。
namespace App\Exports; use Mckue\Excel\Concerns\WithEvents; use Mckue\Excel\Events\BeforeExport; use Mckue\Excel\Events\BeforeWriting; use Mckue\Excel\Events\BeforeSheet; class InvoicesExport implements WithEvents { /** * @return array */ public function registerEvents(): array { return [ // Handle by a closure. BeforeExport::class => function(BeforeExport $event) { $event->writer->getProperties()->setCreator('Patrick'); }, // Array callable, refering to a static method. BeforeWriting::class => [self::class, 'beforeWriting'], // Using a class with an __invoke method. BeforeSheet::class => new BeforeSheetHandler() ]; } public static function beforeWriting(BeforeWriting $event) { // } }
namespace App\Exports; use Mckue\Excel\Concerns\WithEvents; use Mckue\Excel\Concerns\RegistersEventListeners; use Mckue\Excel\Events\BeforeExport; use Mckue\Excel\Events\BeforeWriting; use Mckue\Excel\Events\BeforeSheet; use Mckue\Excel\Events\AfterSheet; class InvoicesExport implements WithEvents { use Exportable, RegistersEventListeners; public static function beforeExport(BeforeExport $event) { // } public static function beforeWriting(BeforeWriting $event) { // } public static function beforeSheet(BeforeSheet $event) { // } public static function afterSheet(AfterSheet $event) { // } }
如果您想对应用程序中的所有导出执行相同的操作,还可以全局配置事件侦听器。您可以将它们添加到例如您的方法AppServiceProvider中register()。
Writer::listen(BeforeExport::class, function () { // }); Writer::listen(BeforeWriting::class, function () { // }); Sheet::listen(BeforeSheet::class, function () { // }); Sheet::listen(AfterSheet::class, function () { // });