C#数据库数据导入导出系列之一 ASP.NET Excel导入Sql Server数据库
在日常的项目中,Excel,Word,txt等格式的数据导入到数据库中是很常见的,我在这里做一下总结
这里将分为Asp.net导入Sql Server,Oracle数据库和WinForm导入Sql Server,Oracle数据库。
(注意 这里四篇文章只是基础的方法,若有更高的要求,可以参考
http://www.cnblogs.com/atao/archive/2009/11/15/1603528.html
http://www.cnblogs.com/tonyqus/category/182110.html
http://www.yongfa365.com/Item/NPOI-MyXls-DataTable-To-Excel-From-Excel.html
.net 通过NPOI或MyXls把DataTable导出到Excel)
先看界面图
实现的基本思想:
1,先使用FileUpload控件fuload将Excel文件上传到服务器上得某一个文件夹。
2,使用OleDb将已经上传到服务器上的Excel文件读出来,这里将Excel文件当做一个数据库来读。在联系数据库语句中,Data Source就是该文件在服务器上得物理路径
3,将第二步中读出的数据以DataTable对象返回。
4,遍历DataTable对象,然后到Sql Server数据库中查询,是否存在该条数据。如果存在,可以做更新,或者不做处理;如果不存在,则插入数据。
注意:在遍历DataTable的时候,可是使用dt.Rows[i]["Name"].ToString();Name为Name列的表头,所以Excel中列的顺序就无关紧要了。当然,前提是你知道Excel里列中各表头的名字。如果Excel中列的顺序固定,即可按下面代码中的方式进行。
添加的引用:
1 01.using System; 2 02.using System.Data; 3 03.using System.Data.OleDb; 4 04.using System.Data.SqlClient; 5 05.using System.IO; 6 06.using System.Text; 7 07.using System.Web; 8 08.using System.Web.UI;
1 private DataTable xsldata() 2 { 3 if(fuload.FileName == "") 4 { 5 lbmsg.Text = "请选择文件"; 6 return null; 7 } 8 string fileExtenSion; 9 fileExtenSion = Path.GetExtension(fuload.FileName); 10 if(fileExtenSion.ToLower() != ".xls" && fileExtenSion.ToLower() != ".xlsx") 11 { 12 lbmsg.Text = "上传的文件格式不正确"; 13 return null; 14 } 15 try 16 { 17 string FileName = "App_Data/" + Path.GetFileName(fuload.FileName); 18 if(File.Exists(Server.MapPath(FileName))) 19 { 20 File.Delete(Server.MapPath(FileName)); 21 } 22 fuload.SaveAs(Server.MapPath(FileName)); 23 //HDR=Yes,这代表第一行是标题,不做为数据使用 ,如果用HDR=NO,则表示第一行不是标题,做为数据来使用。系统默认的是YES 24 string connstr2003 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath(FileName) + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'"; 25 string connstr2007 = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Server.MapPath(FileName) + ";Extended Properties=\"Excel 12.0;HDR=YES\""; 26 OleDbConnection conn; 27 if(fileExtenSion.ToLower() == ".xls") 28 { 29 conn = new OleDbConnection(connstr2003); 30 } 31 else 32 { 33 conn = new OleDbConnection(connstr2007); 34 } 35 conn.Open(); 36 string sql = "select * from [Sheet1$]"; 37 OleDbCommand cmd = new OleDbCommand(sql, conn); 38 DataTable dt = new DataTable(); 39 OleDbDataReader sdr = cmd.ExecuteReader(); 40 41 dt.Load(sdr); 42 sdr.Close(); 43 conn.Close(); 44 //删除服务器里上传的文件 45 if(File.Exists(Server.MapPath(FileName))) 46 { 47 File.Delete(Server.MapPath(FileName)); 48 } 49 return dt; 50 } 51 catch(Exception e) 52 { 53 return null; 54 } 55 } 56 57 protected void Btn_Export_Excel_To_DB_Click(object sender, EventArgs e) 58 { 59 try{ 60 61 DataTable dt = xsldata(); 62 63 //dataGridView2.DataSource = ds.Tables[0]; 64 int errorcount = 0;//记录错误信息条数 65 int insertcount = 0;//记录插入成功条数 66 67 int updatecount = 0;//记录更新信息条数 68 69 string strcon = "server=localhost;database=database1;uid=sa;pwd=sa"; 70 SqlConnection conn = new SqlConnection(strcon);//链接数据库 71 conn.Open(); 72 73 for(int i = 0; i < dt.Rows.Count; i++) 74 { 75 string Name = dt.Rows[i][0].ToString();//dt.Rows[i]["Name"].ToString(); "Name"即为Excel中Name列的表头 76 string Sex = dt.Rows[i][1].ToString(); 77 int Age = Convert.ToInt32(dt.Rows[i][2].ToString()); 78 string Address = dt.Rows[i][3].ToString(); 79 if(Name != "" && Sex != "" && Age != 0 && Address != "") 80 { 81 SqlCommand selectcmd = new SqlCommand("select count(*) from users where Name='" + Name + "' and Sex='" + Sex + "' and Age='" + Age + "' and Address=" + Address, conn); 82 int count = Convert.ToInt32(selectcmd.ExecuteScalar()); 83 if(count > 0) 84 { 85 updatecount++; 86 } 87 else 88 { 89 SqlCommand insertcmd = new SqlCommand("insert into users(Name,Sex,Age,Address) values('" + Name + "','" + Sex + "'," + Age + ",'" + Address + "')", conn); 90 insertcmd.ExecuteNonQuery(); 91 insertcount++; 92 } 93 } 94 else 95 { 96 errorcount++; 97 } 98 } 99 Response.Write((insertcount + "条数据导入成功!" + updatecount + "条数据重复!" + errorcount + "条数据部分信息为空没有导入!")); 100 } 101 catch(Exception ex) 102 { 103 104 } 105 }