koenvanmeijeren / spreadsheet-reader
适用于 Excel、OpenOffice 和结构化文本文件的电子表格读取库
Requires (Dev)
- drupal/coder: ^8.3
- ekino/phpstan-banned-code: ^1.0
- ergebnis/phpstan-rules: ^2.1
- mockery/mockery: ^1.6
- pestphp/pest: ^2.30
- pestphp/pest-plugin-type-coverage: ^2.6
- phpbench/phpbench: ^1.2
- phpmd/phpmd: ^2.15
- phpstan/extension-installer: ^1.3
- phpstan/phpstan: ^1.10
- phpstan/phpstan-deprecation-rules: ^1.1
- phpstan/phpstan-phpunit: ^1.3
- phpstan/phpstan-strict-rules: ^1.5
- shipmonk/phpstan-rules: ^2.11
- slevomat/coding-standard: ^8.14
- spatie/ray: ^1.40
- spaze/phpstan-disallowed-calls: ^3.0
- squizlabs/php_codesniffer: ^3.8
- thecodingmachine/phpstan-strict-rules: ^1.0
README
此包提供了一种 PHP 电子表格读取器,与其他读取器不同,它的主要目标是高效的数据提取,可以处理大型(即真正大型)的文件。到目前为止,它可能不是 CPU、时间或 I/O 高效的,但至少它不会耗尽内存(也许除了 XLS 文件)。
到目前为止,XLSX、ODS 和文本/CSV 文件解析应该是内存高效的。XLS 文件解析使用来自 http://code.google.com/p/php-excel-reader/ 的 php-excel-reader 进行,遗憾的是,它在大型的电子表格中存在内存问题,因为它一次读取所有数据,并将其全部保留在内存中。
安装
composer require koenvanmeijeren/spreadsheet-reader
要求
- PHP 8.0 或更高版本
- PHP 必须支持 Zip 文件(见 https://php.ac.cn/manual/en/zip.installation.php)
用于 XLSX 文件读取
- PHP 必须具有 Simple XML & XML 读取支持
用法
所有数据都是按顺序从文件中读取的,每一行作为一个数值数组返回。这是读取文件最简单的方法
$reader = new KoenVanMeijeren\SpreadsheetReader\SpreadsheetReader('example.xlsx'); foreach ($reader as $row) { print_r($row); }
然而,现在也支持读取具有多个工作表的文件格式。对于 CSV,它被视为只有一个工作表处理。
您可以通过调用 sheets()
方法来检索文件中包含的工作表信息,该方法返回一个数组,其中工作表索引作为键,工作表名称作为值。然后您可以通过将索引传递给 changeSheet($Index)
方法来更改当前正在读取的工作表。
示例
$reader = new KoenVanMeijeren\SpreadsheetReader\SpreadsheetReader('example.xlsx'); $sheets = $reader->sheets(); foreach ($sheets as $index => $name) { echo 'Sheet #'.$index.': '.$name; $reader->changeSheet($index); foreach ($reader as $row) { print_r($row); } }
如果更改到当前打开的工作表,文件中的位置仍然会回到开始,以便与更改到不同工作表时的行为保持一致。
测试
从命令行
composer run test
测试覆盖率
启动 docker 容器并进入容器
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d
docker-compose -f docker-compose.yml -f docker-compose.dev.yml exec php /bin/bash
运行带有覆盖率生成的测试
composer run pest:coverage
运行基准测试
运行基准测试
要执行基准测试,请使用以下命令
composer run benchmark
此命令使用默认配置运行基准测试并生成默认报告。
运行基准测试基线
为了建立比较的基线,请运行以下命令
composer run benchmark:baseline
此命令运行基准测试并将结果标记为未来比较的基线。
运行基准测试报告
要生成比较当前基准测试与基线的综合报告,请运行
composer run benchmark:test
此命令提供了基线与当前状态之间性能变化的见解。
关于库性能的说明
- CSV 和文本文件是严格按顺序读取的,因此性能应为 O(n);
- 当解析 XLS 文件时,所有文件内容都读入内存,因此大型 XLS 文件可能导致 "内存不足" 错误;
- XLSX文件内部使用所谓的“共享字符串”来优化相同字符串多次重复的情况。内部XLSX是一个XML文本,它是顺序解析以从中提取数据的,然而,在某些情况下,这些共享字符串可能成为问题 - 有时Excel可能会将工作表中所有或几乎所有字符串放入共享字符串文件(这是一个单独的XML文本),并且不一定按相同的顺序。最坏的情况是它们是逆序的 - 对于每个字符串,如果我们想要避免将数据保留在内存中,就需要从开始解析共享字符串XML。为此,XLSX解析器有一个用于共享字符串的缓存,如果总共享字符串计数不是太高,则会使用它。如果你遇到内存错误,可以尝试将KoenVanMeijeren\SpreadsheetReader\SpreadsheetReader_XLSX中的SHARED_STRING_CACHE_LIMIT常量调整为更小的值。
待办事项
- ODS日期格式;
许可
本库中的所有代码均根据LICENSE文件中包含的MIT许可证授权,然而,目前该库依赖于php-excel-reader库来解析XLS文件,该库根据PHP许可证授权。