본문 바로가기
소소한 C# 지식

[c#/WINFORM] - Datagridview Excel Export (엑셀 내보내기)

by 해뤼맘 2022. 4. 18.
728x90
반응형

안녕하세요

프로그램에서 Datagridview의 데이터를

엑셀로 내보내기 기능을 많이 사용하여 공통 클래스를 생성 후

호출하여 사용할 수 있도록 코드 정리해 보았습니다.

 

1. Nuget 패키지 설치

  • Microsoft.office.Interop.Exel 을 검색하여 설치

nuget 패키지 설치
Microsoft.office.Interop.Exel 설치

 

2. Exel Export 클래스 생성

  • using Excel = Microsoft.Office.Interop.Excel; (using 선언 필요)
  public class ExcelExport
    {
        //using System.Runtime.InteropServices; 
        [DllImport("user32.dll", SetLastError = true)]
        static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
        [DllImport("user32.dll", SetLastError = true)]
        static extern bool CloseClipboard();

        [DllImport("user32.dll", SetLastError = true)]
        static extern bool OpenClipboard(IntPtr hWndNewOwner);



        public static void Datagridview_ExcelExport(string fileName, DataGridView dgv, string stitle)
        {
            try
            {
                SaveFileDialog sfd = new SaveFileDialog();
                sfd.Title = "Save as Excel File";
                //엑셀 문서 형식
                sfd.Filter = "Excel Documents (*xls)|*.xls";
                sfd.FileName = fileName + ".xls";

                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    dgv.MultiSelect = true;

                    dgv.SelectAll();

                    DataObject dataobj = dgv.GetClipboardContent();

                    if (dataobj != null)
                    {
                        Clipboard.SetDataObject(dataobj);
                    }

                   // using Excel = Microsoft.Office.Interop.Excel;
                    object misValue = System.Reflection.Missing.Value;
                    Excel.Application xlexcel = new Excel.Application();

                    xlexcel.DisplayAlerts = false;
                    Excel.Workbook xlworkbook = xlexcel.Workbooks.Add(misValue);
                    Excel.Worksheet xlworksheet = (Excel.Worksheet)xlworkbook.Worksheets.get_Item(1);

                    try
                    {
                        Excel.Range rng = xlworksheet.get_Range("A:AZ").Cells;
                        rng.NumberFormat = "@";
                        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);
                        xlworkbook.SaveAs(sfd.FileName, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive
                            , misValue, misValue, misValue, misValue, misValue);
                        xlexcel.DisplayAlerts = true;
                        xlworkbook.Close(true, misValue, misValue);

                        //파일닫기
                        uint processId = 0;
                        GetWindowThreadProcessId(new IntPtr(xlexcel.Hwnd), out processId);
                        xlexcel.Quit();
                        if (processId != 0)
                        {
                            System.Diagnostics.Process excelProcess = System.Diagnostics.Process.GetProcessById((int)processId);
                            excelProcess.CloseMainWindow();
                            excelProcess.Refresh();
                            excelProcess.Kill();
                        }

                        dgv.MultiSelect = false;

                        MessageBox.Show("엑셀 파일 생성이 완료되었습니다.");

                    }
                    catch (Exception ex)
                    {

                        MessageBox.Show(ex.ToString());
                        xlworkbook.Close();
                        uint processId = 0;
                        GetWindowThreadProcessId(new IntPtr(xlexcel.Hwnd), out processId);
                        xlexcel.Quit();
                        if (processId != 0)
                        {
                            System.Diagnostics.Process excelProcess = System.Diagnostics.Process.GetProcessById((int)processId);
                            excelProcess.CloseMainWindow();
                            excelProcess.Refresh();
                            excelProcess.Kill();
                        }

                    }

                }
            }
            catch (Exception e)
            {
                MessageBox.Show("엑셀이 설치된 PC에서만 출력이 가능합니다.");
            }

        }


    }

 

3. 엑셀 내보내기(exel Export) 메서드 호출

  • 데이터 그리드 뷰에 데이터가 있을 경우에만 엑셀 내보내기
  • Datagridview_ExcelExport(string fileName, DataGridView dgv, string stitle) 변수 순서로 입력
 private void button1_Click(object sender, EventArgs e)
        {
            if (dgvprojectstate.Rows.Count > 0)
            {
                //엑셀 내보내기
                ExcelExport.Datagridview_ExcelExport("프로젝트 진행현황", dgvprojectstate, "프로젝트 진행 현황");
            }
        }

4. Exel Export(엑셀 내보내기) 결과

  • 엑셀 내보내기 버튼을 클릭
  • 저장하려는 파일의 위치 선택
  • 파일이름은 코드에 정의한 이름으로 표시(원하면 변경 가능)

엑셀 내보내기 결과
Exel Export Example
엑셀 내보내기 저장
Exel Export Save
엑셀 내보내기 결과
Exel Export

 

이상 C# Exel Export(엑셀 내보내기) 기능이었습니다.

다음은 C# Exel Import(엑셀 불러오기) 기능에 대하여 포스팅하겠습니다.

728x90
반응형

댓글