在PHPExcel中优化setCellValueExplicit()

问题描述 投票:1回答:1

我正在处理Excel中的700行数据。

我在此列上添加此条目:

foreach($data as $k => $v){
   $users ->getCell('A'.$k)->setValue($v['Username']);
   $users->setCellValueExplicit('B'.$k, 
      '=INDEX(\'Feed\'!H2:H'.$lastRow.',MATCH(A'.$k.',\'Feed\'!G2:G'.$lastRow.',0))',
      PHPExcel_Cell_DataType::TYPE_FORMULA);
}

[$users代表电子表格。

[我发现使用上述setCellValueExplicit()写入700个单元需要花费2分钟以上的时间来处理。如果我省略该行,则同一台机器需要4秒钟来处理它。

2分钟可以,但是如果我有2000个单元格该怎么办。有什么方法可以优化速度吗?

ps:=VLOOKUP与上述功能相同。


更新

脚本的整体思想:读取CSV文件(13列,至少100行),将其写入电子表格,创建新的电子表格($users),读取两列,基于一列对其进行排序,然后将其写入$users电子表格。

阅读专栏:

$data = array();
for ($i = 1; $i <= $lastRow; $i++) {
    $user = $Feed ->getCell('G'.$i)->getValue();
    $number = $Feed ->getCell('H'.$i)->getValue();
    $row = array('User' => $user, 'Number' => $number);
    array_push($data, $row);
}

排序数据

function cmpb($a,$b){
    //get which string is less or 0 if both are the same
    if($a['Number']>$b['Number']){
        $cmpb = -1;
    }elseif($a['Number']<$b['Number']){
        $cmpb = 1;
    }else{
        $cmpb = 0;
    }
    //if the strings are the same, check name
    if($cmpb == 0){
        //compare the name
        $cmpb = strcasecmp($a['User'], $b['User']);
    }
    return $cmpb;
}
usort($data, 'cmpb');

写数据

foreach($data as $k => $v){
   $users ->getCell('A'.$k)->setValue($v['Username']);
   $users ->getCell("B{$k}")->setValueExplicit("=INDEX('Feed'!H2:H{$lastRow},MATCH(A{$k},'Feed'!G2:G{$lastRow},0))",
 PHPExcel_Cell_DataType::TYPE_FORMULA);
}

并且还取消设置内存数据:

unset($data);

因此,如果用setValueExplicit注释行,一切将变得更加顺畅。

php performance optimization phpexcel
1个回答
3
投票

查看PHPExcel的源代码,这是PHPExcel_Worksheet :: setCellValueExplicit函数:

public function setCellValueExplicitByColumnAndRow($pColumn = 0, $pRow = 1, $pValue = null, $pDataType = PHPExcel_Cell_DataType::TYPE_STRING)
{
    return $this->getCell(PHPExcel_Cell::stringFromColumnIndex($pColumn) . $pRow)->setValueExplicit($pValue, $pDataType);
}

对于您正在使用的数据类型,PHPExcel_Cell_DataType::TYPE_FORMULAPHPExcel_Cell :: setValueExplicit函数仅执行:

case PHPExcel_Cell_DataType::TYPE_FORMULA:
    $this->_value = (string)$pValue;
    break;

我找不到该特定指令执行时的逻辑解释。尝试将其替换为以下内容,并让我知道是否有任何改进:

$users ->getCell("B{$k}")->setValueExplicit("=INDEX('Feed'!H2:H{$lastRow},MATCH(A{$k},'Feed'!G2:G{$lastRow},0))", PHPExcel_Cell_DataType::TYPE_FORMULA);

作为最后的资源,我的建议是时间跟踪指令的执行以查找瓶颈。

© www.soinside.com 2019 - 2024. All rights reserved.