블로그 이미지
따시쿵

calendar

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

Notice

2015. 7. 14. 16:49 C# with Excel

엑셀 데이타를 프로그램에서 읽어 들여서 datagridview 에 보이는 예제입니다.

최종 화면부터 확인하겠습니다.

 

 

1. 필요한 네임스페이스 포함 시킵니다.

 

using System.IO;
using System.Data;
using System.Data.OleDb;

 

2. 엑셀 파일 연결을 위한 connection string 을 만듭니다.

 

엑셀 버전이 97-2003 과 2007 ( 더 높은 버전) 은 다른 커넥션 스트링을 사용하는데, 전자는 Microsoft Jet Engine 을 사용하고, 후자는 Microsoft Ace Engine 을 사용합니다. 

 

그래서 다음과 같이 두 개의 커넥션 스트링을 만들어서 파일 버전에 따라서 연결 스트링을 다르게 사용합니다.

 

private string Excel03ConString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties='Excel 8.0;HDR={1}'";
private string Excel07ConString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR={1}'";

 

3. 엑셀 파일을 선택하기 위해서 openFileDialog control 을 추가하고 click 이벤트에 파일 선택창을 띄웁니다.
        private void btnSelect_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();
        }

 

4. 엑셀 데이타를 datagridview 에 보이게 합니다.

 

엑셀 파일이 선택 되자마자 1. 엑셀 파일의 전체 path 를 포함하는 파일 이름을 가져오고 2. 파일 이름에서 확장자를 따로 떼어서 구번전인지 신버전인지를 체크 합니다. 그리고 파일 버전에 맞게 연결 스트링을 선택합니다.

 

datagridview 에 헤더를 포함할지 말지를 선택하는 구분이 있습니다.

 

엑셀의 첫번째 파일 쉬트으 이름을 알아내고, 쉬트 데이타를 DataTable 에 저장하고 이것을 DataGridView Control 에 최종적으로 보이게 합니다.

 

        private void openFileDialog1_FileOk(object sender, CancelEventArgs e)
        {
            string filePath = openFileDialog1.FileName;
            string fileExtension = Path.GetExtension(filePath);
            string header = rbHeaderYes.Checked ? "Yes" : "No";
            string connectionString = string.Empty;
            string sheetName = string.Empty;

            // 확장자로 구분하여 커넥션 스트링을 가져옮
            switch(fileExtension)
            {
                case ".xls":    //Excel 97-03
                    connectionString = string.Format(Excel03ConString, filePath, header);
                    break;
                case ".xlsx":  //Excel 07
                    connectionString = string.Format(Excel07ConString, filePath, header);
                    break;
            }

            // 첫 번째 시트의 이름을 가져옮
            using (OleDbConnection con = new OleDbConnection(connectionString))
            {
                using (OleDbCommand cmd = new OleDbCommand())
                {
                    cmd.Connection = con;
                    con.Open();
                    DataTable dtExcelSchema = con.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                    sheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();
                    con.Close();
                }
            }
            Console.WriteLine("sheetName = " + sheetName);

            // 첫 번째 쉬트의 데이타를 읽어서 datagridview 에 보이게 함.
            using (OleDbConnection con = new OleDbConnection(connectionString))
            {
                using (OleDbCommand cmd = new OleDbCommand())
                {
                    using (OleDbDataAdapter oda = new OleDbDataAdapter())
                    {
                        DataTable dt = new DataTable();
                        cmd.CommandText = "SELECT * From [" + sheetName + "]";
                        cmd.Connection = con;
                        con.Open();
                        oda.SelectCommand = cmd;
                        oda.Fill(dt);
                        con.Close();

                        //Populate DataGridView.
                        dataGridView1.DataSource = dt;
                    }
                }
            }
        }

 

소스 파일 :

MyExcel1.zip

 

posted by 따시쿵