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代表电子表格。

我看到使用上述内容编写 700 个单元格setCellValueExplicit()需要 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一切都会变得更流畅。

4

1 回答 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);

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

于 2013-05-09T19:50:36.947 回答