lekoala / spread-compat
轻松操作 PhpSpreadsheet, OpenSpout 和 League CSV
Requires
- php: ^8.1
Requires (Dev)
- league/csv: ^9.10
- maennchen/zipstream-php: ^3.1
- openspout/openspout: ^4
- phpoffice/phpspreadsheet: ^1.26|^2
- phpstan/phpstan: ^1
- phpunit/phpunit: ^10
- shuchkin/simplexlsx: ^1
- shuchkin/simplexlsxgen: ^1.3
- squizlabs/php_codesniffer: ^3.6
README
轻松操作 PhpSpreadsheet, OpenSpout 和 League CSV
为什么使用这个?
在Web开发中,导入/导出csv数据是一个非常常见的任务。虽然这是一个非常高效的格式,但它对于习惯了Excel的用户来说有些困难。这就是为什么你通常会接受xlsx格式作为导入/导出目标的原因。
理想情况下,导入/导出单个csv或excel工作表只需更改适配器即可。幸运的是,这个包正是这样做的::-)
支持的包
OpenSpout:快速csv和excel导入/导出 https://github.com/openspout/openspout
League CSV:非常快速的csv导入/导出。可以读取流。 https://github.com/thephpleague/csv
PhpSpreadsheet:慢速excel(xls和xlsx)和csv导入/导出,但功能更多 https://github.com/PHPOffice/PhpSpreadsheet
原生php:非常快速的csv导入/导出,但功能有限。可以读取/输出流。
SimpleXLSX:非常快速的excel导入/导出 https://github.com/shuchkin/simplexlsx https://github.com/shuchkin/simplexlsxgen
该包将优先安装的库,按性能排序。您还可以为每种格式选择首选默认适配器,如下所示
SpreadCompat::$preferredCsvAdapter = SpreadCompat::NATIVE; // our native csv adapter is the fastest SpreadCompat::$preferredXlsxAdapter = SpreadCompat::NATIVE; // our native xlsx adapter is the fastest
使用外观
虽然您可以使用单个适配器,但您可能不希望过多地关注文件是如何读取和写入的。该包提供了一个简单的外观,包含静态方法,用于读取和写入文件。
请注意,读取方法返回一个Generator
。如果您需要一个数组,您需要使用iterator_to_array
。
$data = iterator_to_array(SpreadCompat::read('myfile.csv')); // or foreach(SpreadCompat::read('myfile.csv') as $row) { // Do something }
输出到浏览器
该包包括一种简单的方法来实现输出到浏览器类型的功能。
一些适配器允许您直接将响应流式传输。
SpreadCompat::output('myfile.csv'); exit();
配置
使用命名参数
该包接受使用...opts的选项,这意味着您可以自由使用命名参数或传递一个数组。
$data = iterator_to_array(SpreadCompat::read('myfile.csv', assoc: true)); // or $data = iterator_to_array(SpreadCompat::read('myfile.csv', ...$opts));
使用选项对象
您还可以使用Options
类,该类包含所有适配器的所有可用选项。不支持的选项将被忽略。
$options = new Options(); $options->separator = ";"; $data = iterator_to_array(SpreadCompat::read('myfile.csv', $options));
设置适配器
您可以选择使用哪个适配器,而不是依赖于静态变量
$csvData = SpreadCompat::readString($csv, adapter: SpreadCompat::NATIVE); // or $options = new Options(); $options->adapter = SpreadCompat::NATIVE; $csvData = SpreadCompat::readString($csv, $options);
工作表
该包仅支持1个工作表,因为它旨在能够用xlsx替换csv或反之亦然
基准测试
由于我们可以比较我们的解决方案,内置的bench.php脚本能在我机器上给出以下结果
openspout/openspout 4.24.4
phpoffice/phpspreadsheet 2.1.0
league/csv 9.16.0
shuchkin/simplexlsx 1.1.11
shuchkin/simplexlsxgen 1.4.11
读取具有5000行的文件
Results for csv
LeKoala\SpreadCompat\Csv\Native : 0.0084
LeKoala\SpreadCompat\Csv\League : 0.0317
LeKoala\SpreadCompat\Csv\OpenSpout : 0.0993
LeKoala\SpreadCompat\Csv\PhpSpreadsheet : 0.6713
Results for xlsx
LeKoala\SpreadCompat\Xlsx\Native : 0.0639
LeKoala\SpreadCompat\Xlsx\Simple : 0.1476
LeKoala\SpreadCompat\Xlsx\PhpSpreadsheet : 0.7436
LeKoala\SpreadCompat\Xlsx\OpenSpout : 0.8979
写入具有2500行的文件
Results for csv
LeKoala\SpreadCompat\Csv\Native : 0.0065
LeKoala\SpreadCompat\Csv\League : 0.0129
LeKoala\SpreadCompat\Csv\OpenSpout : 0.0443
LeKoala\SpreadCompat\Csv\PhpSpreadsheet : 0.3668
Results for xlsx
LeKoala\SpreadCompat\Xlsx\Native : 0.0401
LeKoala\SpreadCompat\Xlsx\Simple : 0.0861
LeKoala\SpreadCompat\Xlsx\OpenSpout : 0.2555
LeKoala\SpreadCompat\Xlsx\PhpSpreadsheet : 0.674
对于简单的导入/导出,很明显使用原生适配器是最快的。默认情况下没有启用它们,因为它们可能缺少您可能需要的某些兼容性功能。
立即停止浪费CPU周期,并请使用最有效的适配器::-)