ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C#에서 엑셀파일 읽어오기(불러오기)
    C# 2016. 4. 13. 01:13

    ※ 블로그를 이전하며 해당 내용을 개선하여 포스팅했습니다. (링크)

     

     

    C#을 사용한 프로그램에서 엑셀파일을 읽어와 Data로 사용해야 할 경우가 있습니다.

     

    먼저 참조파일이 필요합니다.

     

    참조추가 -> COM -> Microsoft Excel 16.0 Object Library       (여기서 16.0은 Excel의 버전입니다.)

    (예. Microsoft Excel 13.0 Object....  등등)

     

    상단에 using 구문을 추가해야 합니다.

     

    using System.Runtime.InteropServices;

     

    using Excel = Microsoft.Office.Interop.Excel;

     

     

    먼저 엑셀파일에 접근해서 Data를 가져오는 함수입니다.

     

     

     


     

     

     

     

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    public void ReadExcelData(string path)
    // path는 Excel파일의 전체 경로입니다.
      // 예. D:\test\test.xslx
        Excel.Application excelApp = null;
        Excel.Workbook wb = null;
        Excel.Worksheet ws = null;
        try
        {
            excelApp = new Excel.Application();
            wb = excelApp.Workbooks.Open(path);
            // path 대신 문자열도 가능합니다
            // 예. Open(@"D:\test\test.xslx");
            ws = wb.Worksheets.get_Item(1as Excel.Worksheet;
            // 첫번째 Worksheet를 선택합니다.
            Excel.Range rng = ws.UsedRange;   // '여기'
            // 현재 Worksheet에서 사용된 셀 전체를 선택합니다.
            object[,] data = rng.Value;
            // 열들에 들어있는 Data를 배열 (One-based array)로 받아옵니다.
            for (int r = 1, i = 0; r <= data.GetLength(0); r++)
            {
                for (int c = 1; c <= data.GetLength(1); c++)
                {
                    if (data[r, c] == null)
                    {
                        continue;
                    }
                    // Data 빼오기
                    // data[r, c] 는 excel의 (r, c) 셀 입니다.
                    // data.GetLength(0)은 엑셀에서 사용되는 행의 수를 가져오는 것이고,
                    // data.GetLength(1)은 엑셀에서 사용되는 열의 수를 가져오는 것입니다.
                    // GetLength와 [ r, c] 의 순서를 바꿔서 사용할 수 있습니다.
                }
            }
            wb.Close(true);
            excelApp.Quit();
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            ReleaseExcelObject(ws);
            ReleaseExcelObject(wb);
            ReleaseExcelObject(excelApp);
        }
    }
    cs

     

     


     

     

     

    여기서 사용하는 Excel 데이터를 Release해주는 함수입니다.

     

     

     


     

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    static void ReleaseExcelObject(object obj)
    {
        try
        {
            if (obj != null)
            {
                Marshal.ReleaseComObject(obj);
                obj = null;
            }
        }
        catch (Exception ex)
        {
            obj = null;
            throw ex;
        }
        finally
        {
            GC.Collect();
        }
    }
    cs

     

     

     


     

     

     

    ※ 참고

    엑셀에서 한번이라도 수정을 했었던 셀은 사용된 것으로 인식이 되어 

    data 배열에 입력됩니다.

     

    따라서 null을 따로 처리해주어야 합니다.

     

    엑셀 워크시트 전체가 아닌 일부 필요한 영역만 선택하고 싶은 경우

     

    ReadExcelData 함수의 15번째줄의 '여기' 부분을

     

    Excel.Range rng = ws.Range[ws.Cells[시작 행, 시작 열], ws.Cells[끝 행, 끝 열]];

     

    로 바꾸어 주시면 됩니다.

     

    ---------------------내용 추가----------------------------

     

    Excel.Range rng = ws.Range["A2","D9"]; 와 같이

     

    해당 셀의 주소값을 바로 넣어주어도 됩니다.

     

    또는 ws.Range["B4"]; 와 같이 한 칸 만 설정할 수 있습니다.

     

     

    ※ 참고

    셀 서식에서 숫자 형식으로 바꿀 경우 data는 double형이 되며, 

    기본적으로 입력되는 것들은 string형이 됩니다. (예. 기본 문자열, 핸드폰 번호 등)

     

     

     

     

    ps.엑셀파일 저장하기에 관해서도 글을 쓰게 되었습니다.

    [C#] - C#에서 엑셀파일 저장(쓰기)

     

    댓글

GiGong