1.導入數據思路:
C#winform程序中,要導入數據,給一個EXCEL模板,讓用戶按照給的模板填好數據,然后在程序中一條一條的進行導入數據。
比如
foreach (DataRow dr in dt.Rows) { //校區 XX0103BLL bll_xx0103 = new XX0103BLL(); XX0103Model.Base model_xx0103 = new XX0103Model.Base(); if (bll_xx0103.Exists("", dr["校區編號"].ToString(), dr["校區名稱"].ToString()) == false) { //沒有校區添加校區 model_xx0103.XQBH = dr["校區編號"].ToString(); model_xx0103.XQMC = dr["校區名稱"].ToString(); bll_xx0103.Add(model_xx0103); } }
注意:這里要判段每一條數據是否符合規范,符合的才往數據庫里面插入數據。不符合的就continue。
2.進度條
2.1導入按鈕的單擊事件
/// <summary> /// 導入數據 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_Import_Click(object sender, EventArgs e) { ProcessThread = new Thread(new ThreadStart(LoadBasicData)); ProcessThread.IsBackground = true; ProcessThread.Start(); }
2.2 LoadBasicData方法
/// <summary> /// 基礎數據導入 /// </summary> private void LoadBasicData() { this.NowCount = 0; this.AllCount = 0; this.hasResult = false; try { DelegateShowProssBar mi = new DelegateShowProssBar(ShowProcessBar); this.BeginInvoke(mi, new object[] { "導入基礎數據", "導入數據", true }); Thread.Sleep(1000);//等待進度條彈出 object[] objPar = new object[] { 0, "導入數據...\r" }; object objReturn; this.Invoke(this.myIncrease, objPar); this.AllCount = dt.Rows.Count; this.wpf.SetMaxValue(this.AllCount); objPar = new object[] { this.NowCount, "開始導入數據...\r" }; this.Invoke(this.myIncrease, objPar); foreach (DataRow dr in dt.Rows) { this.NowCount++; //校區 XX0103BLL bll_xx0103 = new XX0103BLL(); XX0103Model.Base model_xx0103 = new XX0103Model.Base(); if (bll_xx0103.Exists("", dr["校區編號"].ToString(), dr["校區名稱"].ToString()) == false) { //沒有校區添加校區 model_xx0103.XQBH = dr["校區編號"].ToString(); model_xx0103.XQMC = dr["校區名稱"].ToString(); bll_xx0103.Add(model_xx0103); } //部門 XX0301BLL bll_xx0301 = new XX0301BLL(); XX0301Model.Base model_xx0301 = new XX0301Model.Base(); if (bll_xx0301.Exists("", dr["校區編號"].ToString(), dr["部門編號"].ToString(), dr["部門名稱"].ToString()) == false) { model_xx0301.BMBH = dr["部門編號"].ToString(); model_xx0301.BMMC = dr["部門名稱"].ToString(); model_xx0301.XQBH = dr["校區編號"].ToString(); bll_xx0301.Add(model_xx0301); } //專業 JX01BLL bll_jx01 = new JX01BLL(); JX01Model.Base model_jx01 = new JX01Model.Base(); if (bll_jx01.Exists("", dr["專業編號"].ToString()) == false) { model_jx01.ZYBH = dr["專業編號"].ToString(); model_jx01.ZYMC = dr["專業名稱"].ToString(); model_jx01.BMBH = dr["部門編號"].ToString(); model_jx01.CC = dr["層次"].ToString(); bll_jx01.Add(model_jx01); } //用戶 CustomerBLL bll_customer = new CustomerBLL(); CustomerModel.Base model_customer = new CustomerModel.Base(); if (bll_customer.Exists("", dr["考生號"].ToString()) == false) { model_customer.OutID = dr["考生號"].ToString(); model_customer.CardNo = int.Parse(dr["卡號"].ToString()); model_customer.Name = dr["姓名"].ToString(); model_customer.CardSN = int.Parse(dr["換卡序號"].ToString()); model_customer.Sex = dr["性別"].ToString(); model_customer.CustomerTypeID = int.Parse(dr["客戶類別"].ToString()); model_customer.NJ = dr["年級"].ToString(); model_customer.ZYBH = dr["專業編號"].ToString(); model_customer.CardStatusID = int.Parse(dr["卡狀態碼"].ToString()); model_customer.IDCardNo = dr["身份證號"].ToString(); model_customer.CardTypeID = int.Parse(dr["卡類別碼"].ToString()); model_customer.AddTime = DateTime.Now; bll_customer.Add(model_customer); } if (!this.hasResult) { objPar = new object[] { this.NowCount, "" }; objReturn = this.Invoke(this.myIncrease, objPar); hasResult = ((WaitProcessFormEx.ResStruct)objReturn).HasResult; bool canceled = ((WaitProcessFormEx.ResStruct)objReturn).Canceled; if (hasResult) { if (this.NowCount == this.AllCount) { // showResult(true, "完成! "); } else { showResult(false, canceled ? "操作被取消! " : "導入未完成! "); return; } } } else { } } objPar = new object[] { this.NowCount, "數據導入完成!" }; this.Invoke(this.myIncrease, objPar); } catch { Error("錯誤", "數據導入錯誤"); } }
3.提供一個讀EXCEL,轉DataTable的方法,注意:只能是excel2003或者excel2007的EXCEL表
/// <summary> /// 讀excel /// </summary> /// <param name="fileFullPath">excel路徑</param> /// <returns></returns> public DataTable ReadExcel(string fileFullPath) { OleDbConnection myConn = null; OleDbDataAdapter myCommand = null; DataSet dst = null; string StrCon = ""; if (fileFullPath.Substring(fileFullPath.LastIndexOf(".")).ToLower() == ".xls") { StrCon = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source=" + fileFullPath + ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'"; } else if (fileFullPath.Substring(fileFullPath.LastIndexOf(".")).ToLower() == ".xlsx") { StrCon = "Provider =Microsoft.ACE.OLEDB.12.0;Data Source=" + fileFullPath + ";Extended Properties='Excel 12.0;HDR=Yes;IMEX=1'"; } else if (fileFullPath.Substring(fileFullPath.LastIndexOf(".")).ToLower() == ".mdb") { StrCon = " Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + fileFullPath + "; User Id=; Password="; } else { this.Error("錯誤", "文件格式不正確"); } myConn = new OleDbConnection(StrCon); myConn.Open();//打開Excel連接 //查詢excel文件中有多少張表 DataTable dt = myConn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);//查詢所有表 if (dt.Rows.Count == 0) { this.Error("錯誤", "文件中沒有可用的表"); } string sql = "select * from [{0}]"; bool flag = false; foreach (DataRow d in dt.Rows)//列出所有表以供選擇 { if (d["TABLE_TYPE"].ToString().ToUpper() == "TABLE") { //sql += d[2].ToString().Replace("'", ""); sql = string.Format(sql, d[2].ToString().Replace("'", "")); flag = true; break; } } if (flag == false) { this.Error("錯誤", "沒有可用的表"); } myCommand = new OleDbDataAdapter(sql, myConn); dst = new DataSet(); myCommand.Fill(dst); return dst.Tables[0]; }