C# DataGridView excel export 시 HRESULT: 0x800A03EC 와 같은 에러가 발생했을 경우 아래의 글을 참고하시기 바랍니다.
DataGridView에서 엑셀 저장 시 sheet의 컬럼명 생성 후 범위를 지정할 때 발생하는 이슈입니다.
Export 프로세스가 진행되면 일단 엑셀의 columns와 rows의 범위를 지정하는 부분이 있습니다.
아마 인터넷상에 돌아다니는 소스는 아래와 비슷할 것 같습니다.
for (int c = 0; c < DG.ColumnCount; c++) { headers[c] = DG.Rows[0].Cells[c].OwningColumn.HeaderText.ToString(); num = c + 65; columns[c] = Convert.ToString((char)num); }
위의 소스에서 columns[]에 sheet의 컬럼명(A, B, C D ~~~)이 저장되면
루프문에서 아래와 같은 형식으로 columns[]에서 저장된 값을 가져오는데 아래 부분에서 HRESULT: 0x800A03EC 에러가 발생할겁니다.
range = objSheet.get_Range(columns[c] + "1", Missing.Value);
catch문에서 Exception.StackTrace로 예외처리한 결과 아래와 같은 에러가 발생합니다.
에러 발생 원인은 컬럼이 A~Z까지만 있을 경우 문제가 없지만 Z를 넘어 AA, AB, AC...BA, BB, BC...등등 컬럼이 26개가 넘어갈 경우 Sheet의 컬럼명 지정이 잘못되어 에러가 발생합니다.
A~Z, AA~AZ, BA~BZ, CA~CZ 와 같은 형식으로 컬럼명을 생성해야합니다.
아래와 같은 식으로 구현하면 될 것 같습니다.
//엑셀 컬럼명 A~Z 보다 많을경우..AA AB AC..BA BB BC..붙여주기 public static String translateColumnIndexToName(int index) { int quotient = (index) / 26; if (quotient > 0) { return translateColumnIndexToName(quotient - 1) + (char)((index % 26) + 65); } else { return "" + (char)((index % 26) + 65); } }
먼저 위의 소스처럼 sheet의 column 이름을 생성하는 함수를 만듭니다.
그리고 제일 위에 있었던 반복문(for문 소스) 대신 아래의 소스를 사용합니다.
headers[c] = DG.Rows[0].Cells[c].OwningColumn.HeaderText.ToString(); int quotient = (c) / 26; if (quotient > 0) { columns[c] = Convert.ToString(translateColumnIndexToName(quotient - 1) + (char)((c % 26) + 65)); } else { columns[c] = Convert.ToString((char)((c % 26) + 65)); } Console.WriteLine(columns[c]);
콘솔창에 변경된 소스를 적용하여 column 명을 생성한 결과를 찍어보면 아래와 같습니다.
A~Z까지 생성 후 AA~AZ, BA~BZ 형식으로 생성되는 것을 확인할 수 있습니다.
'Language > C#' 카테고리의 다른 글
One or more types required to compile a dynamic expression cannot be found. Are you missing reference? (2) | 2014.04.22 |
---|---|
ASP.NET(C#) 오라클(Oracle) 연결 시 BadImageFormatException 에러 발생 (0) | 2013.09.16 |
C# 링큐(LINQ) 사용 예제 (0) | 2013.08.08 |
C# exe 파일(Release 버전) 생성 (6) | 2013.08.08 |
C# XML 파싱 예제(How to parse XML in C#) (2) | 2013.07.10 |
C# AES128/AES256 암호화 복호화(Rijndael) (1) | 2013.04.09 |
[C#] Microsoft.ACE.OLEDB.12.0' 공급자는 로컬 컴퓨터에 등록할 수 없습니다. (0) | 2013.03.23 |
ASP.NET 쿠키(cookie), ViewState 사용 방법 (1) | 2013.01.31 |
ASP.NET Page.IsPostBack (0) | 2013.01.31 |
ASP.NET 그리드뷰(GridView) (0) | 2013.01.30 |