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
すべての行がよりスムーズになります。