본문 바로가기

취미생활/C#

[C#] 엑셀 Cells 사용시 속도 문제 해결하기

반응형

안녕하세요.

 

코딩연습생입니다.

 

정말 오랜만에 글을 쓰는거 같습니다.. 회사 프로젝트 진행 때문에 시간을 너무 빼앗겨 버리네요ㅎㅎ

 

근데 저도 이제 블로거가 다 된거 같습니다 하루에도 몇번씩 포스팅 걱정을 하고 있는거 보면 약간 전문적인 사람이

 

된거 같은 느낌이 드네요ㅎㅎㅎ

 

저번 시간에 C#으로 엑셀 파일 내보내기 포스팅을 한적이 있는데요

 

https://codingman.tistory.com/100

 

[C#] 엑셀 템플릿파일 불러오기 및 값 넣기

안녕하세요 코딩 연습생입니다 아직도 코로나19로 인해서 기업들 소상인 분들 모두 참 어렵게 지내고 계시는거 같습니다 저 또한 회사원으로 회사가 많이 힘들어 지고 있다고 체감할 정도니깐요 그래도 국가에서..

codingman.tistory.com

 

해당 예제로 구현을 해보신 분들이라면 아마 똑같은 고민을 할거 같은데요

 

Excel.Worksheet.Cells[1,1] 형태로 for문을 돌려 값 쓰기를 진행하면 테스트 결과 100건 까지는 무난합니다

 

300건이 넘거가게 되면 정말 느려지게 되는데요

 

500건 내보내기 실행시 대략 5분까지도 소요가 되네요

 

그래서 검색을 통해 임시방편으로 빠르게 해결할 수 있는 방법을 알려드릴려고 합니다

 

포스팅 내용으 겹쳐서 해당 포스팅에서는 모든 SourceCode 보단 요약 코드로 설명을 하겠습니다

 

아래는 엑셀 템플릿파일 내보내기 코드 일부 입니다

 

                ExcelApp = new Excel.Application();
                wb = ExcelApp.Workbooks.Open(ExcelPath,
                                             0,
                                             true,
                                             5,
                                             "",
                                             "",
                                             true,
                                             Excel.XlPlatform.xlWindows,
                                             "\t",
                                             false,
                                             false,
                                             0,
                                             true,
                                             1,
                                             0);
                ws = wb.Worksheets["Sheet1"] as Excel.Worksheet;

 

이렇게 Sheet1을 불러오고 난 뒤에 Cells 값을 넣기 전에 아래 구문을 추가 합니다

 

ExcelApp.DisplayAlerts = false;
ExcelApp.Visible = false;
ExcelApp.ScreenUpdating = false;
ExcelApp.DisplayStatusBar = false;
ExcelApp.Calculation = Excel.XlCalculation.xlCalculationManual;
ExcelApp.EnableEvents = false;

 

코드 설명은 다음과 같습니다

 

  • 응용 프로그램. 스크린 업데이트

    화면 업데이트를 끕니다. Application.ScreenUpdating 이 False로 설정되어 있으면 Excel에서 화면을 다시 그리지 않습니다. 코드가 실행되는 동안 화면이 빠르게 업데이트되므로 일반적으로 사용자가 각 업데이트를 볼 필요는 없습니다. 코드가 실행 된 후 화면을 한 번 업데이트하면 성능이 향상됩니다.

  • Application.DisplayStatusBar

    상태 표시 줄을 끕니다. Application.DisplayStatusBar 가 False로 설정되어 있으면 Excel에 상태 표시 줄이 표시되지 않습니다. 상태 표시 줄 설정은 화면 업데이트 설정과 별개이므로 화면이 업데이트되지 않는 동안에도 현재 작업 상태를 계속 표시 할 수 있습니다. 그러나 모든 작업의 ​​상태를 표시 할 필요가없는 경우 코드 실행 중에 상태 표시 줄을 끄면 성능도 향상됩니다.

  • 신청. 계산

    수동 계산으로 전환하십시오. Application.Calculation  xlCalculationManual 로 설정되어 xlCalculationManual Excel은 사용자가 명시 적으로 계산을 시작할 때 통합 문서 만 계산합니다. 자동 계산 모드에서 Excel은 계산시기를 결정합니다. 예를 들어 수식과 관련된 셀 값이 변경 될 때마다 Excel은 수식을 다시 계산합니다. 계산 모드를 수동으로 전환하면 통합 문서를 다시 계산하기 전에 수식과 관련된 모든 셀이 업데이트 될 때까지 기다릴 수 있습니다. 코드가 실행되는 동안 필요할 때만 통합 문서를 다시 계산하면 성능을 향상시킬 수 있습니다.

  • Application.EnableEvents

    이벤트를 끕니다. Application.EnableEvents 가 False로 설정되어 있으면 Excel에서 이벤트가 발생하지 않습니다. Excel 이벤트를 수신하는 추가 기능이있는 경우 해당 추가 기능은 이벤트를 기록 할 때 컴퓨터의 리소스를 사용합니다. 추가 기능에서 코드 실행 중 발생하는 이벤트를 기록 할 필요가없는 경우 이벤트를 끄면 성능이 향상됩니다.

  • ActiveSheet.DisplayPageBreaks

    페이지 나누기를 끕니다. ActiveSheet.DisplayPageBreaks 가 False로 설정되어 있으면 Excel에 페이지 나누기가 표시되지 않습니다. 코드가 실행되는 동안 페이지 나누기를 다시 계산할 필요는 없으며 코드가 실행 된 후 페이지 나누기를 계산하면 성능이 향상됩니다.

이렇게 엑셀에 대한 자동 기능을 해제 해줌에 따라 파일생성 시간이 많이 단축됩니다

 

동일한 조건일 경우 500개 생성시 5분 이상이 소요 되었는데

 

이렇게 수정한뒤에 1분만에 생성이 완료되어 집니다

 

예제를 따라 수행하시던 분들을 한번 수정해서 속도 테스트를 해보시기 바랍니다~

반응형