kairos / spreadsheetreader
Excel、OpenOffice和结构化文本文件的电子表格阅读库
Requires
- php: >= 5.3.0
- ext-zip: *
This package is not auto-updated.
Last update: 2024-09-22 07:28:55 UTC
README
摘要
spreadsheet-reader 是一个PHP电子表格阅读器,与其他不同的是,其主要目标是高效的数据提取,可以处理大型(真的很大)的文件。到目前为止,它可能不是CPU、时间或I/O高效的,但至少它不会耗尽内存(除了可能对于XLS文件)。
到目前为止,XLSX、ODS和text/CSV文件解析应该是内存高效的。XLS文件解析使用的是来自http://code.google.com/p/php-excel-reader/的php-excel-reader,遗憾的是,它在大型的电子表格中存在内存问题,因为它一次读取所有数据并将其全部保留在内存中。
要求
- 需要PHP 5.3,因为使用了命名空间和闭包。没有其他依赖项,并且可以独立于任何框架或环境使用。
- PHP必须有Zip文件支持(参见https://php.ac.cn/manual/en/zip.installation.php)
安装
在你的composer文件中
{ "require": { "kairos/spreadsheetreader": "dev-master" } }
更新你的composer
php composer.phar update kairos/spreadsheetreader
如何使用
现在您可以在控制器中包含这个类
use Kairos\SpreadsheetReader as Reader;
所有数据都是从文件中顺序读取的,每行作为一个数字数组返回。这是读取文件最简单的方法
$reader = new Reader\SpreadsheetReader('example.xlsx'); foreach ($reader as $row) { print_r($row); }
但是,现在也支持对文件格式中可能的多工作表读取。对于CSV,它被视为只有一个工作表来处理。
您可以通过调用返回一个以工作表索引作为键、工作表名称作为值的数组的Sheets()
方法来检索文件中包含的工作表信息。然后,您可以通过将索引传递给ChangeSheet($index)
方法来更改当前正在读取的工作表。
$reader = new Reader\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文件可能会导致“内存不足”错误;
- XLSX文件内部使用所谓的“共享字符串”来优化重复字符串的情况。内部XLSX是一个XML文本,它被顺序解析以从中提取数据,但是,在某些情况下,这些共享字符串可能成为问题 - 有时Excel可能会将电子表格中的所有或几乎所有字符串放入共享字符串文件(这是一个单独的XML文本),并且不一定按照相同的顺序。最坏的情况是当它是反向顺序时 - 对于每个字符串,我们需要从开始解析共享字符串XML,如果我们想避免将数据保留在内存中。为此,XLSX解析器有一个用于共享字符串的缓存,如果总共享字符串计数不是太高,则会使用该缓存。如果您遇到内存不足错误,可以尝试将SpreadsheetReader_XLSX中的SHARED_STRING_CACHE_LIMIT常量调整为较低的值。
许可
本库中所有代码均根据LICENSE文件中包含的MIT许可进行授权。然而,目前该库依赖于php-excel-reader库来解析XLS文件,该库遵循PHP许可。