我正在尝试使用 PHPExcel1.7.3c 读取一个 17MB 的 excel 文件(2003),但是在超过我的 120 秒限制后,它在加载文件时已经崩溃。是否有另一个图书馆可以更有效地做到这一点?我不需要样式,我只需要它支持 UTF8。谢谢你的帮助
6 回答
使用 PHPExcel 时,文件大小不是一个好的衡量标准,更重要的是了解每个工作表中的单元格数量(行 x 列)。
如果您不需要造型,您是否致电:
$objReader->setReadDataOnly(true);
在加载文件之前?
如果您不需要访问所有工作表或仅访问工作表中的某些单元格,请查看使用
$objReader->setLoadSheetsOnly(array(1,2))
或者
$objReader->setLoadSheetsOnly(1)
或定义一个 readFilter
你在使用单元缓存吗?如果有,是什么方法?这会减慢加载时间。
如果您从读取的 Excel 文件中唯一需要的是数据,那么这是我读取大型 Excel 文件的方法:
我在我的服务器上安装 gnumeric,即使用 debian/ubuntu:apt-get install gnumeric
然后读取我的 excel 文件并将其存储到二维数据数组中的 php 调用非常简单(维度是行和列):
system("ssconvert \"$excel_file_name\" \"temp.csv\"");
$array = array_map("str_getcsv", file("temp.csv"));
然后我可以用我的数组做我想做的事。对于一个 10MB 的大 xls 文件,这需要不到 10 秒的时间,同时我需要在我最喜欢的电子表格软件上加载文件!
对于非常大的文件,您应该使用 fopen() 和 file_getcsv() 函数并做您必须做的事情,而不将数据存储在一个巨大的数组中,以避免使用 file() 函数将整个 csv 文件存储在内存中。这会更慢,但不会吃掉服务器的所有内存!
17MB 是一个很大的文件。
计算一个 1MB 文件需要多长时间来解析,这样您就可以计算出一个 17MB 文件需要多长时间。那么一种选择可能就是增加您的 120 秒限制。
或者,您可以导出到 CSV,这样会更有效,然后通过 PHP 的 fgetcsv 导入。
我听说Excel Explorer更适合读取大文件。
也许您可以转换/导出为 csv,并使用内置的 fgetcsv()。取决于你需要什么样的功能。
我目前正在使用电子表格阅读器(https://github.com/nuovo/spreadsheet-reader),它的阅读速度非常快XLSX
,ODS
并且CSV
仅在阅读XLS
格式时出现了问题。