Exporting data is a common requirement in admin panels. If you’re using Filament with Laravel, you can easily integrate Export to Excel functionality using the Maatwebsite/Laravel-Excel package.
This guide will show you step by step how to:
- Install Laravel Excel
- Create a reusable export class
- Add an “Export to Excel” button in your Filament resource
- Ensure exports respect filters and tabs
- Match Filament table columns in Excel
Step 1: Install Laravel Excel
Run the following command in your project root folder to install Laravel Excel package:
composer require maatwebsite/excel
Step 2: Create a Generic Export Class
Instead of creating a new export class for every model, you can build one reusable export class:
<?php
namespace App\Exports;
use Illuminate\Database\Eloquent\Builder;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
class QueryExport implements FromCollection, WithHeadings, WithMapping
{
protected Builder $query;
protected array $columns;
public function __construct(Builder $query, array $columns = [])
{
$this->query = $query;
$this->columns = $columns;
}
public function collection()
{
return $this->query->get();
}
public function headings(): array
{
return array_merge(
['ID'],
collect($this->columns)
->map(fn($col) => $col->getLabel() ?? $col->getName())
->toArray()
);
}
public function map($row): array
{
return array_merge(
[$row->id],
collect($this->columns)
->map(fn($col) => data_get($row, $col->getName()))
->toArray()
);
}
}
This class is reusable across all models/resources.
Step 3: Add Export Action in Filament
In your ListBrands
(or any other List<Resource>
) page, add a header action:
use App\Exports\QueryExport;
use Maatwebsite\Excel\Facades\Excel;
use Filament\Tables\Actions\Action;
Action::make('export')
->label('Export to Excel')
->icon('heroicon-o-arrow-down-tray')
->action(function ($livewire) {
$query = $livewire->getFilteredTableQuery(); // respects filters & tabs
$columns = $livewire->getTable()->getColumns();
return Excel::download(new QueryExport($query, $columns), 'brands.xlsx');
}),
Step 4: How It Works
- The export respects all filters, search, and tab constraints thanks to
getFilteredTableQuery()
. - The export file includes the same columns as your Filament table.
- The ID column is automatically prepended.
Conclusion
With just a few steps, you can add a powerful Excel export feature to any Filament resource. The approach we used:
- Reusable
QueryExport
class - Filter & tab aware exports
- Matching Filament table columns
- ID column always included
This setup gives your admin panel professional-grade export functionality while staying flexible across different resources.