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 |