导出操作
简介
Filament 包含一个可以将行数据导出到 CSV 或者 XLSX 文件的 Action。点击触发按钮后,会打开一个模态框询问用户要导出那些列,以及这些类要使用什么标签。该特性使用了队列批量操作及数据库通知,因此你需要发布这些迁移到 Laravel 中。同时,也需要发布 Filament 用于存储导出数据的迁移表:
php artisan make:queue-batches-table
php artisan make:notifications-table
php artisan vendor:publish --tag=filament-actions-migrations
php artisan migrate
如果你想要在面板中接收导出通知,你可以在面板配置中启用。
NOTE
如果你使用的是 PostgreSQL,请确保通知迁移中的 data 字段使用 json(): $table->json('data')。
NOTE
如果 User 模型使用了 UUID,请确保通知迁移的 notifiable 字段使用 uuidMorphs(): $table->uuidMorphs('notifiable')
ExportAction 可以这样使用:
use App\Filament\Exports\ProductExporter;
use Filament\Actions\ExportAction;
ExportAction::make()
->exporter(ProductExporter::class)

如果你想将该 Action 添加到表头,可以这样使用:
use App\Filament\Exports\ProductExporter;
use Filament\Actions\ExportAction;
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->headerActions([
ExportAction::make()
->exporter(ProductExporter::class),
]);
}
或者,如果你想将其添加为表格的批量操作,让用户可以选择导出哪些行,可以使用 Filament\Actions\ExportBulkAction:
use App\Filament\Exports\ProductExporter;
use Filament\Actions\ExportBulkAction;
use Filament\Tables\Table;
public function table(Table $table): Table
{
return $table
->toolbarActions([
ExportBulkAction::make()
->exporter(ProductExporter::class),
]);
}
此处需要创建 "exporter" 类,以告知 Filament 如何导出每一行。
创建导出器
要为模型创建 exporter 类,可以使用 make:filament-exporter 命令,并传入模型名称:
php artisan make:filament-exporter Product
该命令将在 app/Filament/Exports 目录下创建一个新类。你需要定义可被导出的列字段。
自动生成导出列
如果你想节省时间,可以使用 --generate,Filament 将基于模型的数据库字段,为你自动生成列字段:
php artisan make:filament-exporter Product --generate
定义导出字段
要定义可被导出的列,你需要在导出器类中重写 getColumns() 方法,并使其返回 ExportColumn 对象数组:
use Filament\Actions\Exports\ExportColumn;
public static function getColumns(): array
{
return [
ExportColumn::make('name'),
ExportColumn::make('sku')
->label('SKU'),
ExportColumn::make('price'),
];
}
自定义导出列标签
每个列的标签将由该列名称自动生成,不过你也可以调用 label() 方法对其进行重写:
use Filament\Actions\Exports\ExportColumn;
ExportColumn::make('sku')
->label('SKU')
配置默认选择的列
默认情况下,当用户被询问要导出哪些列时,所有的列都会被选中。你可以使用 enabledByDefault() 方法自定义默认选择的列:
use Filament\Actions\Exports\ExportColumn;
ExportColumn::make('description')
->enabledByDefault(false)
你可以使用 ExportAction 上的 enableVisibleTableColumnsByDefault() 方法,从而默认仅启用表格中当前可见的列。使用了 enabledByDefault(false) 的列也将默认处于禁用状态:
use App\Filament\Exports\ProductExporter;
use Filament\Actions\ExportAction;
ExportAction::make()
->exporter(ProductExporter::class)
->enableVisibleTableColumnsByDefault()
隐藏导出列
你可以使用 hidden() 或 visible() 方法完全隐藏某一列。被隐藏的列既不会显示在列选择表单中,也不会被写入导出的文件:
use Filament\Actions\Exports\ExportColumn;
ExportColumn::make('sku')
->hidden()
ExportColumn::make('sku')
->visible()
要根据条件隐藏列,你可以向任一方法传入一个布尔值:
use Filament\Actions\Exports\ExportColumn;
ExportColumn::make('cost_price')
->hidden(fn (): bool => ! auth()->user()->isAdmin())
ExportColumn::make('cost_price')
->visible(fn (): bool => auth()->user()->isAdmin())
NOTE
与表格列不同,导出列的解析过程不涉及具体记录,因此 hidden() 或 visible() 闭包无法依赖行数据。请将其用于架构层面的条件判断,例如已认证用户、功能开关或配置项。
若希望保留列的可选状态,但默认不勾选(而非将其完全隐藏),请使用 enabledByDefault(false)。
配置列选择表单的布局
默认情况下,列选择表单采用单列布局。你可以使用 columnMappingColumns() 方法并传入希望在大屏幕上使用的列数,更改此设置:
use App\Filament\Exports\ProductExporter;
use Filament\Actions\ExportAction;
ExportAction::make()
->exporter(ProductExporter::class)
->columnMappingColumns(3)
这将以三列布局显示列选择复选框和标签输入框,从而在存在大量可导出列时更有效地利用可用空间。请注意,尽管在大屏幕上会渲染三列布局,但该布局仍具备响应式特性,在较小屏幕上显示的列数会相应减少。
禁用列选择
默认情况下,会询问用户要导出哪些列。你可以使用 columnMapping(false) 方法禁用该功能。
use App\Filament\Exports\ProductExporter;
use Filament\Actions\ExportAction;
ExportAction::make()
->exporter(ProductExporter::class)
->columnMapping(false)
计算导出列状态
有时,你需要计算列状态,而不是直接从数据库字段中读取。
传入一个回调函数到 state() 方法,你可以自定义该列基于 $record 的返回值。
use App\Models\Order;
use Filament\Actions\Exports\ExportColumn;
ExportColumn::make('amount_including_vat')
->state(function (Order $record): float {
return $record->amount * (1 + $record->vat_rate);
})
除了 $record 之外,state() 函数可以注入各种 utility 作为参数。
| Utility | Type | Parameter | Description |
|---|---|---|---|
| Export column | Filament\Actions\Exports\ExportColumn | $column | The current export column instance. |
| Exporter | ?Filament\Actions\Exports\Exporter | $exporter | The instance of the exporter class that is currently being used for exporting data. |
| Options | array<string, mixed> | $options | The options that were defined when the export started. |
| Eloquent record | ?Illuminate\Database\Eloquent\Model | $record | The Eloquent record that is currently being exported. |
格式化导出列的值
你也可以传入一个自定义格式化回调函数给 formatStateUsing(),它接受单元格的 $state 和 Eloquent 记录 $record(可选):
use Filament\Actions\Exports\ExportColumn;
ExportColumn::make('status')
->formatStateUsing(fn (string $state): string => __("statuses.{$state}"))
除了 $state 之外,formatStateUsing() 函数可以注入各种 utility 作为参数。
| Utility | Type | Parameter | Description |
|---|---|---|---|
| Export column | Filament\Actions\Exports\ExportColumn | $column | The current export column instance. |
| Exporter | ?Filament\Actions\Exports\Exporter | $exporter | The instance of the exporter class that is currently being used for exporting data. |
| Options | array<string, mixed> | $options | The options that were defined when the export started. |
| Eloquent record | ?Illuminate\Database\Eloquent\Model | $record | The Eloquent record that is currently being exported. |
| State | mixed | $state | The state to format. |
如果列中有多个值,每个值都会调用该函数。
限制文本长度
使用 limit() 方法,你可以限制单元格中的值的长度:
use Filament\Actions\Exports\ExportColumn;
ExportColumn::make('description')
->limit(50)
除了允许静态值之外,limit() 方法也可以接受函数动态计算其值。你可以将各种 utility 作为参数注入到函数中。
| Utility | Type | Parameter | Description |
|---|---|---|---|
| Export column | Filament\Actions\Exports\ExportColumn | $column | The current export column instance. |
| Exporter | ?Filament\Actions\Exports\Exporter | $exporter | The instance of the exporter class that is currently being used for exporting data. |
| Options | array<string, mixed> | $options | The options that were defined when the export started. |
| Eloquent record | ?Illuminate\Database\Eloquent\Model | $record | The Eloquent record that is currently being exported. |
限制字数
使用 words() 方法,你可以限制单元格中显示的字数:
use Filament\Actions\Exports\ExportColumn;
ExportColumn::make('description')
->words(10)
除了允许静态值之外,words() 方法也可以接受函数动态计算其值。你可以将各种 utility 作为参数注入到函数中。
| Utility | Type | Parameter | Description |
|---|---|---|---|
| Export column | Filament\Actions\Exports\ExportColumn | $column | The current export column instance. |
| Exporter | ?Filament\Actions\Exports\Exporter | $exporter | The instance of the exporter class that is currently being used for exporting data. |
| Options | array<string, mixed> | $options | The options that were defined when the export started. |
| Eloquent record | ?Illuminate\Database\Eloquent\Model | $record | The Eloquent record that is currently being exported. |
添加前后缀
使用 prefix() 或者 suffix(),你可以添加前缀或者后缀到单元格值中:
use Filament\Actions\Exports\ExportColumn;
ExportColumn::make('domain')
->prefix('https://')
->suffix('.com')
除了允许静态值之外,prefix() 和 suffix() 方法也可以接受函数动态计算它们值。你可以将各种 utility 作为参数注入到函数中。
| Utility | Type | Parameter | Description |
|---|---|---|---|
| Export column | Filament\Actions\Exports\ExportColumn | $column | The current export column instance. |
| Exporter | ?Filament\Actions\Exports\Exporter | $exporter | The instance of the exporter class that is currently being used for exporting data. |
| Options | array<string, mixed> | $options | The options that were defined when the export started. |
| Eloquent record | ?Illuminate\Database\Eloquent\Model | $record | The Eloquent record that is currently being exported. |
在单元格中导出多个值
默认情况下,如果列中有多个值,将会使用逗号进行分隔。你可以使用 listAsJson() 方法将它们显示成 JSON 数组:
use Filament\Actions\Exports\ExportColumn;
ExportColumn::make('tags')
->listAsJson()
