monger/spreadsheet-reader

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

v1.0.4 2017-07-25 00:13 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:28:05 UTC


README

spreadsheet-reader 是一个 PHP 电子表格读取器,与其它不同的地方在于,它的主要目标是高效的数据提取,能够处理大文件(这里的“大”指的是真正的“大”)。到目前为止,它可能不是 CPU、时间或 I/O 高效的,但至少它不会耗尽内存(除非是 XLS 文件)。

到目前为止,XLSX、ODS 和文本/CSV 文件解析应该是内存高效的。XLS 文件解析使用 php-excel-reader 实现,来自 http://code.google.com/p/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 文件可能会导致“内存不足”错误;
  • XLSX 文件使用所谓的“共享字符串”来优化字符串重复多次的情况。内部上,XLSX 是一个 XML 文本,它被顺序解析以从中提取数据,但是,在某些情况下,这些共享字符串可能成为问题 - 有时 Excel 可能将电子表格中的所有或几乎所有字符串放入共享字符串文件(这是一个单独的 XML 文本),而不一定是相同的顺序。最坏的情况是当它以相反的顺序出现时 - 对于每个字符串,我们需要从开始解析共享字符串 XML,如果我们想避免将数据保存在内存中。为此,XLSX 解析器有一个用于共享字符串的缓存,如果总共享字符串计数不是太高,则会使用它。如果您遇到内存不足错误,您可以尝试将 SpreadsheetReader_XLSX 中的 SHARED_STRING_CACHE_LIMIT 常量调整到较低的值。

待办事项

  • ODS 日期格式;

许可

本库中的所有代码均根据 LICENSE 文件中包含的 MIT 许可证进行许可,然而,目前该库依赖于 php-excel-reader 库进行 XLS 文件解析,该库的许可证为 PHP 许可证。