PHPExcel读取速度太慢

3

我知道,在这里有很多关于提高PHPExcel性能的问题。但是所有这些问题都是关于写入数据的,而我的问题在于读取数据。

我的函数:

function parse($filename){
    $objPHPExcel = PHPExcel_IOFactory::load($filename); 
    $activeSheet = $objPHPExcel->getActiveSheet();
    $parsedData = array();
    $columnHeaders = array('order', 'ts', 'summ', 'name', 'quant', 'price', 'bccu');
    foreach ($activeSheet->getRowIterator() as $rkey => $row) {
        $cellIterator = $row->getCellIterator();
        foreach ($cellIterator  as $ckey => $cell) {
            $parsedData[$columnHeaders[$ckey]] = $cell->getCalculatedValue();
        }
    }
    return $parsedData;
}

该文件包含约300行和7列。该脚本在30秒内无法运行。
我该如何改进它?
编辑:
使用了
$objReader = PHPExcel_IOFactory::createReader("Excel2007");
$objPHPExcel = $objReader->load($filename); 

没有成功


你能确定是加载需要时间?还是迭代行和单元格需要时间? - Mark Baker
迭代。在允许的30秒内只能到达第178个。 - k102
迭代器速度较慢,我自己通常不使用它们:您可能会发现使用toArray()或rangeToArray()方法更有效率,然后遍历生成的数组以将“键”设置为所需的关联名称。 - Mark Baker
3个回答

4
如果您的列已经定义好了,那么是否考虑移除列迭代器?
可以尝试这样做:
foreach ($activeSheet->getRowIterator() as $rkey => $row) {
    $rowIndex = $row->getRowIndex ();
    $parsedData[$rowIndex]['order'] = $activeSheet->getCell('A' . $rowIndex);
    $parsedData[$rowIndex]['ts']    = $activeSheet->getCell('B' . $rowIndex);
    $parsedData[$rowIndex]['summ']  = $activeSheet->getCell('C' . $rowIndex);
    .
    .
    .
}

谢谢!对我很有帮助!顺便说一下:PHPExcel_Worksheet->cellExists被调用了100670次,所以我想单元格迭代器确实是一个不好的主意。 - k102
据我所知,单元格迭代器的最大值是包含值的最右侧单元格。在您的情况下,可能在第100670列中有一个带有值的单元格。也许是有人不小心填写了它。 - ariefbayu

2
尝试在运行parse()之前通过gc_disable()禁用垃圾收集器。猜测这里的迭代级别未被PHP正确优化。请注意,保留HTML标签。

刚刚检查了一下,我只发现了稍微多一点的内存消耗 :) - k102
在我的情况下,只需读取250行和10列。它从12秒提升到了6秒。 - Frank

2

如果您不打算更改文件的内容,则将阅读器设置为只读模式可提高约10倍的速度。

例如:

$objReader = PHPExcel_IOFactory::createReader( 'Excel5' );
$objReader->setReadDataOnly( true );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接