EPPlus - 닷넷으로 Excel 핸들링할 때

2017. 2. 28. 15:25Coders

EPPlus 는 닷넷으로 엑셀 자료를 핸들링 할 때 매우 편리하며, 가벼운 라이브러리 입니다.


EPPlus - Codeplex


이 라이브러리로,

DataTable을 고대로 스타일을 주면서(그라디에이션 등) 자료화 할 수 있으며, 각 셀 마다 배경색, 패턴(질감), 보더(Border:라인 굵기, 색상 등등) 등을 자유롭게 줄 수 있습니다. 수식도 쓸 수 있고요, 로우 추가 제거 기타 등등이 가능 합니다.


이걸 모르던 시절엔, 다음과 같은 두 가지 방식을 써 봤는데요,

  • Excel Interop (OCX 방식) : 무겁고, 뻑도 잘 나고, 코딩도 복잡함. 특히나 종료 및 GC를 잘 해주지 않으면 프로세스에 막 떠 있는 문제가 있는데다가, 가장 큰 문제는 오피스가 설치되어 있지 않으면 불가능.
  • OpenXML : 꽤 괜찮은 방식이긴 하나, xlsx 만 지원(xml 기반), xml을 잘 알아야 하며, 코딩이 복잡함


뭐 제가 평가한 내용에 이견이 있는 분들도 있을 수 있지만, 아무튼 제가 겪어본 바로는 그렇습니다. 사실 이 라이브러리를 접하기 전 까지는 OpenXML을 사용하고 어느정도 적응을 해 가고 있었기 때문에 누군가 추천했을 때 '에이 됐어' 했다가 써 보니 신세계 더군요.


이런 저런 소소한 기능들은 검색하면 나오니까 넘어 가고요.

최근 작업하면서 잘 안 되는 기능 때문에 열 받다가 해결된 점이 2 가지 있어 공유하고자 글 올립니다.




1. 기존 Excel 파일 열어 Background Color 를 변경했을 때, 기존 배경 색이 겹쳐 보이는 현상.


이미지 캡처가 있으면 좋으련만, 일단 말로 풀어 쓰면, 기존 셀의 배경색이 빨간색인데, 나는 노란색으로 칠하고 싶어 노란색을 칠했더니, 주황색으로 나타난다면? 이건 두 가지 색상이 겹쳐졌다고 볼 수 밖에 없겠지요.


참고로, 배경색을 칠하는 방식은 다음과 같습니다.(노란색으로 칠할 경우)


ExcelRange range = ...;

range.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;

range.Style.Fill.BackgroundColor.SetColor(Color.Yellow);

-- 주의할 점은, PatternType을 지정하지 않으면 SetColor에서 Exception 이 생기니 주의!


일반적으로 배경색이 없는 엑셀시트에서 이와 같이 칠하면, 노란색이 잘 발라집니다만, 해당 범위(range)의 기존 배경색에 다른 색상이 있을 때 간혹가다 두 가지 색상이 조합된 색상으로 바뀌게 됩니다. 이럴 때에는 (혹시나 해서 해 봤는데 겨우 찾은 거임) 다음과 같이 처리하면 됩니다.


ExcelRange range = ...;

range.Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;

range.Style.Fill.BackgroundColor.Tint = 0;

range.Style.Fill.BackgroundColor.SetColor(Color.Yellow);


이 부분은, 디버그로 하나하나 찍어 보니, 색상이 겹쳐지는 경우, 저 Tint 값에 0 보다 큰 값이 들어 있더군요. - 자세한 게 궁금하기도 했지만, 일이 급하여 일단 해결하고 통과.



2. Excel 에 수식이 사용되었을 경우, EPPlus를 통해 Save 한 파일을 차후 엑셀에서 열었을 때 변경된 사항이 있으니 저장하시오... 라는 메시지가 뜰 경우 입니다.



이 내용 또한 대충 찾아서 코딩하고, 검색해 보니 해결 내용이 스택오버플로우에도 있는데요, 안타깝게도 정답이 질문자에게 채택이 안 된 것 같습니다.

StackOverflow : Prompted to Save Changes on file created with EPPlus


단순합니다. 저장 전에 다음 한 줄을 넣어 주면 됩니다.

wb.FullCalcOnLoad = false; //wb는 EPPlus의 ExcelWorkbook

pkg.Save();   //pkg는 EPPlus의 ExcelPackage


해당 프로퍼티의 설명을 보면 다음과 같이 나와 있어요.

Should Excel do a full calculation after the workbook has been loaded? This property is always true for both new workbooks and loaded templates(on load). If this is not the wanted behavior set this property to false.

This property is always true for both new workbooks and loaded templates(on load). If this is not the wanted behavior set this property to false.

"저장한 엑셀이 열릴 때에 모든 계산식을 재 계산 할 거니? 이건 기본값으로 true인데, 재 계산을 원치 않으면 false로 세팅해." 라는 말이군요.



즐거운 코딩 생활 되시길.

(티스토리 글 작성할 때에 hr 삽입 기능이 있으면 좋겠네요. 본문의 가로선은 html 코드에서 넣었습니다.)

'Coders' 카테고리의 다른 글

한국 DNS 리스트  (0) 2017.03.06
Postgresql on Windows Server 2008 R2  (0) 2016.11.08
[C#] Get My Public IP  (0) 2016.09.06