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

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

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

    어떻게 수정해야 하는거죠?
  9. 김경민
    지금 해보니깐 헤더만 저장이됩니다. db연결된 데이터는 저장이되지를않네요.
    뭐좀다르게해야되나요?

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기