spatie/simple-excel
Lightweight reader/writer for simple CSV and XLSX files in PHP/Laravel. Uses generators and LazyCollection for low memory usage on large files. Quickly stream rows for processing or export data without loading entire spreadsheets into memory.
Strengths:
storage_path(), S3).excel.parsed) for reactive workflows (e.g., queue jobs, notifications).Weaknesses:
phpoffice/phpspreadsheet (for XLSX) and league/csv (for CSV), which may introduce indirect dependencies.OutOfMemory if misconfigured (e.g., loading entire file into memory). Mitigated by using generators (getRows()).memory_limit and upload_max_filesize may constrain very large files (>100MB). Requires server tuning or chunked processing.phpoffice/phpspreadsheet and league/csv already in use? If not, what’s the impact of adding them?phpoffice/phpspreadsheet directly be better?league/csv sufficient without the abstraction layer?Laravel Ecosystem:
SimpleExcelReader/SimpleExcelWriter to the container for dependency injection.Storage facade for local/S3/remote file handling.SimpleExcelReader::create()->chunk(1000)->process()).ExcelParsed, ExportGenerated) for decoupled workflows.Validator to sanitize uploaded files (e.g., check MIME type, size).ImportUsersFromExcelJob).PHP Extensions:
fileinfo and dom extensions are enabled for MIME type detection and XML parsing (XLSX).spatie/simple-excel.SimpleExcelReader.SimpleExcelWriter..xlsx only (no .xls support). Uses OpenXML (PhpSpreadsheet).phpoffice/phpspreadsheet (~102MB, but only loaded on demand).league/csv (~1.5MB).composer require spatie/simple-excel.php artisan vendor:publish --provider="Spatie\SimpleExcel\SimpleExcelServiceProvider".$this->app->bind(SimpleExcelReader::class, function () {
return new SimpleExcelReader();
});
use Spatie\SimpleExcel\SimpleExcelReader;
SimpleExcelReader::create(storage_path('imports/users.csv'))
->chunk(500)
->process(function (array $rows) {
User::insert($rows);
});
use Spatie\SimpleExcel\SimpleExcelWriter;
$writer = SimpleExcelWriter::create(storage_path('exports/users.xlsx'));
$writer->addSheet('Users');
$writer->addRow(['Name', 'Email']); // Header
User::chunk(1000, function ($users) use ($writer) {
$writer->addRows($users->toArray());
});
$writer->save();
phpoffice/phpspreadsheet adds ~100MB to vendor dir (though only loaded on demand).composer.json).memory_limit or use chunking.encoding in SimpleExcelReader.How can I help you explore Laravel packages today?