nox-it / yii2-nox-spreadsheet-reader
用于读取 Excel、OpenOffice 和结构化文本文件的电子表格读取库。基于 Martins Pilsetnieks 版本。
Requires
- php: >=5.4.0
- ext-zip: *
- nox-it/yii2-nox: 1.*
README
spreadsheet-reader 是一个 PHP 电子表格读取器,与其他电子表格读取器不同的是,其主要目标是实现高效的数据提取,可以处理大型(即非常大)的文件。到目前为止,它可能不一定在 CPU、时间和 I/O 方面都非常高效,但至少它不会耗尽内存(除非是 XLS 文件)。
到目前为止,XLSX、ODS 和文本/CSV 文件的解析应该是内存高效的。XLS 文件的解析使用的是来自 http://code.google.com/p/php-excel-reader/ 的 php-excel-reader,遗憾的是,它在处理更大的电子表格时存在内存问题,因为它一次性读取所有数据并将它们全部保留在内存中。
要求
- PHP 5.4.0 或更高版本
- PHP 必须支持 Zip 文件(请参阅 https://php.ac.cn/manual/en/zip.installation.php)
安装
安装此扩展的首选方式是通过 composer。
- 运行以下命令之一:
php composer.phar require --prefer-dist "nyx-solutions/yii2-nyx-spreadsheet-reader" "*"
或者
"nyx-solutions/yii2-nyx-spreadsheet-reader": "*"
将其添加到您的应用程序 composer.json
文件的 require
部分。
用法
所有数据都是按顺序从文件中读取的,每行数据作为数值数组返回。这是读取文件的最简单方法
$reader = new SpreadsheetReader('example.xlsx'); foreach ($reader as $row) { print_r($row); }
然而,现在也支持读取具有可能的多工作表格式的文件。对于 CSV,它被视为只有一个工作表处理。
您可以通过调用 Sheets()
方法来检索文件中包含的工作表信息,该方法返回一个数组,其中键为工作表索引,值为工作表名称。然后,您可以通过将索引传递给 ChangeSheet($Index)
方法来更改当前正在读取的工作表。
示例
$reader = new 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); } }
如果更改的工作表与当前打开的工作表相同,则文件中的位置仍然会回到开头,以符合更改到不同工作表时的相同行为。
关于库性能的说明
- CSV 和文本文件严格按顺序读取,因此性能应该是 O(n);
- 在解析 XLS 文件时,会将整个文件内容读入内存,因此大型 XLS 文件可能导致 "内存不足" 错误;
- Excel文件内部使用所谓的“共享字符串”来优化相同字符串多次重复的情况。内部XLSX是一个XML文本,按顺序解析以从中提取数据,然而,在某些情况下,这些共享字符串可能成为问题——有时Excel可能将工作表中的所有或几乎所有字符串放入共享字符串文件(这是一个单独的XML文本),而且不一定是相同的顺序。最坏的情况是当它们是倒序的——对于每个字符串,我们需要从开始解析共享字符串XML,如果我们想避免将数据保存在内存中。为此,XLSX解析器有一个用于共享字符串的缓存,如果总共享字符串计数不是太高,就会使用它。如果你遇到内存错误,可以尝试将SpreadsheetReader_XLSX中的SHARED_STRING_CACHE_LIMIT常量调整到一个更低的值。
待办事项
- ODS日期格式;
许可
本库中所有代码均根据LICENSE文件中包含的MIT许可进行许可,然而,目前库依赖于php-excel-reader库来解析XLS文件,该库根据PHP许可进行许可。