반응형
C#에서 엑셀을 이용하여 DataGrid 항목에 읽고 쓰기를 하기 위한 기본적인 코드를 공유하고자 합니다.
DataGrid에서 엑셀을 읽고, 저장은 클립보드 방식으로 일괄 복사 후 저장하는 방식으로 셀단 위 저장보다 빠른 읽기/저장 속도를 느낄 수 있습니다.
Nuget 참조
누겟 참조 방법은 이전 포스트를 참고하여 사용하시기 바랍니다.
2021.11.09 - [프로그래밍/C Sharp] - [ C# ] 엑셀 파일 읽기
Nuget 참조후 using
1
2
3
|
using Excel = Microsoft.Office.Interop.Excel;
using ExcelDataReader;
using Microsoft.Office.Interop.Excel;
|
cs |
* 데이터 그리드 뷰의 헤더 칼럼 및 셀 내용을 기준으로 엑셀 읽기/ 저장 이 이루어집니다 *
엑셀 읽기 함수
- 데이터 그리드에 xls 또는 xlsx파일을 읽어옵니다.
- 첫 번째 시트가 읽기 대상입니다.(필요시 변경 또는 반복)
- DataSet으로 전환합니다.
- DataRow를 반복하며 Null 값이 아닌 경우 Grid에 뿌려 줍니다.
- 셀단 위로 읽은 것이 아니므로 데이터 읽는 속도가 빠릅니다.
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
|
void Import_Excel(DataGridView grid, string fileName = "")
{
if (File.Exists(fileName) == false)
{
using (OpenFileDialog ofd = new OpenFileDialog() { Filter = "Excel workbook|*.xlsx;*.xls", ValidateNames = true })
{
if (ofd.ShowDialog() == DialogResult.OK)
{
fileName = ofd.FileName;
}
else
{
return;
}
}
}
FileInfo fi = new FileInfo(fileName);
if ((fi.Extension == ".xls" | fi.Extension == ".xlsx") == false)
{
return;
}
FileStream fs = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
IExcelDataReader reader = ExcelReaderFactory.CreateReader(fs);
DataSet result = reader.AsDataSet();
reader.Close();
if (result == null)
{
return;
}
DataTable dt = result.Tables[0];
bool i = false;
foreach (DataRow row in dt.Rows)
{
if (!i)
{
i = true;
continue;
}
if (DBNull.Value.Equals(row.ItemArray[0]) == false)
{
grid.Rows.Add(row.ItemArray);
}
}
}
|
cs |
엑셀 저장 함수(클립보드 방식)
- 데이터 그리드에 xls 또는 xlsx파일 경로를 지정합니다.
- 클립보드에 데이터 그리드 뷰를 복사합니다.
- 클립보드의 데이터가 있는 경우 클립보드 내용을 저장합니다.
- 클립보드의 데이터가 없는 경우 헤더(첫행)를 저장하기 위해 셀단 위로 내용을 생성합니다.
- (공통) 메모리 해제를 위해 엑셀 오브젝트 제거합니다.
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
void Export_Excel(DataGridView grid, string fileName = "")
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.Filter = "Execl files (*.xls)|*.xls;*.xlsx";
saveFileDialog.FilterIndex = 0;
saveFileDialog.RestoreDirectory = true;
saveFileDialog.CreatePrompt = true;
saveFileDialog.Title = "Export Excel File";
saveFileDialog.ShowDialog();
if (saveFileDialog.FileName == "")
{
return;
}
string path = saveFileDialog.FileName;
//xls는 65536, xlsx는 1048575
grid.MultiSelect = true;
grid.RowHeadersVisible = false;
grid.AllowUserToAddRows = false;
grid.SelectAll();
grid.ClipboardCopyMode = DataGridViewClipboardCopyMode.EnableWithoutHeaderText;
DataObject dataObj = grid.GetClipboardContent();
if (dataObj != null)
{
Clipboard.SetDataObject(dataObj);
grid.ClearSelection();
Excel.Application xlexcel;
Excel.Workbook xlWorkBook;
Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet;
object misValue = Missing.Value;
xlexcel = new Excel.Application();
xlexcel.Visible = false;
xlWorkBook = xlexcel.Workbooks.Add(misValue);
xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
Excel.Range CR = (Excel.Range)xlWorkSheet.Cells[1, 1];
CR.Select();
xlWorkSheet.PasteSpecial(CR, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, true);
grid.MultiSelect = false;
if (path.Contains(".xlsx"))
{
xlWorkBook.SaveAs(path, Excel.XlFileFormat.xlWorkbookDefault, null, null, false, false,
Excel.XlSaveAsAccessMode.xlShared, false, false, null, null, null);
}
else
{
xlWorkBook.SaveAs(path, Excel.XlFileFormat.xlWorkbookNormal, null, null, false, false,
Excel.XlSaveAsAccessMode.xlShared, false, false, null, null, null);
}
grid.ClearSelection();
xlexcel.Quit();
ReleaseExcelObject(CR);
ReleaseExcelObject(xlWorkSheet);
ReleaseExcelObject(xlWorkBook);
ReleaseExcelObject(xlexcel);
}
else
{
Microsoft.Office.Interop.Excel.Application xlexcel = null;
Workbook xlWorkBook = null;
xlexcel = new Microsoft.Office.Interop.Excel.Application();
xlexcel.Visible = false;
//Workbook 생성
xlWorkBook = xlexcel.Workbooks.Add();
Worksheet xlWorkSheet = xlWorkBook.ActiveSheet;
for (int col = 0; col < grid.Columns.Count; col++)
{
Range cell = xlWorkSheet.Cells[1, col + 1];
cell.Value = grid.Columns[col].HeaderText;
}
for (int row = 0; row < grid.Rows.Count; row++)
{
for (int col = 0; col < grid.Columns.Count; col++)
{
Range cell = xlWorkSheet.Cells[row + 2, col + 1];
cell.Value = grid[col, row].Value == null ? "" : grid[col, row].Value.ToString();
//cell.Font.Color = dgvData[col, row].Style.BackColor;
//cell.Interior.Color = dgvData[col, row].Style.ForeColor;
}
}
if (path.Contains(".xlsx"))
{
xlWorkBook.SaveAs(path, Excel.XlFileFormat.xlWorkbookDefault, null, null, false, false,
Excel.XlSaveAsAccessMode.xlShared, false, false, null, null, null);
}
else
{
xlWorkBook.SaveAs(path, Excel.XlFileFormat.xlWorkbookNormal, null, null, false, false,
Excel.XlSaveAsAccessMode.xlShared, false, false, null, null, null);
}
xlexcel.Quit();
ReleaseExcelObject(xlWorkSheet);
ReleaseExcelObject(xlWorkBook);
ReleaseExcelObject(xlexcel);
}
MessageBox.Show("저장완료");
}
|
cs |
엑셀 오프젝트 제거
- 대상 오브젝트를 제거합니다.
- Null 값으로 변경합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
void ReleaseExcelObject(object obj)
{
try
{
if (obj != null)
{
Marshal.ReleaseComObject(obj);
obj = null;
}
}
catch (Exception ex)
{
obj = null;
throw ex;
}
finally
{
GC.Collect();
}
}
|
cs |
반응형
'프로그래밍 > C Sharp' 카테고리의 다른 글
[ WPF ] 데이터 바인딩(Binding) 사용하기 (0) | 2022.11.04 |
---|---|
[ C# ] ABB 로봇 PC 연동 #2 - SDK 사용하기(참조) (1) | 2022.11.03 |
[c#] Zedgraph 박스 그리기 (0) | 2022.02.04 |
[C#] 람다식과 델리게이트 , 이벤트 비교 (0) | 2022.01.19 |
[WPF] 프레임에서 페이지 전환 하기 (0) | 2022.01.13 |
댓글