이준빈은 호박머리

IT 프로그래밍 개발 정보 블로그, 이준빈은 호박머리 입니다.

Language/C#

C# DataGridView excel export 시 HRESULT: 0x800A03EC 에러

준콩이 2014. 1. 14. 20:23
반응형

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 형식으로 생성되는 것을 확인할 수 있습니다.



반응형