批量从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

 

posted @ 2012-12-20 11:06  下-个路口  阅读(345)  评论(0编辑  收藏  举报