# Export Events
# Introduction
Laravel Excel fires several events during the export lifecycle. You can hook into these events to interact with the underlying PhpSpreadsheet objects, apply custom behaviour, or collect metrics.
Events are registered via the WithEvents concern, or automatically via the RegistersEventListeners trait.
# Registering event listeners
# WithEvents
Return a map of event class → callable from registerEvents():
namespace App\Exports;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Events\BeforeExport;
use Maatwebsite\Excel\Events\AfterSheet;
class UsersExport implements FromQuery, WithEvents
{
public function registerEvents(): array
{
return [
BeforeExport::class => function (BeforeExport $event): void {
$event->writer->getDelegate()->getProperties()->setCreator('Laravel');
},
AfterSheet::class => [self::class, 'afterSheet'],
];
}
public static function afterSheet(AfterSheet $event): void
{
$event->sheet->getDelegate()->getStyle('A1')->getFont()->setBold(true);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Closures cannot be serialised. When using queued exports, use a class with __invoke or a static method array-callable instead of a closure.
# RegistersEventListeners
The RegistersEventListeners trait auto-registers static methods that match the event names, without needing registerEvents():
use Maatwebsite\Excel\Concerns\Exportable;
use Maatwebsite\Excel\Concerns\FromQuery;
use Maatwebsite\Excel\Concerns\RegistersEventListeners;
use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Events\BeforeExport;
use Maatwebsite\Excel\Events\BeforeWriting;
use Maatwebsite\Excel\Events\BeforeSheet;
use Maatwebsite\Excel\Events\AfterSheet;
class UsersExport implements FromQuery, WithEvents
{
use Exportable, RegistersEventListeners;
public static function beforeExport(BeforeExport $event): void
{
//
}
public static function beforeWriting(BeforeWriting $event): void
{
//
}
public static function beforeSheet(BeforeSheet $event): void
{
//
}
public static function afterSheet(AfterSheet $event): void
{
//
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# Global event listeners
Events can also be registered globally in a service provider so they apply to every export in your application:
use Maatwebsite\Excel\Writer;
use Maatwebsite\Excel\Sheet;
use Maatwebsite\Excel\Events\BeforeExport;
use Maatwebsite\Excel\Events\AfterSheet;
Writer::listen(BeforeExport::class, function (BeforeExport $event): void {
//
});
Sheet::listen(AfterSheet::class, function (AfterSheet $event): void {
//
});
2
3
4
5
6
7
8
9
10
11
12
# Available events
| Event | Fires when | Delegate |
|---|---|---|
Maatwebsite\Excel\Events\BeforeExport | After the Spreadsheet object is created, before any data is written | $event->writer : Writer |
Maatwebsite\Excel\Events\BeforeWriting | Before writing data to the first sheet begins | $event->writer : Writer |
Maatwebsite\Excel\Events\BeforeSheet | Just before each worksheet is written | $event->sheet : Sheet |
Maatwebsite\Excel\Events\AfterSheet | After each worksheet has been fully written | $event->sheet : Sheet |
Maatwebsite\Excel\Events\AfterChunk | After each chunk is processed (queued exports) | $event->getSheet() : Sheet, $event->getStartRow() : int |
# BeforeExport
Gives access to the Writer, which wraps the PhpSpreadsheet Spreadsheet object via $event->writer->getDelegate(). Useful for setting document properties before any data is written.
BeforeExport::class => function (BeforeExport $event): void {
$event->writer->getDelegate()->getProperties()
->setCreator('Acme Corp')
->setTitle('Users Export');
},
2
3
4
5
# BeforeWriting
Fires after the spreadsheet is set up but before chunk/data writing begins. Use it for any last-minute configuration that needs to happen before rows are inserted.
# BeforeSheet
Gives access to the Sheet wrapping the PhpSpreadsheet Worksheet. Use it to configure the sheet before data is written — e.g. set orientation, freeze panes, add a custom header row.
BeforeSheet::class => function (BeforeSheet $event): void {
$event->sheet->getDelegate()
->getPageSetup()
->setOrientation(\PhpOffice\PhpSpreadsheet\Worksheet\PageSetup::ORIENTATION_LANDSCAPE);
},
2
3
4
5
# AfterSheet
The most commonly used export event. The sheet is fully written when this fires, so you can apply styling, set auto-filters, or freeze rows.
AfterSheet::class => function (AfterSheet $event): void {
$event->sheet->getDelegate()->freezePane('A2');
},
2
3
# AfterChunk
Fires after each chunk is processed when using a queued export. Useful for progress tracking.
AfterChunk::class => function (AfterChunk $event): void {
logger("Chunk starting at row {$event->getStartRow()} written.");
},
2
3
# Macroable
Writer and Sheet are macroable, so you can add shortcuts to PhpSpreadsheet methods not exposed directly by this package:
use Maatwebsite\Excel\Writer;
Writer::macro('setCreator', function (Writer $writer, string $creator): void {
$writer->getDelegate()->getProperties()->setCreator($creator);
});
2
3
4
5
For PhpSpreadsheet methods, refer to their documentation (opens new window).