阻止PHPExcel加载完整文件

时间:2016-05-04 11:51:49

标签: php phpexcel

我使用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);

WorksheetFilter

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%(严重的是,它是疯了)。如果您只对读取数据感兴趣,我强烈推荐它。

1 个答案:

答案 0 :(得分:2)

解析和加载并不完全相同。

PHPExcel Reader从文件中加载所有单元格数据,然后解析它以确定是否应根据过滤器将单元格添加到PHPExcel对象中。但除非它可以解析该单元格数据列表以获取行/列/工作表,否则它无法判断该单元格是否应该加载到PHPExcel对象。

所以基本答案是&#34; No&#34;,除非你有一些聪明的方法来识别你想要加载的单元格,并准备创建自己的Reader和/或过滤机制来执行此操作。< / p>