批量从Execl把数据导入到sql中 效率挺高
根据下面的这个方法就可以得到表格中的数据信息。(有时候得不到有的单元格,看是不是因为表格中一个列中存在两个数据格式)
1 #region 得到数据集,根据Execl路径 2 /// <summary> 3 /// 得到数据集,根据Execl路径 4 /// </summary> 5 /// <param name="ExeclPath">表格的路径</param> 6 /// <param name="ds">返回的数据集</param> 7 /// <returns>是否成功</returns> 8 private bool GetDataSetByExeclPath(string ExeclPath, out DataSet ds) 9 { 10 bool isOK = true; 11 ds = new DataSet(); 12 Application.DoEvents(); 13 try 14 { 15 string fileExt = System.IO.Path.GetExtension(ExeclPath); 16 string mystring; 17 if (fileExt.ToLower() == ".xls")//判断表的格式 18 { 19 mystring = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + ExeclPath + ";Extended Properties=\"Excel 8.0;HDR=YES;IMEX=1\""; 20 } 21 else 22 { 23 mystring = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + ExeclPath + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\""; 24 } 25 26 System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(mystring);//创建连接 27 conn.Open(); 28 29 DataTable dtDATAExcel = new System.Data.DataTable(); 30 DataTable dtDATA = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, null);//得到所有表的信息 31 string table = ""; 32 for (int i = 0; i < dtDATA.Rows.Count; i++)//循环所有表 33 { 34 try 35 { 36 DataTable dt = new DataTable(); 37 table = dtDATA.Rows[i][2].ToString().Trim();//得到表名 38 System.Data.OleDb.OleDbDataAdapter objadp = new System.Data.OleDb.OleDbDataAdapter("select * from [" + table + "]", conn); 39 objadp.Fill(dt);//得到表格 40 if (dt.Rows.Count > 0) 41 { 42 ds.Tables.Add(dt); 43 } 44 } 45 catch 46 { 47 } 48 } 49 conn.Close();//关闭连接 50 } 51 catch 52 { 53 isOK = false; 54 } 55 return isOK; 56 } 57 #endregion
这个是这个方法的调用:
1 /// <summary> 2 /// 导入表格 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 private void btnExecl_Click(object sender, EventArgs e) 7 { 8 ofdExcel.FileName = ""; 9 if (ofdExcel.ShowDialog() == DialogResult.OK) 10 { 11 DataSet ds = new DataSet(); 12 if (GetDataSetByExeclPath(ofdExcel.FileName, out ds)) 13 { 14 MessageBox.Show(ds.Tables.Count.ToString()); 15 } 16 } 17 }
然后可以把经过处理的数据导入到sqlserver数据库:有时候会暴无效的列长度,可能是列 的长度超过了数据库定义的长度,在处理数据的时候要截取
1 #region 批量插入SQL表+ public int bulk_ins_table(DataTable _dt, string _tablename) 2 /// <summary> 3 /// 批量插入SQL表 4 /// 其中_dt的结构必须与_tablename指定的表结构完全一致 5 /// </summary> 6 /// <param name="_dt"></param> 7 /// <param name="_tablename"></param> 8 /// <returns></returns> 9 public bool bulk_ins_table(DataTable _dt, string _tablename) 10 { 11 bool isOK = true; 12 try 13 { 14 System.Data.SqlClient.SqlBulkCopy sqlbulkcopy = new System.Data.SqlClient.SqlBulkCopy("这是连接字符串", System.Data.SqlClient.SqlBulkCopyOptions.UseInternalTransaction); 15 sqlbulkcopy.DestinationTableName = _tablename;//数据库中的表名 16 sqlbulkcopy.WriteToServer(_dt); 17 } 18 catch //(Exception e) 19 { 20 //throw e; 21 isOK = false; 22 } 23 return isOK; 24 } 25 26 #endregion