xdebug로 Excel 생성 코드를 프로파일하고 그라인드 파일을 검토했습니다. 분명히 내 실행 시간의 대부분에 소요되는 :PHPExcel - 숫자 포맷 적용시 성능이 크게 저하됩니다.
setFormatCode(...)
그리고 잘못된 코드가 여기에 있습니다 :
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!
위대한 - 내 서식 지정 코드를 클래스 계층에서 약간 위로 이동하고 제안한 내용을 수행했습니다. 지금까지 훨씬 더 나은 작업 -이 모든 것을 사용하려면 "시트"를 업데이트해야합니다. 감사. 내 대답은 실제 코드와 함께 업데이트되었습니다. –
다음과 같이 구현할 계획된 기능을 떠올리게하는 것 같습니다. $ this-> objPHPExcel-> getActiveSheet() -> getStyle ($ columnIndex) -> getNumberFormat() -> setFormatCode ('$ #, ## 0.00'); 이것이 일어나지 않았나요? – Ross
아니요, 행 및 열 스타일을 사용할 수 없습니다. –