我正在处理我的 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
一切都会变得更流畅。