2013-05-09 2 views
1

필자는 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의 소스 코드를 보면

+0

'setCellValueExplicit'에서 설정 한 값은 모든 연결과 작은 따옴표로 이스케이프 처리되어 약간의 값을 읽을 수 없습니다. ''= INDEX ('Feed'! H2 : H {$ lastRow}, MATCH (A {$ k}, 'Feed'! G2 : G {$ lastRow}, 0)) ''로 바꿀 수 있습니다. –

+0

@RolandoIsidoro 불행히도 성능이 향상되었다고 말할 수는 없습니다. – Diolor

+0

그게 바로 답이 아닌 의견으로 추가 한 이유입니다. PHPExcel의 소스 코드를보고 있었는데 설명하는 동작에 대한 이유를 찾을 수 없습니다. 코멘트에 맞지 않기 때문에 몇 가지 고려 사항이있는 답변을 추가하겠습니다. 당신이 그것에 대해 어떻게 생각하는지 알려주세요. –

답변

2

,이 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); 

병목을 찾는 명령의 실행을 추적 할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 나는 그것을 시도하고 2 분에서 1 분으로 시간을 떨어 뜨렸다. 나는 아직도 이것이 많은 것이고 아주 무리하다는 것을 두려워한다. 나는 또한 스크립트를 2 ~ 3 회 실행했고 '134217728 바이트의 메모리 크기를 사용할 수 없습니다.'라는 메시지가 나타납니다. 128 메가 바이트의 메모리 ... 더 이상 아이디어를 환영합니다. 감사합니다. – Diolor

+0

'$ data'를 붙여 넣을 수 있다면 어딘가에서 작업하고 있을지도 모릅니다. –

+0

메모리 문제도 해결하려면 메모리를 늘리거나 셀 캐싱을 사용해야합니다. 그러나 후자는 속력 –

관련 문제