【问题标题】:Prevent PHPExcel from loading full file防止 PHPExcel 加载完整文件
【发布时间】: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%(说真的,这太疯狂了)。如果你只对读取数据感兴趣,我强烈推荐它。

【问题讨论】:

    标签: php phpexcel


    【解决方案1】:

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

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

    所以基本答案是“否”,除非您有一些聪明的方法来确定要加载的单元格,并准备创建自己的阅读器和/或过滤机制来执行此操作。

    【讨论】:

    • 是时候找一个不同的库/语言来代替了。还是谢谢
    • D*** 我知道我不应该以表明 PHPExcel 不是 100% 完美的方式回答问题
    • 很久以前,当我尝试阅读日期栏时,我就已经怀疑过这样的事情了(结果证明这是一个痛苦的过程)哈哈
    • 日期列如果是正确的 MS Excel 日期/时间戳,则易于处理;如果它们是字符串,它们会很痛苦
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 2016-09-07
    相关资源
    最近更新 更多