在日常的項目中,Excel,Word,txt等格式的數據導入到數據庫中是很常見的,我在這裡做一下總結
這裡將分為Asp.net導入Sql Server,Oracle數據庫和WinForm導入Sql Server,Oracle數據庫。
先看界面圖
實現的基本思想:
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中列的順序固定,即可按下面代碼中的方式進行。
添加的引用:
using System;
using System.Data;
using System.Data.OleDb;
using System.Data.SqlClient;
using System.IO;
using System.Text;
using System.Web;
using System.Web.UI;
代碼:
private DataTable xsldata()
{
if(fuload.FileName == "")
{
lbmsg.Text = "請選擇文件";
return null;
}
string fileExtenSion;
fileExtenSion = Path.GetExtension(fuload.FileName);
if(fileExtenSion.ToLower() != ".xls" && fileExtenSion.ToLower() != ".xlsx")
{
lbmsg.Text = "上傳的文件格式不正確";
return null;
}
try
{
string FileName = "App_Data/" + Path.GetFileName(fuload.FileName);
if(File.Exists(Server.MapPath(FileName)))
{
File.Delete(Server.MapPath(FileName));
}
fuload.SaveAs(Server.MapPath(FileName));
//HDR=Yes,這代表第一行是標題,不做為數據使用 ,如果用HDR=NO,則表示第一行不是標題,做為數據來使用。系統默認的是YES
string connstr2003 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath(FileName) + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1;'";
string connstr2007 = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Server.MapPath(FileName) + ";Extended Properties=\"Excel 12.0;HDR=YES\"";
OleDbConnection conn;
if(fileExtenSion.ToLower() == ".xls")
{
conn = new OleDbConnection(connstr2003);
}
else
{
conn = new OleDbConnection(connstr2007);
}
conn.Open();
string sql = "select * from [Sheet1$]";
OleDbCommand cmd = new OleDbCommand(sql, conn);
DataTable dt = new DataTable();
OleDbDataReader sdr = cmd.ExecuteReader();
dt.Load(sdr);
sdr.Close();
conn.Close();
//刪除服務器裡上傳的文件
if(File.Exists(Server.MapPath(FileName)))
{
File.Delete(Server.MapPath(FileName));
}
return dt;
}
catch(Exception e)
{
return null;
}
}
protected void Btn_Export_Excel_To_DB_Click(object sender, EventArgs e)
{
try{
DataTable dt = xsldata();
//dataGridView2.DataSource = ds.Tables[0];
int errorcount = 0;//記錄錯誤信息條數
int insertcount = 0;//記錄插入成功條數
int updatecount = 0;//記錄更新信息條數
string strcon = "server=localhost;database=database1;uid=sa;pwd=sa";
SqlConnection conn = new SqlConnection(strcon);//鏈接數據庫
conn.Open();
for(int i = 0; i < dt.Rows.Count; i++)
{
string Name = dt.Rows[i][0].ToString();//dt.Rows[i]["Name"].ToString(); "Name"即為Excel中Name列的表頭
string Sex = dt.Rows[i][1].ToString();
int Age = Convert.ToInt32(dt.Rows[i][2].ToString());
string Address = dt.Rows[i][3].ToString();
if(Name != "" && Sex != "" && Age != 0 && Address != "")
{
SqlCommand selectcmd = new SqlCommand("select count(*) from users where Name='" + Name + "' and Sex='" + Sex + "' and Age='" + Age + "' and Address=" + Address, conn);
int count = Convert.ToInt32(selectcmd.ExecuteScalar());
if(count > 0)
{
updatecount++;
}
else
{
SqlCommand insertcmd = new SqlCommand("insert into users(Name,Sex,Age,Address) values('" + Name + "','" + Sex + "'," + Age + ",'" + Address + "')", conn);
insertcmd.ExecuteNonQuery();
insertcount++;
}
}
else
{
errorcount++;
}
}
Response.Write((insertcount + "條數據導入成功!" + updatecount + "條數據重復!" + errorcount + "條數據部分信息為空沒有導入!"));
}
catch(Exception ex)
{
}
}
就介紹到這裡