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)、2 つの列を読み取り、1 つの列に基づいて並べ替え、$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