lekoala / spread-compat

轻松操作 PhpSpreadsheet, OpenSpout 和 League CSV

资助包维护!
lekoala

0.8.0 2024-07-22 13:47 UTC

This package is auto-updated.

Last update: 2024-09-23 09:23:28 UTC


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周期,并请使用最有效的适配器::-)