beleneglorion/spreadsheet-reader

此包已被弃用且不再维护。没有建议的替代包。

Excel、OpenOffice和结构化文本文件的电子表格读取库

dev-master 2013-09-04 00:00 UTC

This package is not auto-updated.

Last update: 2020-03-06 15:40:25 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
	// 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文件可能导致“内存不足”错误;
  • Excel工作表文件内部使用所谓的“共享字符串”来优化重复字符串多次出现的情况。XLSX实质上是一个XML文本,通过顺序解析来提取数据。然而,在某些情况下,这些共享字符串可能成为问题——有时Excel可能会将工作表中的所有字符串或几乎所有字符串都放入共享字符串文件(这是一个独立的XML文本),并且不一定按相同的顺序。最糟糕的情况是它们是倒序的——对于每个字符串,如果我们要避免将数据保留在内存中,就需要从共享字符串XML的开始解析。为此,XLSX解析器有一个共享字符串缓存,当总共享字符串数量不是太高时使用。如果您遇到内存错误,可以尝试将SpreadsheetReader_XLSX中的SHARED_STRING_CACHE_LIMIT常量调整为更小的值。

待办事项

  • ODS日期格式;

许可协议

本库中的所有代码均按照LICENSE文件中包含的MIT许可协议授权,然而,目前该库依赖于php-excel-reader库来解析XLS文件,该库的许可协议为PHP许可协议。