nuovo / spreadsheet-reader
适用于Excel、OpenOffice和结构化文本文件的电子表格阅读库
0.5.11
2015-04-30 00:00 UTC
Requires
- php: >= 5.3.0
- ext-zip: *
This package is not auto-updated.
Last update: 2024-09-10 05:48:53 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.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许可证进行许可。