[C#]DataGridView Data를 Excel 파일로 저장(Export)

C# 윈폼에서 DataGridView Data를 Excel 파일로 저장하는 소스를 알려 드리겠습니다. 순수하게 제가 만든건 아니고 여러 사이트에서 소스를 참조해서 제 상황에 맞게끔 응용을 했습니다.

제가 MS 오피스 2007 에 Visual Studio 2008 을 쓰기 때문에 이를 기준으로 소개를 하겠습니다.

먼저 솔루션 탐색기에서 참조추가를 합니다.

솔루션탐색기->참조추가->COM->Microsoft Excel 12.0 Object Libary 선택



이후 아래 소스를 적용하시면 됩니다.

using System.Reflection;
using Excel = Microsoft.Office.Interop.Excel;

private void ExportExcel(bool captions)
{
    this.saveFileDialog.FileName = "TempName";
    this.saveFileDialog1.DefaultExt = "xls";
    this.saveFileDialog1.Filter = "Excel files (*.xls)|*.xls";
    this.saveFileDialog1.InitialDirectory = "c:\\";

    DialogResult result = saveFileDialog.ShowDialog();

    if (result == DialogResult.OK)
    {
        int num = 0;
        object missingType = Type.Missing;

        Excel.Application objApp;
        Excel._Workbook objBook;
        Excel.Workbooks objBooks;
        Excel.Sheets objSheets;
        Excel._Worksheet objSheet;
        Excel.Range range;

        string[] headers = new string[dataGridView.ColumnCount];
        string[] columns = new string[dataGridView.ColumnCount];

        for (int c = 0; c < dataGridView.ColumnCount; c++)
        {
            headers[c]=dataGridView.Rows[0].Cells[c].OwningColumn.HeaderText.ToString();
            num = c + 65;
            columns[c] = Convert.ToString((char)num);
        }

        try
        {
            objApp = new Excel.Application();
            objBooks = objApp.Workbooks;
            objBook = objBooks.Add(Missing.Value);
            objSheets = objBook.Worksheets;
            objSheet = (Excel._Worksheet)objSheets.get_Item(1);

            if (captions)
            {
                for (int c = 0; c < dataGridView.ColumnCount; c++)
                {
                    range = objSheet.get_Range(columns[c] + "1", Missing.Value);
                    range.set_Value(Missing.Value, headers[c]);
                }
            }

            for (int i = 0; i < dataGridView.RowCount - 1; i++)
            {
                for (int j = 0; j < dataGridView.ColumnCount; j++)
                {
                    range = objSheet.get_Range(columns[j] + Convert.ToString(i + 2),
                                                           Missing.Value);

                    range.set_Value(Missing.Value,
                                          dataGridView.Rows[i].Cells[j].Value.ToString());

                }
            }

            objApp.Visible = false;
            objApp.UserControl = false;

            objBook.SaveAs(@saveFileDialog.FileName,
                      Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal,
                      missingType, missingType, missingType, missingType,
                      Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
                      missingType, missingType, missingType, missingType, missingType);
            objBook.Close(false, missingType, missingType);

            Cursor.Current = Cursors.Default;

            MessageBox.Show("Save Success!!!");
        }
        catch (Exception theException)
        {
            String errorMessage;
            errorMessage = "Error: ";
            errorMessage = String.Concat(errorMessage, theException.Message);
            errorMessage = String.Concat(errorMessage, " Line: ");
            errorMessage = String.Concat(errorMessage, theException.Source);

            MessageBox.Show(errorMessage, "Error");
        }
    }
}


신고

'프로그래밍' 카테고리의 다른 글

[C#]DataGridView Data를 Excel 파일로 저장(Export)  (18) 2010.01.14
[C#] Ping Test Code  (0) 2009.12.15
C# Content-Transfer-Encoding 설정 코드  (0) 2009.07.04
모바일 게임 개발  (17) 2009.04.14
Effective C# 정리  (0) 2009.04.08

댓글 18

  • BlogIcon ASH84 (2010.01.15 09:51 신고)

    쉽게 excel로 export 할수 있겠군요^^

  • kkyrin (2010.03.10 16:10 신고)

    완전 좋은 정보 감사합니다.
    이 것 때문에 삽질하고 있었는데.. 덕분에 너무 도움되었어요..
    (거의 그대로 가져다가 사용할 수 있네요.. 감사합니다.)

  • 김상현 (2010.08.10 19:30 신고)

    감사합니다 유용한 정보 감사합니다 ㅠ_ㅠ

  • 엑셀 읽기 (2010.08.23 12:14 신고)

    안녕하세요. 제가 찾는것과 유사해보여서 질문좀 드리려구요.
    웹서버에서 클라이언트 PC의 엑셀을 이용하여 엑셀파일을 읽어오는 방법을 찾고 있습니다.
    즉 웹서버에 엑셀 설치할 필요 없고, 웹브라우저로 접속한 사용자의 PC에 설치된 엑셀을 이용해 읽어야 합니다.
    이유는 엑셀파일이 문서보안 프로그램에 의해 인코딩되어 있어서 사용자 PC에서만 읽을 수 있거든요.

    위 예제는 쓰기지만 반대로 읽기도 가능할텐데요

    사용자 PC에 설치된 엑셀을 이용해 읽는건지, 아니면 엑셀 라이브러리 같은 걸 이용해서 읽는건지 궁금합니다.

    • BlogIcon MastmanBAN (2010.08.24 15:30 신고)

      vs2008에 있는 라이브러리를 이용하여 export 하는 것입니다.

  • 나그네 (2010.10.19 00:20 신고)

    죄송하지만 VB2008 과 MS-SQL 을 연동하는 경우 많이 달라지는지요..?

    • BlogIcon MastmanBAN (2010.10.19 09:24 신고)

      죄송하지만 무슨 말인지 제가 이해를 잘 못했습니다.
      좀더 자세히 설명을 해주시면 답변 드리도록 하겠습니다.

  • 김승현 (2010.11.10 11:32 신고)

    그럼 엑셀파일로 저장하기 위해 실행하는 버튼 같은 건 없나요?

    • BlogIcon MastmanBAN (2010.11.11 12:45 신고)

      버튼 생성하셔서 본문의 함수를 실행 하면 될거 같은데...
      제가 의도를 제대로 파악했는지 잘 모르겠네요. ㅜ.ㅜ

  • 엑셀추출_고맙습니다 (2013.04.11 14:07 신고)

    고맙습니다... 제가 필요로 하는 기능이었는데 도움이 많이 될 것 같군요.

  • 라일락 (2014.04.16 11:33 신고)

    saveFileDialog 가 뭘 의미하나요?

    어떻게 수정해야 하는거죠?

    • BlogIcon MastmanBAN (2014.04.16 13:25 신고)

      C# 디자인 부분에 보시면 saveFileDialog 가 있습니다.
      끌어다 놓으면 되겠죠. ^^

  • 김경민 (2014.08.14 15:34 신고)

    지금 해보니깐 헤더만 저장이됩니다. db연결된 데이터는 저장이되지를않네요.
    뭐좀다르게해야되나요?

    • BlogIcon MastmanBAN (2014.08.14 15:50 신고)

      저 소스는 DataGridView 에 표시된 데이터만 Excel 파일로 만들어 줍니다.
      DB 연결과는 아무런 상관이 없습니다.

티스토리 툴바