订餐系统之Excel批量导入
批量導(dǎo)入現(xiàn)在基本已經(jīng)成為各類系統(tǒng)的標(biāo)配了,當(dāng)前,我們訂餐系統(tǒng)也不例外,什么商家呀、商品呀、優(yōu)惠碼之類的,都少不了。畢竟嘛,對(duì)非開發(fā)人員來說,看到Excel肯定比看到很多管理系統(tǒng)還是要親切很多的。這里,我就分享下自己如何一步步踩坑、爬坑到最后完成Excel批量導(dǎo)入的歷程。或許,你還有更好的方案,不妨也分享下;當(dāng)然,也希望能給正在坑中,或者爬坑的同仁們一點(diǎn)幫助。
注:Excel操作用了?org.in2bits.myxls.dll? 這個(gè)不知道是否是免費(fèi)的,沒仔細(xì)查過。
?
年輕時(shí)的代碼是我們?cè)?jīng)年輕過的證明第一次,遇到Excel批量導(dǎo)入時(shí),很自然的,onclick,INSERT...本地用只有幾條數(shù)據(jù)的Excel測試正常,select下,呀! 數(shù)據(jù)正常導(dǎo)入,笑咪咪的生成、發(fā)布,ok,搞定。客戶使用時(shí),用了幾百條數(shù)據(jù)的Excel導(dǎo)入,會(huì)出現(xiàn)什么問題相信大家都知道吧,多半是執(zhí)行超時(shí),于是,再baidu,google...,原來可以設(shè)置executionTimeout。【設(shè)置這個(gè)后,應(yīng)該還有問題,就是想不起了來,于是才有了下文】
?
努力不一定成功,但一定在成長當(dāng)我費(fèi)盡心思希望通過設(shè)置解決超時(shí)問題,處處碰壁后才知道,這個(gè)通常要用多線程。那會(huì)才知道見識(shí)有多重要,才知道多看博客有多重要。一翻baidu,google后,有了下面的代碼。
protected void btDo_Click(object sender, EventArgs e){Thread t = new Thread(new ThreadStart(InportUser));t.Start();}public void InportUser(){///讀取excel,循環(huán)insert} View Code? 這樣寫,超時(shí)的情況變少了(好像也會(huì),具體什么時(shí)候,真是慚愧,沒有好好研究過),但是有一個(gè)不能接受的現(xiàn)像就是,我不知道什么時(shí)候執(zhí)行完了,也就不知道什么時(shí)候可以關(guān)瀏覽器。那會(huì)兒,只想到了一個(gè)好笨的辦法,一直select看條數(shù)還有沒有增加。由于一直沒有找到好的辦法,這個(gè)情況一直存在于我們系統(tǒng)中很長時(shí)間,也像一個(gè)石頭一直壓在我心中,每每看到,心里總是隱隱不快,我都不能接受的東西,還要讓客戶去接受。。。直到前不久,才看到 BackgroundWorker 。那會(huì)才知道見識(shí)有多重要,才知道多看博客有多重要。
失敗讓我們慢慢蛻去年輕的印記
BackgroundWorker 具體內(nèi)容,這里就不去寫了,baidu,google,msdn有全面、權(quán)威的介紹。我只分享下這個(gè)過程中自己踩的坑吧:
1.一直沒執(zhí)行 DoWork,也沒有錯(cuò)誤日志;您可能頁面中沒有加入 Async="true。
2.HttpContext.Current 為null;當(dāng)時(shí)要在DoWork中為每個(gè)記錄生成一個(gè)二維碼圖片(在一個(gè)類中生成),HttpContext.Current.Server一直為空,瞬間想起之前有個(gè)博客是《HttpContext.Curren并非無處不在》,當(dāng)時(shí)一下就知道了多看博客有多重要。
3.執(zhí)行不超時(shí),數(shù)據(jù)庫鏈接可能會(huì)超時(shí)。這個(gè)和BackgroundWorker沒什么關(guān)系,不過好像一起出現(xiàn)的概率比較大哦。正常情況簡單一句SqlCommand.CommandTimeout = 0; 就ok了。
關(guān)于BackgroundWorker的代碼,應(yīng)該隨便一搜就是一籮筐,我還是帖下自己的吧,愿意搜索的自己搜索吧,愿意將就的就看下下面的吧:
  aspx主要代碼,主要就是一個(gè)設(shè)置和上傳控件的問題
?
aspx.cs主要代碼,只實(shí)現(xiàn)了執(zhí)行完成方法,這點(diǎn)就是之前一直無法實(shí)現(xiàn)的東西,開始執(zhí)行時(shí)彈出加載框,執(zhí)行完成可以進(jìn)行提示,詳細(xì)的東西,大家可以自己動(dòng)手搜索下。
protected void btSave_Click(object sender, EventArgs e){bgw = new BackgroundWorker();bgw.WorkerSupportsCancellation = true;bgw.WorkerReportsProgress = true;bgw.DoWork += new DoWorkEventHandler(DoWork);bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);bgw.RunWorkerAsync();}/// <summary>/// 耗時(shí)操作/// </summary>/// <param name="sender"></param>/// <param name="e"></param>void DoWork(object sender, DoWorkEventArgs e){string suffix = "";if (this.fuFoodExcel.HasFile){suffix = Path.GetExtension(this.fuFoodExcel.PostedFile.FileName);if (suffix == ".xls" || suffix == ".XLS"){}else{msg = "文件格式不正確,請(qǐng)上傳excel文件";return;}}else{msg = "請(qǐng)上傳excel文件";return;}string filepath = "~/upload/excel/";if (!System.IO.Directory.Exists(Server.MapPath(filepath))){System.IO.Directory.CreateDirectory(Server.MapPath(filepath));}string sFile = filepath + System.DateTime.Now.ToString("yyyyMMddHHmmssffff") + suffix; //上傳后文件的新名//保存文件try{this.fuFoodExcel.PostedFile.SaveAs(Server.MapPath(sFile));}catch (Exception ex){HJlog.toLog(ex.ToString());return;}//必要的判斷以防止excel格式的問題導(dǎo)致程序錯(cuò)誤try{//解析文件并保存數(shù)據(jù)到數(shù)據(jù)庫XlsDocument xls = new XlsDocument(Server.MapPath(sFile));Worksheet sheet = xls.Workbook.Worksheets[0];//excel格式:第一行是說明,第二行是標(biāo)題,第三行開始是數(shù)據(jù)for (int i = 3; i < sheet.Rows.Count; i++) // {if (sheet.Rows[ushort.Parse(i.ToString())] != null && sheet.Rows[ushort.Parse(i.ToString())].CellCount >= 1 && sheet.Rows[ushort.Parse(i.ToString())].GetCell(ushort.Parse("1")) != null && sheet.Rows[ushort.Parse(i.ToString())].GetCell(ushort.Parse("1")).Value != null){addressbookInfo mm = new addressbookInfo();mm.Parentid = 0;mm.Status = 0;mm.Isdel = 0;mm.Classname = sheet.Rows[ushort.Parse(i.ToString())].GetCell(ushort.Parse("1")).Value.ToString();mm.Depth = 2;mm.Priority = 0;mm.Pic = sheet.Rows[ushort.Parse(i.ToString())].GetCell(ushort.Parse("2")).Value.ToString();mm.Revevar = sheet.Rows[ushort.Parse(i.ToString())].GetCell(ushort.Parse("3")).Value.ToString();mm.path = ChineseConvert.UtilIndexCode(mm.Classname);dal.Add(mm);count++;}else{break;}}}catch (Exception ex){msg = "導(dǎo)入出錯(cuò),請(qǐng)檢查excel";HJlog.toLog(ex.ToString());return;}msg = "操作成功,已經(jīng)導(dǎo)入" + count + "個(gè)地址。";}/// <summary>/// 完成/// </summary>/// <param name="sender"></param>/// <param name="e"></param>void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){string tipmsg = "";if (count == 0){tipmsg = "操作未完成," + msg;}else{tipmsg = msg;}AlertScript.RegScript(this.Page, "alert('" + tipmsg + "');hideload_super();");} View Code執(zhí)行過程,和完成提示效果:
?? ??
?
結(jié)語文章到此就結(jié)束了,分享還會(huì)繼續(xù)。說實(shí)在的很多細(xì)節(jié)其實(shí)我自己也不是很清楚,有錯(cuò)誤的地方,請(qǐng)指正,也希望能給部分園子里的同學(xué)帶來幫助。
成為一名優(yōu)秀的程序員!
轉(zhuǎn)載于:https://www.cnblogs.com/jijunjian/p/3489649.html
總結(jié)
以上是生活随笔為你收集整理的订餐系统之Excel批量导入的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: RC4加密解密
 - 下一篇: 英国议会官方号关闭TikTok账户:刚注