將Excel文件數據導入到SqlServer數據庫的三種方案

最近在一個項目中須要用到Excel文件導入數據庫的功能,本人很懶,因此到網上搜了一堆方法,可是經過對比,以爲一下三種是比較好用或者不是很常見的方法,但願對你們有所幫助。c++

方案一: 經過OleDB方式獲取Excel文件的數據,而後經過DataSet中轉到SQL Server,這種方法的優勢是很是的靈活,能夠對Excel表中的各個單元格進行用戶所需的操做。sql

 

  1. openFileDialog = new OpenFileDialog();  
  2. openFileDialog.Filter = "Excel files(*.xls)|*.xls";  
  3.  
  4. if(openFileDialog.ShowDialog()==DialogResult.OK)  
  5. {  
  6.     FileInfo fileInfo = new FileInfo(openFileDialog.FileName);  
  7.     string filePath = fileInfo.FullName;  
  8.     string connExcel = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties=Excel 8.0";  
  9.       
  10.     try 
  11.     {  
  12.         OleDbConnection oleDbConnection = new OleDbConnection(connExcel);  
  13.         oleDbConnection.Open();  
  14.           
  15.         //獲取excel表  
  16.         DataTable dataTable = oleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);  
  17.  
  18.         //獲取sheet名,其中[0][1]...[N]: 按名稱排列的表單元素  
  19.         string tableName = dataTable.Rows[0][2].ToString().Trim();  
  20.         tableName = "[" + tableName.Replace("'","") + "]";  
  21.  
  22.         //利用SQL語句從Excel文件裏獲取數據  
  23.         //string query = "SELECT classDate,classPlace,classTeacher,classTitle,classID FROM " + tableName;  
  24.         string query = "SELECT 日期,開課城市,講師,課程名稱,持續時間 FROM " + tableName;  
  25.         dataSet = new DataSet();  
  26.  
  27.         //OleDbCommand oleCommand = new OleDbCommand(query, oleDbConnection);  
  28.         //OleDbDataAdapter oleAdapter = new OleDbDataAdapter(oleCommand);  
  29.         OleDbDataAdapter oleAdapter = new OleDbDataAdapter(query,connExcel);  
  30.         oleAdapter.Fill(dataSet,"gch_Class_Info");  
  31.         //從excel文件得到數據後,插入記錄到SQL Server的數據表
  32.         DataTable dataTable1 = new DataTable();  
  33.           
  34.         SqlDataAdapter sqlDA1 = new SqlDataAdapter(@"SELECT classID, classDate,  
  35. classPlace, classTeacher, classTitle, durativeDate FROM gch_Class_Info",sqlConnection1);  
  36.           
  37.         //SqlCommandBuilder sqlCB1 = new SqlCommandBuilder(sqlDA1);  
  38.           
  39.         sqlDA1.Fill(dataTable1);  
  40.  
  41.         foreach(DataRow dataRow in dataSet.Tables["gch_Class_Info"].Rows)  
  42.         {  
  43.             DataRow dataRow1 = dataTable1.NewRow();  
  44.               
  45.             dataRow1["classDate"] = dataRow["日期"];  
  46.             dataRow1["classPlace"] = dataRow["開課城市"];  
  47.             dataRow1["classTeacher"] = dataRow["講師"];  
  48.             dataRow1["classTitle"] = dataRow["課程名稱"];  
  49.             dataRow1["durativeDate"] = dataRow["持續時間"];  
  50.  
  51.             dataTable1.Rows.Add(dataRow1);  
  52.         }  
  53.  
  54.         Console.WriteLine("新插入 " + dataTable1.Rows.Count.ToString() + " 條記錄");  
  55.         sqlDA1.Update(dataTable1);  
  56.           
  57.         oleDbConnection.Close();  
  58.  
  59.     }  
  60.     catch(Exception ex)  
  61.     {  
  62.         Console.WriteLine(ex.ToString());  
  63.     }  
  64. }  

 

方案二: 直接經過SQL語句執行SQL Server的功能函數將Excel文件轉換到SQL Server數據庫。shell

 

