본문 바로가기
프로그래밍/C Sharp

[ C# ] 데이터 그리드 엑셀로 읽고 쓰기(고속 방식)

by jeong-f 2022. 11. 2.
반응형

C#에서 엑셀을 이용하여 DataGrid 항목에 읽고 쓰기를 하기 위한 기본적인 코드를 공유하고자 합니다.
DataGrid에서 엑셀을 읽고, 저장은 클립보드 방식으로 일괄 복사 후 저장하는 방식으로 셀단 위 저장보다 빠른 읽기/저장 속도를 느낄 수 있습니다.

Nuget 참조

누겟 참조 방법은 이전 포스트를 참고하여 사용하시기 바랍니다.

2021.11.09 - [프로그래밍/C Sharp] - [ C# ] 엑셀 파일 읽기

 

[ C# ] 엑셀파일 읽기

프로그램에서 엑셀 파일을 직접적으로 읽어서 화면에 뿌려주어야 할 경우가 있습니다. 엑셀을 읽고 쓰기 위한 패키지인 Microsoft.Office.Interp.Excel 이용한 연동 방법을 설명하고자 합니다. Microsoft.Of

jeong-f.tistory.com

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[11];
        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, nullnullfalsefalse,
            Excel.XlSaveAsAccessMode.xlShared, falsefalsenullnullnull);
        }
        else
        {
            xlWorkBook.SaveAs(path, Excel.XlFileFormat.xlWorkbookNormal, nullnullfalsefalse,
            Excel.XlSaveAsAccessMode.xlShared, falsefalsenullnullnull);
        }
        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, nullnullfalsefalse,
            Excel.XlSaveAsAccessMode.xlShared, falsefalsenullnullnull);
        }
        else
        {
            xlWorkBook.SaveAs(path, Excel.XlFileFormat.xlWorkbookNormal, nullnullfalsefalse,
            Excel.XlSaveAsAccessMode.xlShared, falsefalsenullnullnull);
        }
        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

 

반응형

댓글