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; } } } }
소스 파일 :