OpenFileDialog openFileDialog = new OpenFileDialog();  數據庫

 

  1. openFileDialog.Filter = "Excel files(*.xls)|*.xls";  
  2.  
  3. SqlConnection sqlConnection1 = null;  
  4.  
  5. if(openFileDialog.ShowDialog()==DialogResult.OK)  
  6. {  
  7.     string filePath = openFileDialog.FileName;  
  8.  
  9.     sqlConnection1 = new SqlConnection();  
  10.     sqlConnection1.ConnectionString = "server=(local);integrated security=SSPI;initial catalog=Library";  
  11.  
  12.     //import excel into SQL Server 2000  
  13.     /*string importSQL = "SELECT * into live41 FROM OpenDataSource" + 
  14.         "('Microsoft.Jet.OLEDB.4.0','Data Source=" + "\"" + "E:\\022n.xls" + "\"" +   
  15.         "; User ID=;Password=; Extended properties=Excel 5.0')...[Sheet1$]";*/ 
  16.  
  17.     //export SQL Server 2000 into excel  
  18.     string exportSQL = @"EXEC master..xp_cmdshell  
  19. 'bcp Library.dbo.live41 out " + filePath + "-c -q -S" + "\"" + "\"" +  
  20.         " -U" + "\"" + "\"" + " -P" + "\"" + "\"" + "\'";  
  21.       
  22.     try 
  23.     {  
  24.         sqlConnection1.Open();  
  25.           
  26.         //SqlCommand sqlCommand1 = new SqlCommand();  
  27.         //sqlCommand1.Connection = sqlConnection1;  
  28.         //sqlCommand1.CommandText = importSQL;  
  29.         //sqlCommand1.ExecuteNonQuery();  
  30.         //MessageBox.Show("import finish!");  
  31.           
  32.         SqlCommand sqlCommand2 = new SqlCommand();  
  33.         sqlCommand2.Connection = sqlConnection1;  
  34.         sqlCommand2.CommandText = exportSQL;  
  35.         sqlCommand2.ExecuteNonQuery();  
  36.         MessageBox.Show("export finish!");  
  37.     }  
  38.     catch(Exception ex)  
  39.     {  
  40.         MessageBox.Show(ex.ToString());  
  41.     }  
  42. }  
  43.  
  44. if(sqlConnection1!=null)  
  45. {  
  46.     sqlConnection1.Close();  
  47.     sqlConnection1 = null;  
  48. }

方案三: 經過到入Excel的VBA dll,經過VBA接口獲取Excel數據到DataSetide

 

 

  1. OpenFileDialog openFile = new OpenFileDialog();  
  2. openFile.Filter = "Excel files(*.xls)|*.xls";  
  3.  
  4. ExcelIO excelio = new ExcelIO();  
  5.  
  6. if(openFile.ShowDialog()==DialogResult.OK)  
  7. {  
  8.     if(excelio!=null)  
  9.         excelio.Close();  
  10.  
  11.     excelio = new ExcelIO(openFile.FileName);  
  12.     object[,] range = excelio.GetRange();  
  13.     excelio.Close();  
  14.  
  15.       
  16.     DataSet ds = new DataSet("xlsRange");  
  17.  
  18.     int x = range.GetLength(0);  
  19.     int y = range.GetLength(1);  
  20.  
  21.     DataTable dt = new DataTable("xlsTable");  
  22.     DataRow dr;  
  23.     DataColumn dc;  
  24.       
  25.     ds.Tables.Add(dt);  
  26.  
  27.     for(int c=1; c<=y; c++)  
  28.     {  
  29.         dc = new DataColumn();  
  30.         dt.Columns.Add(dc);  
  31.     }  
  32.       
  33.     object[] temp = new object[y];  
  34.       
  35.     for(int i=1; i<=x; i++)  
  36.     {  
  37.         dr = dt.NewRow();  
  38.  
  39.         for(int j=1; j<=y; j++)  
  40.         {  
  41.             temp[j-1] = range[i,j];  
  42.         }  
  43.           
  44.         dr.ItemArray = temp;  
  45.         ds.Tables[0].Rows.Add(dr);  
  46.     }  
  47.  
  48.     dataGrid1.SetDataBinding(ds,"xlsTable");  
  49.       
  50.     if(excelio!=null)  
  51.         excelio.Close();  
  52. }  

  固然還有其餘一些方法,如遍歷Excel文件中的數據而後構造sql語句,直接利用sql操做Excel文件導入數據庫等,這些都是很常見的方法,所以就再也不作收錄了。最後說明下,以上的方法是我從網上找的源碼並作了必定的修改。函數

相關文章
相關標籤/搜索