필자는 Excel에서 700 행의 데이터를 처리하고 있습니다.PHPExcel에서 setCellValueExplicit() 최적화
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);
을3210
이렇게하면 setValueExplicit
이있는 행을 주석 처리하면 모든 것이 더 매끄럽게됩니다. PHPExcel의 소스 코드를 보면
'setCellValueExplicit'에서 설정 한 값은 모든 연결과 작은 따옴표로 이스케이프 처리되어 약간의 값을 읽을 수 없습니다. ''= INDEX ('Feed'! H2 : H {$ lastRow}, MATCH (A {$ k}, 'Feed'! G2 : G {$ lastRow}, 0)) ''로 바꿀 수 있습니다. –
@RolandoIsidoro 불행히도 성능이 향상되었다고 말할 수는 없습니다. – Diolor
그게 바로 답이 아닌 의견으로 추가 한 이유입니다. PHPExcel의 소스 코드를보고 있었는데 설명하는 동작에 대한 이유를 찾을 수 없습니다. 코멘트에 맞지 않기 때문에 몇 가지 고려 사항이있는 답변을 추가하겠습니다. 당신이 그것에 대해 어떻게 생각하는지 알려주세요. –