2013-03-07 2 views
2

xdebug로 Excel 생성 코드를 프로파일하고 그라인드 파일을 검토했습니다. 분명히 내 실행 시간의 대부분에 소요되는 :PHPExcel - 숫자 포맷 적용시 성능이 크게 저하됩니다.

setFormatCode(...) 

enter image description here

그리고 잘못된 코드가 여기에 있습니다 :

protected function formatRow($line) 
{ 
    // /* 
    foreach ($this->getIntegerColumns() as $column) { 
     $style = $this->worksheet->getStyle($column . $line); 
     $style->getNumberFormat()->setFormatCode('#,##0'); 
    } 
    foreach ($this->getFloatColumns() as $column) { 
     $style = $this->worksheet->getStyle($column . $line); 
     $style->getNumberFormat()->setFormatCode('#,##0.00'); 
    } 
    foreach ($this->getPercentageColumns() as $column) { 
     $style = $this->worksheet->getStyle($column . $line); 
     $style->getNumberFormat()->setFormatCode('0.00%'); 
    } 
    foreach ($this->getDateColumns() as $column) { 
     $style = $this->worksheet->getStyle($column . $line); 
     $style->getNumberFormat()->setFormatCode('mm/dd/yyyy'); 
    } 
    // */ 
    return $this; 
} 

내 보고서는 일반적으로 걸릴 :

getSummaryData: Elapsed time: 4 
getInteractionData: Elapsed time: 10 
getVideoData: Elapsed time: 2 
new CampaignDetailReport: Elapsed time: 0 
new CampaignDetailReportWriter: Elapsed time: 0 
new write(): Elapsed time: 125 

~ 140 seconds 

그러나 formatRow() 함수의 내용을 주석 처리하면 다음과 같습니다.

getSummaryData: Elapsed time: 4 
getInteractionData: Elapsed time: 9 
getVideoData: Elapsed time: 2 
new CampaignDetailReport: Elapsed time: 0 
new CampaignDetailReportWriter: Elapsed time: 0 
new write(): Elapsed time: 32 

~ 50 seconds 

여전히 길지만 성능은 거의 50 % 정도 빠릅니다.

답변을 검토 한 결과는 PHPExcel very slow - ways to improve?입니다.하지만 수정 방법을 잘 모르겠습니다. 이상적으로는 셀 기반이 아닌 전체 열에 스타일을 적용하는 것이 해결책이라고 생각합니다. 열이 '비용'과 같은 경우 모든 열 값이 float이되므로 모든 셀에 숫자 형식을 적용하는 것이 안전 할 것입니다. 바로 지금 실제로 그렇게하는 방법.

UPDATE : 마크 베이커 응답에 대응

, 나는 다음과 같은 한 :

foreach($this->getIntegerColumns() as $column) { 
     $this->worksheet->getStyle(sprintf("%s%s:%s%s", $column, 5, $column, $this->line)) 
      ->getNumberFormat() 
      ->setFormatCode('#,##0'); 
    } 

어느 칼럼 내의 모든 셀의 스타일 정수 유형의 모든 열을. 모든 보고서 메트릭은 5에서 시작하여 내부 카운터 인 this-> line으로 이동합니다. 이것은 지금까지 잘 작동하고 있습니다. 하나의 시트를 완전히 스타일링하는 데 약 4 초가 걸렸습니다 (보고서에 3x 시트가 있음). 그래서 그 속도로 나는 모든 시트를 스타일링 할 수 있어야하고 실행 시간이 추가로 ~ 12 초 밖에 걸리지 않아 ~ 65 대 ~ 125!

답변

4

유창한 인터페이스를 활용하십시오.

가능한 셀 범위에 서식을 적용 : 당신이 한 번에 셀 (또는 셀 범위)에 여러 스타일의 설정을 적용 할 경우

$this->worksheet->getStyle('A1:A21') 
    ->getNumberFormat() 
    ->setFormatCode('0.00%'); 

는 스타일의 applyFromArray()를 사용합니다.

이러한 모든 기술을 사용하면 속도가 향상됩니다.

+0

위대한 - 내 서식 지정 코드를 클래스 계층에서 약간 위로 이동하고 제안한 내용을 수행했습니다. 지금까지 훨씬 더 나은 작업 -이 모든 것을 사용하려면 "시트"를 업데이트해야합니다. 감사. 내 대답은 실제 코드와 함께 업데이트되었습니다. –

+0

다음과 같이 구현할 계획된 기능을 떠올리게하는 것 같습니다. $ this-> objPHPExcel-> getActiveSheet() -> getStyle ($ columnIndex) -> getNumberFormat() -> setFormatCode ('$ #, ## 0.00'); 이것이 일어나지 않았나요? – Ross

+0

아니요, 행 및 열 스타일을 사용할 수 없습니다. –

관련 문제