我使用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%(严重的是,它是疯了)。如果您只对读取数据感兴趣,我强烈推荐它。
答案 0 :(得分:2)
解析和加载并不完全相同。
PHPExcel Reader从文件中加载所有单元格数据,然后解析它以确定是否应根据过滤器将单元格添加到PHPExcel对象中。但除非它可以解析该单元格数据列表以获取行/列/工作表,否则它无法判断该单元格是否应该加载到PHPExcel对象。
所以基本答案是&#34; No&#34;,除非你有一些聪明的方法来识别你想要加载的单元格,并准备创建自己的Reader和/或过滤机制来执行此操作。< / p>