emhusnan / spreadsheet-reader
此分支仓库来自 nuovo/spreadsheet-reader。我为 PHP 7.2 添加了自定义修复。用于 Excel、OpenOffice 和结构化文本文件的电子表格读取库
Requires
- php: >= 5.3.0
- ext-zip: *
This package is not auto-updated.
Last update: 2024-09-26 13:10:13 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 许可证授权,但到目前为止,该库依赖于用于 XLS 文件解析的 php-excel-reader 库,该库受 PHP 许可证授权。