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