Filament Spreadsheet

An inline-editable table for bulk editing Eloquent records in Filament v4 (4.13+) and v5. A sheet page for any resource: edit cells with the keyboard, paste rows from Excel or Google Sheets, fill down, undo, and press Save once; the server validates every cell with your rules, checks your policies row by row, detects conflicts and writes the batch in one transaction. Free and open source (MIT), built on Tabulator (MIT).
- Repository: github.com/packstub/filament-spreadsheet
- Packagist: packstub/filament-spreadsheet
- Support: GitHub issues
Features
- One Save for hundreds of cells: edits wait across pages, one transaction writes them.
- Rules, policies and conflicts on the server: every cell validated, every row authorized.
- A keyboard grid: ranges, fill down, undo and redo.
- Paste from Excel or Sheets: extra rows become new records.
- Seven column types: text, number, boolean, select, dates and formulas.
- Add and delete rows: behind your policy, written with the next Save.
- Search, sort, filters and pages: on the server, unsaved cells kept.
- A resource page or your own: an Edit as sheet button on any resource.
- Events and hooks:
RowsSaved,RowSaveFailed, before and after a save. - Dark mode, RTL and translations: Tabulator bundled, nothing else to install.
Guides
| Guide | What it covers |
|---|---|
| Installation | Requirements, the package, the config file, the plugin |
| Your first sheet | A resource page, the SheetAction, what the query decides |
| Columns | Every column type and option, relationships, computed values, read-only cells, rules |
| Editing | The keyboard map, paste from Excel or Sheets, fill-down, undo |
| Saving | The batch, errors on cells, conflicts, all-or-nothing versus per-row |
| Adding and deleting rows | New rows with defaults, deletions, what the policy gates |
| Search, sort, filters, pagination | The toolbar, unsaved changes across pages |
| Authorization | Policies, closures, read-only mode, greyed rows |
| Tenancy | Resource pages in a tenant panel, standalone pages |
| Events and hooks | RowsSaved, RowSaveFailed, beforeSave(), afterSave(), mutateRowBeforeSave() |
| A sheet outside a resource | SpreadsheetPage and the trait in any Livewire component |
| Styling | The CSS variables, dark mode, RTL, translations |
| Performance | Page sizes, thousands of rows, what is queried when |
| Editable columns vs a sheet | When to use which, and the neighbours: import, export, a Sheets-like document |
| Upgrading | Version notes |
At a glance
composer require packstub/filament-spreadsheet
php artisan filament:assets
use Packstub\Spreadsheet\Columns\NumberColumn;
use Packstub\Spreadsheet\Columns\SelectColumn;
use Packstub\Spreadsheet\Columns\TextColumn;
use Packstub\Spreadsheet\Pages\SpreadsheetResourcePage;
use Packstub\Spreadsheet\Spreadsheet;
class ProductsSheet extends SpreadsheetResourcePage
{
protected static string $resource = ProductResource::class;
public function spreadsheet(Spreadsheet $spreadsheet): Spreadsheet
{
return $spreadsheet
->columns([
TextColumn::make('sku')->rules(['required', 'unique:products,sku'])->frozen(),
TextColumn::make('name')->rules(['required']),
SelectColumn::make('category_id')->relationship('category', 'name'),
NumberColumn::make('price')->decimals(2)->min(0),
])
->searchable(['sku', 'name'])
->creatable()
->deletable();
}
}
Requirements
PHP 8.3+, Laravel 12 or 13, Filament 4.13+ or 5.
These pages are published at packstub.dev/docs/filament-spreadsheet from the package's docs/ directory. Spotted a mistake? Open a pull request.