ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C#에서 엑셀파일 저장(쓰기)
    C# 2018. 3. 30. 11:30

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

     

     

     

    C#에서 엑셀 파일을 읽어오는 법에 대해 글을 썼었습니다. ([C#] - C#에서 엑셀파일 읽어오기)

     

    이번에는 C#에서 엑셀 파일을 저장하는 법, 쓰는 법에 대해 쓰려 합니다.

     

     

    저장하는 방법은 읽는 방법과 유사합니다.

     

    참조파일이 필요합니다.

     

    참조추가 -> 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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    private static void WriteExcelData()
    {
        Excel.Application excelApp = null;
        Excel.Workbook wb = null;
        Excel.Worksheet ws = null;
        try
        {
            excelApp = new Excel.Application();
     
            wb = excelApp.Workbooks.Open(ExcelPath);
            // 엑셀파일을 엽니다.
            // ExcelPath 대신 문자열도 가능합니다
            // 예. Open(@"D:\test\test.xlsx");
     
            ws = wb.Worksheets.get_Item(1) as Excel.Worksheet;
            // 첫번째 Worksheet를 선택합니다.
     
            Excel.Range rng = ws.Range[ws.Cells[1, 1], ws.Cells[row, column];
            // 해당 Worksheet에서 저장할 범위를 정합니다.
            // 지금은 저장할 행렬의 크기만큼 지정합니다.
            // 다른 예시 Excel.Range rng = ws.Range["B2", "G8"];
     
            object[,] data = new object[row, column];
            // 저장할 때 사용할 object 행렬
     
            for (int r = 0; r < row; r++)
            {
                for (int c = 0; c < column; c++)
                {
                    // data[r , c] = Data[r, c] 저장할 데이터
                }
            }
            // for문이 아니더라도 object[,] 형으로 저장된다면 저장이 가능합니다.
     
            rng.Value = data;
            // data를 불러온 엑셀파일에 적용시킵니다. 아직 완료 X
     
            if (path != null)
            // path는 새로 저장될 엑셀파일의 경로입니다.
            // 따로 지정해준다면, "다른이름으로 저장" 의 역할을 합니다.
            // 상대경로도 가능합니다. (예. "secondExcel.xlsx")
                wb.SaveCopyAs(path);
            else
            // 따로 저장하지 않는다면 지금 파일에 그대로 저장합니다.
                wb.Save();
     
            wb.Close();
            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
    private 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

     

     


     

     

     

     

     

    다음은 DataTable형의 DataTable 속성으로 데이터를 갖는 제가 사용한 프로그램의 저장 예시 입니다.

     

    더보기

     

     

    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
    48
    49
    50
    51
    52
    53
    54
    55
    private static void WriteExcelData()
    {
        Excel.Application excelApp = null;
        Excel.Workbook wb = null;
        Excel.Worksheet ws = null;
        try
        {
            excelApp = new Excel.Application();
            excelApp.DisplayAlerts = false;
     
            wb = excelApp.Workbooks.Open(ExcelPath);
     
            ws = wb.Worksheets.get_Item(1) as Excel.Worksheet;
     
            int row = DataTable.Rows.Count;
            int column = DataTable.Columns.Count;
     
            Excel.Range rng = ws.Range[ws.Cells[1, 1], ws.Cells[row + 1, column]];
     
            object[,] data = new object[row + 1, column];
     
            for (int i = 0; i < column; i++)
            {
                data[0, i] = DataTable.Columns[i].ColumnName;
            }
     
            for (int r = 0; r < row; r++)
            {
                for (int c = 0; c < column; c++)
                {
                    data[r + 1, c] = DataTable.Rows[r].ItemArray[c];
                }
            }
     
            rng.Value = data;
     
            if (path != null)
                wb.SaveCopyAs(path);
            else
                wb.Save();
     
            wb.Close();
            excelApp.Quit();
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            ReleaseExcelObject(ws);
            ReleaseExcelObject(wb);
            ReleaseExcelObject(excelApp);
        }
    }
    cs

     

     

     

    댓글

GiGong