ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C# 엑셀파일 가져오기 using Microsoft.Office.Interop.Excel (DataGrdiVeiw에 바인딩 포함)
    닷넷/WinForms 2018. 1. 10. 13:21
    반응형

    2017/05/22 - [프로그래밍/C#] - C# 엑셀파일 가져오기 using OleDb

    이전 글에서는 OleDb를 이용해 엑셀파일을 불러왔다면

    이번 글은 엑셀 라이브러리를 이용해 엑셀파일을 불러 오는 방법이다.


    먼저 엑셀 라이브러리를 추가한다.


    1) 참조에서 오른쪽 마우스클릭 -> 참조 추가 클릭



    2) 어셈블리에서 확장에 보면 Microsoft.Office.Interop.Excel 이 있다.

    버전 별로 여러 개가 있다면 그 중에 하나만 선택 하고 확인을 눌러 추가해준다.

    없다면 엑셀이 설치되어 있지 않은 것이다. 엑셀을 설치하거나 dll 파일을 구한다.



    3) 소스 파일에 using Microsoft.Office.Interop.Excel; 를 입력한다.



    4) 그러나 System에 선언되어 있는 클래스나 메소드와 똑같은 이름들을 가지고 있는 것들이 있어서 모호한 참조 오류가 발생한다.



    5) 따라서 나중에 엑셀파일을 불러올 때 Microsoft.Office.Interop.Excel을 참조하는 걸 알리기 위해 

    짧은 이름으로 지정할 변수 이름을 추가 입력한다.





    6) 코드

    // 이 코드에는 엑셀파일에서 불러온 데이터를 데이터그리드뷰(DataGridView)에 바인딩하는 것도 포함되어 있다.
     
    private void btnOpenExcel_Click(object sender, EventArgs e)
    {
        // 엑셀 변수 선언
        Excel.Application xlApp = null;
        Excel.Workbook xlWorkbook = null;
        Excel.Worksheet xlWorksheet = null;
     
        // 파일 선택
        OpenFileDialog ofd = new OpenFileDialog();
        ofd.Filter = "Excel File (*.xlsx)|*.xlsx|Excel File 97~2003 (*.xls)|*.xls|All Files (*.*)|*.*";
     
        if (ofd.ShowDialog() == DialogResult.OK)
        {
            try
            {
                // 데이터그리드뷰 클리어
                dgvList.Columns.Clear();
     
                // 엑셀데이터를 담을 데이터테이블 선언
                DataTable dt = new DataTable(); 
     
                 // 엑셀 변수들 초기화   
                xlApp = new Excel.Application();
                xlWorkbook = xlApp.Workbooks.Open(ofd.FileName);
                xlWorksheet = (Excel.Worksheet)xlWorkbook.Worksheets.get_Item(1); // 첫 번째 시트
     
                // 시트에서 범위 설정
                // UsedRange는 사용된 셀 모두이므로 
                // 범위를 따로 지정하려면 
                // xlWorksheet.Range[xlWorksheet.Cells[시작 행, 시작 열], xlWorksheet.Cells[끝 행, 끝 열]]
                Excel.Range range = xlWorksheet.UsedRange;
                
                // 2차원 배열에 담기
                object[,] data = range.Value;
     
                // 데이터테이블에 엑셀 칼럼만큼 칼럼 추가
                for (int i=1; i<=range.Columns.Count; i++)
                {
                    dt.Columns.Add(i.ToString(), typeof(string));                        
                }
     
                // 데이터테이블에 2차원 배열에 담은 엑셀데이터 추가
                for (int r = 1; r < range.Rows.Count; r++)
                {
                    DataRow dr = dt.Rows.Add();
     
                    for (int c = 1; c < range.Columns.Count; c++)
                    {
                        dr[c-1] = data[r, c];
                    }
                }
     
                xlWorkbook.Close(true);
                xlApp.Quit();
                
                // 데이터그리드뷰에 데이터테이블 바인딩
                dgvList.DataSource = dt;
     
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                
                // 사용이 끝난 엑셀파일 Release
                ReleaseExcelObject(xlWorksheet);
                ReleaseExcelObject(xlWorkbook);
                ReleaseExcelObject(xlApp);
            }
        }
    }
     
     
    private void ReleaseExcelObject(object obj)
    {
        try
        {
            if (obj != null)
            {
                Marshal.ReleaseComObject(obj);
                obj = null;
            }
        }
        catch (Exception ex)
        {
            obj = null;
            throw ex;
        }
        finally
        {
            GC.Collect();
        }
    }
    cs


    반응형

    댓글

Designed by Tistory.