kesslerdev / spreadsheet-reader
适用于Excel、OpenOffice和结构化文本文件的电子表格读取库
此软件包的官方存储库似乎已消失,因此已冻结该软件包。
Requires
- php: >= 5.3.0
- ext-zip: *
This package is not auto-updated.
Last update: 2020-02-02 15:32:27 UTC
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.3.0 或更高版本
- PHP必须具有Zip文件支持(请参阅 https://php.ac.cn/manual/en/zip.installation.php)
使用方法
所有数据都是顺序地从文件中读取的,每行作为一个数字数组返回。这是读取文件的最简单方法
<?php
// If you need to parse XLS files, include php-excel-reader
require('php-excel-reader/excel_reader2.php');
require('SpreadsheetReader.php');
$Reader = new SpreadsheetReader('example.xlsx');
foreach ($Reader as $Row)
{
print_r($Row);
}
?>
然而,现在也支持读取支持多工作表格式的文件。对于CSV,它被视为只有一个工作表来处理。
您可以通过调用 Sheets()
方法来检索文件中包含的工作表信息,该方法返回一个数组,其中工作表索引作为键,工作表名称作为值。然后,您可以通过将索引传递给 ChangeSheet($Index)
方法来更改当前正在读取的工作表。
示例
<?php
$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);
}
}
?>
如果更改的工作表与当前打开的工作表相同,则文件中的位置仍然会恢复到开头,以便与更改到不同工作表时的相同行为保持一致。
测试
从命令行
php test.php path-to-spreadsheet.xls
在浏览器中
http://path-to-library/test.php?File=/path/to/spreadsheet.xls
关于库性能的说明
- CSV和文本文件严格顺序读取,性能应为O(n);
- 解析XLS文件时,将所有文件内容读入内存,因此大XLS文件可能导致“内存不足”错误;
- XLSX文件内部使用所谓的“共享字符串”来优化相同字符串重复多次的情况。XLSX本质上是一个XML文本,需要顺序解析以提取数据,但在某些情况下,这些共享字符串可能会成为问题——有时Excel可能会将工作表中的所有或几乎所有字符串放入共享字符串文件(这是一个独立的XML文本),并且不一定按照相同的顺序。最坏的情况是它们是反向顺序的——对于每个字符串,我们需要从头开始解析共享字符串XML,如果我们想避免将数据保留在内存中。为此,XLSX解析器有一个用于共享字符串的缓存,当总共享字符串数量不是太高时使用。如果你遇到内存错误,你可以尝试将SpreadsheetReader_XLSX中的SHARED_STRING_CACHE_LIMIT常量调整为更小的值。
待办事项
- ODS日期格式;
许可
本库中所有代码均根据LICENSE文件中包含的MIT许可证进行许可,然而,目前该库依赖于php-excel-reader库进行XLS文件解析,该库的许可证为PHP许可证。