我正在处理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
注释行,一切将变得更加顺畅。
查看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_FORMULA
,PHPExcel_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);
作为最后的资源,我的建议是时间跟踪指令的执行以查找瓶颈。