Laravel Excel 包的五个隐藏功能
发表于 作者 PovilasKorop
Laravel Excel 包 最近迎来了 3.0 版本,带来了一些新功能,这些新功能有助于简化高级用例,并且易于使用。让我们探索一些您可能不了解的隐藏功能,这些功能使 Laravel Excel 成为处理 Excel 工作的最佳选择。
- 从 HTML/Blade 中导出
假设您已经有一个带有 HTML 表格的列表页面
以下是 Blade 代码 - **resources/views/customers/table.blade.php**
<table class="table"> <thead> <tr> <th></th> <th>First name</th> <th>Last name</th> <th>Email</th> <th>Created at</th> <th>Updated at</th> </tr> </thead> <tbody> @foreach ($customers as $customer) <tr> <td>{{ $customer->id }}</td> <td>{{ $customer->first_name }}</td> <td>{{ $customer->last_name }}</td> <td>{{ $customer->email }}</td> <td>{{ $customer->created_at }}</td> <td>{{ $customer->updated_at }}</td> </tr> @endforeach </tbody></table>
您可以重复使用它将相同的表格导出到 Excel。
**步骤 1.** 生成导出类
php artisan make:export CustomersFromView --model=Customer
**步骤 2.** 使用 **FromView** 执行操作。
namespace App\Exports; use App\Customer;use Illuminate\Contracts\View\View;use Maatwebsite\Excel\Concerns\FromView; class CustomersExportView implements FromView{ public function view(): View { return view('customers.table', [ 'customers' => Customer::orderBy('id', 'desc')->take(100)->get() ]); }}
以下是生成的 Excel 文件
**注意:** 您只能导出 HTML 表格,不能导出任何布局标签,例如 **html、body、div** 等。
- 导出到 PDF、HTML 等
虽然该包名为 Laravel Excel,但它提供了导出到更多格式的功能。使用起来非常简单,只需在类中添加一个参数
return Excel::download(new CustomersExport(), 'customers.xlsx', 'Html');
没错,就是 HTML。以下是其外观
我知道样式不多。以下是源代码
不仅如此,它还允许导出到 PDF,您甚至可以从三个库中选择一个。同样,您只需将格式作为最后一个参数指定 - 以下是 其文档中的截图
**注意:** 您还需要通过 composer 安装所选的 PDF 包,例如
composer require dompdf/dompdf
以下是 PDF 的外观
- 随意格式化单元格
Laravel Excel 包有一个强大的“父包” - PhpSpreadsheet。因此它采用了所有底层功能,包括以各种方式格式化单元格。
以下是在 Laravel Export 类中使用它的方法,例如 **app/Exports/CustomersExportStyling.php**
**步骤 1.** 在头部使用适当的类。
use Maatwebsite\Excel\Concerns\WithEvents;use Maatwebsite\Excel\Events\AfterSheet;
**步骤 2.** 在 **implements** 部分使用 **WithEvents**。
class CustomersExportStyling implements FromCollection, WithEvents{ // ...
**步骤 3.** 创建 **registerEvents()** 方法并使用 **AfterSheet** 事件。
/** * @return array */public function registerEvents(): array{ return [ AfterSheet::class => function(AfterSheet $event) { // ... HERE YOU CAN DO ANY FORMATTING }, ];}
以下是一个示例
/** * @return array */public function registerEvents(): array{ return [ AfterSheet::class => function(AfterSheet $event) { // All headers - set font size to 14 $cellRange = 'A1:W1'; $event->sheet->getDelegate()->getStyle($cellRange)->getFont()->setSize(14); // Apply array of styles to B2:G8 cell range $styleArray = [ 'borders' => [ 'outline' => [ 'borderStyle' => \PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THICK, 'color' => ['argb' => 'FFFF0000'], ] ] ]; $event->sheet->getDelegate()->getStyle('B2:G8')->applyFromArray($styleArray); // Set first row to height 20 $event->sheet->getDelegate()->getRowDimension(1)->setRowHeight(20); // Set A1:D4 range to wrap text in cells $event->sheet->getDelegate()->getStyle('A1:D4') ->getAlignment()->setWrapText(true); }, ];}
这些“随机”演示样式示例的结果如下所示
您可以在 PhpSpreadsheet 文档的“食谱”页面 中找到所有这些示例以及更多示例。
- 模型中的隐藏字段
假设我们已经用默认的 Laravel 5.7 **users** 表进行了填充
让我们尝试使用一个简单的 **FromCollection** 类导出它
class UsersExport implements FromCollection{ public function collection() { return User::all(); }}
在生成的 Excel 中,您会发现一些字段丢失了:**password** 和 **remember_token**
这是因为 **app/User.php** 属性
class User extends Authenticatable{ // ... /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', ];}
因此,这些字段默认情况下是隐藏的,但这向我们展示了 Laravel Excel 包的行为 - 如果您想保护某些字段免于导出,您可以在模型中直接进行操作。
- 公式
出于某种原因,官方 Laravel Excel 包文档没有提及任何关于公式的内容。但使用 Excel 的关键就在于此!
幸运的是,在导出的文件中写入公式非常简单。我们需要像在 Excel 中一样设置单元格值,例如 **=A2+1** 或 **SUM(A1:A10)**。
其中一种方法是使用 **WithMapping**
use App\Customer;use Maatwebsite\Excel\Concerns\FromCollection;use Maatwebsite\Excel\Concerns\WithMapping; class CustomersExportFormulas implements FromCollection, WithMapping{ public function collection() { return Customer::all(); } /** * @var Customer $customer * @return array */ public function map($customer): array { return [ $customer->id, '=A2+1', $customer->first_name, $customer->last_name, $customer->email, ]; }}
因此,这只是 Laravel Excel 的五个鲜为人知的特性。如果您想了解更多信息,我有一个独特的在线课程,名为 Laravel 中的 Excel 导出/导入,快去看看吧!