[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)  (22) 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
  1. 쉽게 excel로 export 할수 있겠군요^^
  2. kkyrin
    완전 좋은 정보 감사합니다.
    이 것 때문에 삽질하고 있었는데.. 덕분에 너무 도움되었어요..
    (거의 그대로 가져다가 사용할 수 있네요.. 감사합니다.)
  3. 김상현
    감사합니다 유용한 정보 감사합니다 ㅠ_ㅠ
  4. 엑셀 읽기
    안녕하세요. 제가 찾는것과 유사해보여서 질문좀 드리려구요.
    웹서버에서 클라이언트 PC의 엑셀을 이용하여 엑셀파일을 읽어오는 방법을 찾고 있습니다.
    즉 웹서버에 엑셀 설치할 필요 없고, 웹브라우저로 접속한 사용자의 PC에 설치된 엑셀을 이용해 읽어야 합니다.
    이유는 엑셀파일이 문서보안 프로그램에 의해 인코딩되어 있어서 사용자 PC에서만 읽을 수 있거든요.

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

    사용자 PC에 설치된 엑셀을 이용해 읽는건지, 아니면 엑셀 라이브러리 같은 걸 이용해서 읽는건지 궁금합니다.
  5. 나그네
    죄송하지만 VB2008 과 MS-SQL 을 연동하는 경우 많이 달라지는지요..?
  6. 김승현
    그럼 엑셀파일로 저장하기 위해 실행하는 버튼 같은 건 없나요?
  7. 엑셀추출_고맙습니다
    고맙습니다... 제가 필요로 하는 기능이었는데 도움이 많이 될 것 같군요.
  8. 라일락
    saveFileDialog 가 뭘 의미하나요?

    어떻게 수정해야 하는거죠?
  9. 김경민
    지금 해보니깐 헤더만 저장이됩니다. db연결된 데이터는 저장이되지를않네요.
    뭐좀다르게해야되나요?
  10. 밍님
    우아 진자 그대로 가져다가 썼는데 되네요...너무감사합니다!! 제가 찾던 소스입니다!!!
  11. 만학도
    9년전 글에 답글을 달아서 보실지 모르겠네요, MS 2017, EXCEL 2010을 쓰고있습니다
    Excel.(eqals , reperenceqals) 두가지만 사용이 가능하네요 MS 2017에서는 다를 방법을 찾아봐야하겠죠?

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기