【发布时间】:2016-05-04 11:51:49
【问题描述】:
我正在使用 PHPExcel 读取我的应用程序用户上传的 excel 文件,当他们想要读取每个工作表的第一行并将这些作为 JSON 返回给客户端时。
但是,当用户上传电子表格(其中包含 +/- 15K 行)时,PHPExcel 会尝试加载整个文件,而不仅仅是其中的一部分。有什么办法可以让 PHPExcel 只加载文件的一小部分吗?
我尝试使用this 问题中描述的过滤器,但是它们似乎并没有阻止库在后台解析整个内容。 (当我手动清除文件中的所有行然后加载它时,速度非常快)。
这是我正在使用的代码:
我如何加载我的工作表
// Get file type
$fileType = PHPExcel_IOFactory::identify($filePath);
// Create a reader
$reader = PHPExcel_IOFactory::createReader($fileType);
$reader->setReadDataOnly(true);
$reader->setReadFilter(new WorkSheetFilter());
// Can take up to 60 seconds
$reader->load($filePath);
工作表过滤器
class WorkSheetFilter implements PHPExcel_Reader_IReadFilter
{
/**
* The first row in a spreadsheet
* @var int
*/
const FIRST_ROW = 1;
/**
* On read cell, check if the row is the first row
* If not, it won't be added to the spreadsheet
* @param \PHPExcel_Worksheet_Column $column
* @param \PHPExcel_Worksheet_Row $row
* @param string $worksheetName
* @return bool
*/
public function readCell($column, $row, $worksheetName = '')
{
return ($row == self::FIRST_ROW);
}
}
编辑
我最终使用了Akeneo's Spreadsheet Parser,它是一个非常轻量级的 XLSX 解析器,它将我的执行时间减少了大约 95%(说真的,这太疯狂了)。如果你只对读取数据感兴趣,我强烈推荐它。
【问题讨论】: