防止 PHPExcel 加载完整文件

Prevent PHPExcel from loading full file

我正在使用 PHPExcel 读出我的应用程序用户上传的 excel 文件,当他们这样做时,我想读出每个工作表的第一行和 return 这些作为 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%(说真的,这太疯狂了)。如果你只对读出数据感兴趣,强烈推荐。

解析和加载不是一回事。

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

所以基本答案是 "No",除非您有一些聪明的方法来识别要加载的单元格,并准备创建自己的 Reader and/or 过滤机制这样做。