lekoala / spread-compat
Easily manipulate PhpSpreadsheet, OpenSpout and League CSV
Fund package maintenance!
Requires
- php: ^8.1.2
- ext-libxml: *
- ext-mbstring: *
- ext-simplexml: *
- ext-xmlreader: *
- ext-zip: *
- lekoala/baresheet: ^0.2
Requires (Dev)
- league/csv: ^9.10
- maennchen/zipstream-php: ^3.1
- openspout/openspout: ^4.24 || ^5
- phpoffice/phpspreadsheet: ^1.26 || ^2 || ^3 || ^4 || ^5
- phpstan/phpstan: ^2
- phpunit/phpunit: ^10 || ^11
- shuchkin/simplexlsx: ^1
- shuchkin/simplexlsxgen: ^1.3
- squizlabs/php_codesniffer: ^3.6
- dev-master
- 0.10.1
- 0.10.0
- 0.9.10
- 0.9.9
- 0.9.8
- 0.9.7
- 0.9.6
- 0.9.5
- 0.9.4
- 0.9.3
- 0.9.2
- 0.9.1
- 0.9.0
- 0.8.4
- 0.8.3
- 0.8.2
- 0.8.1
- 0.8.0
- 0.7.1
- 0.7.0
- 0.6.1
- 0.6.0
- 0.5.1
- 0.5.0
- 0.4.2
- 0.4.1
- 0.4.0
- 0.3.0
- 0.2.0
- 0.1.1
- 0.1.0
- dev-tests-stream-contents-test-13165352853501346407
- dev-security-fix-xlsx-native-xxe-8060623813413781411
- dev-perf-optimize-column-extraction-18426864143887803053
This package is auto-updated.
Last update: 2026-03-06 14:26:39 UTC
README
Easily manipulate PhpSpreadsheet, OpenSpout, League CSV and Baresheet
Why use this ?
Importing/exporting csv data is a very common task in web development. While it's a very efficient format, it's also somewhat difficult for end users that are used to Excel. This is why you often end up accepting also xlsx or ods format as a import/export target.
Ideally, importing single sheets of csv, excel or ods should be just a matter of changing an adapter. Thankfully, this package does just this :-)
Supported packages
Baresheet (Native): very fast csv, xlsx and ods import/export, but limited features. Can read/output streams. It is used as our default native adapter. https://github.com/lekoala/baresheet
OpenSpout: fast csv, excel (xlsx) and ods import/export https://github.com/openspout/openspout
League CSV: very fast csv import/export. Can read streams. https://github.com/thephpleague/csv
PhpSpreadsheet: slow excel (xls, xlsx) and ods and csv import/export, but more features https://github.com/PHPOffice/PhpSpreadsheet
SimpleXLSX: very fast excel import/export https://github.com/shuchkin/simplexlsx https://github.com/shuchkin/simplexlsxgen
This package will prioritize installed library, by order of performance. You can also pick your preferred default adapter for each format like this:
SpreadCompat::$preferredCsvAdapter = SpreadCompat::BARESHEET; // or SpreadCompat::NATIVE
SpreadCompat::$preferredXlsxAdapter = SpreadCompat::BARESHEET;
SpreadCompat::$preferredOdsAdapter = SpreadCompat::BARESHEET;
Using the facade
While you can use individual adapters, it's very likely you don't want to bother too much how your files are read and written. This package provides a simple facade with static methods in order to read and write files.
Please note that read methods return a Generator. If you want an array, you need to use iterator_to_array.
$data = iterator_to_array(SpreadCompat::read('myfile.csv'));
// or
foreach(SpreadCompat::read('myfile.xlsx') as $row) {
// Do something
}
// or even
foreach(SpreadCompat::read('myfile.ods') as $row) {
// Do something
}
Output to browser
This package includes a simple way to leverage output to browser type of functionnality.
Some adapters allow you to stream directly the response.
SpreadCompat::output('myfile.csv');
exit();
Configure
Using named arguments
This package accepts options using ...opts, this means you can freely use named arguments or pass an array.
$data = iterator_to_array(SpreadCompat::read('myfile.csv', assoc: true));
// or
$data = iterator_to_array(SpreadCompat::read('myfile.csv', ...$opts));
Using options object
You can also use the Options class that regroups all available options for all adapters. Unsupported options are ignored.
$options = new Options();
$options->separator = ";";
$data = iterator_to_array(SpreadCompat::read('myfile.csv', $options));
Setting the adapter
Instead of relying on the static variables, you can choose which adapter to use:
$csvData = SpreadCompat::readString($csv, adapter: SpreadCompat::BARESHEET);
// or
$options = new Options();
$options->adapter = SpreadCompat::NATIVE;
$csvData = SpreadCompat::readString($csv, $options);
Worksheets
This package supports only 1 worksheet, as it is meant to be able to replace csv by xlsx or vice versa
Benchmarks
Since we can compare our solutions, there is a built in bench script. You can check the results here
For simple imports/exports, it's very clear that using the Native (Baresheet) adapter is the fastest overall choice.
Stop wasting cpu cycles right now and please use the most efficient adapter :-)