訂餐系統之Excel批量導入

   批量導入現在基本已經成為各類系統的標配了,當前,我們訂餐系統也不例外,什么商家呀、商品呀、優惠碼之類的,都少不了。畢竟嘛,對非開發人員來說,看到Excel肯定比看到很多管理系統還是要親切很多的。這里,我就分享下自己如何一步步踩坑、爬坑到最后完成Excel批量導入的歷程。或許,你還有更好的方案,不妨也分享下;當然,也希望能給正在坑中,或者爬坑的同仁們一點幫助。

   注:Excel操作用了?org.in2bits.myxls.dll? 這個不知道是否是免費的,沒仔細查過。

?

年輕時的代碼是我們曾經年輕過的證明

  第一次,遇到Excel批量導入時,很自然的,onclick,INSERT...本地用只有幾條數據的Excel測試正常,select下,呀! 數據正常導入,笑咪咪的生成、發布,ok,搞定。客戶使用時,用了幾百條數據的Excel導入,會出現什么問題相信大家都知道吧,多半是執行超時,于是,再baidu,google...,原來可以設置executionTimeout。【設置這個后,應該還有問題,就是想不起了來,于是才有了下文】

?

努力不一定成功,但一定在成長

  當我費盡心思希望通過設置解決超時問題,處處碰壁后才知道,這個通常要用多線程。那會才知道見識有多重要,才知道多看博客有多重要。一翻baidu,google后,有了下面的代碼。

    protected void btDo_Click(object sender, EventArgs e){Thread t = new Thread(new ThreadStart(InportUser));t.Start();}public void InportUser(){///讀取excel,循環insert}    
View Code

?  這樣寫,超時的情況變少了(好像也會,具體什么時候,真是慚愧,沒有好好研究過),但是有一個不能接受的現像就是,我不知道什么時候執行完了,也就不知道什么時候可以關瀏覽器。那會兒,只想到了一個好笨的辦法,一直select看條數還有沒有增加。由于一直沒有找到好的辦法,這個情況一直存在于我們系統中很長時間,也像一個石頭一直壓在我心中,每每看到,心里總是隱隱不快,我都不能接受的東西,還要讓客戶去接受。。。直到前不久,才看到 BackgroundWorker 。那會才知道見識有多重要,才知道多看博客有多重要。

 

失敗讓我們慢慢蛻去年輕的印記

  BackgroundWorker 具體內容,這里就不去寫了,baidu,google,msdn有全面、權威的介紹。我只分享下這個過程中自己踩的坑吧:

  1.一直沒執行 DoWork,也沒有錯誤日志;您可能頁面中沒有加入 Async="true。

  2.HttpContext.Current 為null;當時要在DoWork中為每個記錄生成一個二維碼圖片(在一個類中生成),HttpContext.Current.Server一直為空,瞬間想起之前有個博客是《HttpContext.Curren并非無處不在》,當時一下就知道了多看博客有多重要。

  3.執行不超時,數據庫鏈接可能會超時。這個和BackgroundWorker沒什么關系,不過好像一起出現的概率比較大哦。正常情況簡單一句SqlCommand.CommandTimeout = 0; 就ok了。

  關于BackgroundWorker的代碼,應該隨便一搜就是一籮筐,我還是帖下自己的吧,愿意搜索的自己搜索吧,愿意將就的就看下下面的吧:

  aspx主要代碼,主要就是一個設置和上傳控件的問題

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="importshopcart.aspx.cs" Inherits="importshopcart"Async="true" %><asp:FileUpload runat="server" ID="fuFoodExcel" /><asp:Button ID="btSave" runat="server" CssClass="button_1" OnClick="btSave_Click"Text="導入" OnClientClick=" showload_super();"></asp:Button><a href="demo.xls">下載模版</a>
View Code

?

  aspx.cs主要代碼,只實現了執行完成方法,這點就是之前一直無法實現的東西,開始執行時彈出加載框,執行完成可以進行提示,詳細的東西,大家可以自己動手搜索下。

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>/// 耗時操作/// </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 = "文件格式不正確,請上傳excel文件";return;}}else{msg = "請上傳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格式的問題導致程序錯誤try{//解析文件并保存數據到數據庫XlsDocument xls = new XlsDocument(Server.MapPath(sFile));Worksheet sheet = xls.Workbook.Worksheets[0];//excel格式:第一行是說明,第二行是標題,第三行開始是數據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 = "導入出錯,請檢查excel";HJlog.toLog(ex.ToString());return;}msg = "操作成功,已經導入" + count + "個地址。";}/// <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

  執行過程,和完成提示效果:

  

?? ??

?

結語

  文章到此就結束了,分享還會繼續。說實在的很多細節其實我自己也不是很清楚,有錯誤的地方,請指正,也希望能給部分園子里的同學帶來幫助。

  成為一名優秀的程序員!

  

  

轉載于:https://www.cnblogs.com/jijunjian/p/3489649.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260961.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260961.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260961.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

需要忽略的一些信號

程序往往會因為收到一些信號導致退出&#xff0c;但很多時候并不是我們想要的&#xff0c;比如往一個已經關閉的socket連接發送數據就會受到SIGPIPE,此信號默認會退出程序&#xff0c;但其實大部分時候我們并不想這么做&#xff0c;所以需要忽略一些信號。常見的有 SIGPIPE SIG…

獲取網頁中選中的文字

獲取頁面中選中的文字 //獲取頁面中選中的文字 function getSelectedText(){if(window.getSelection){ //FFreturn window.getSelection().toString();}else{ //IEreturn document.selection.createRange().text;} }設置或獲取輸入框的選中文字 //設置文字選中 function setSe…

云服務器和獨享虛擬主機的區別,獨享虛擬主機和云服務器的幾大區別

獨享虛擬主機和云服務器的幾大區別發布時間&#xff1a;2020-10-15 19:05:51來源&#xff1a;億速云閱讀&#xff1a;99作者&#xff1a;Leah欄目&#xff1a;云計算今天就跟大家聊聊有關獨享虛擬主機和云服務器的幾大區別&#xff0c;可能很多人都不太了解&#xff0c;為了讓大…

oracle數據庫之數據導入問題

2019獨角獸企業重金招聘Python工程師標準>>> 在oracle數據庫中建立好數據庫以后&#xff0c;需要使用PLSQL進行用戶創建&#xff0c;打開PLSQL&#xff0c;使用時需要使用最高權限進入PLSQL。如下圖&#xff1a; 不需要使用用戶名和密碼&#xff0c;進入數據庫操作。…

轉向ARC的說明

轉自hherima的博客原文&#xff1a;Transitioning to ARC Release Notes&#xff08;蘋果官方文檔&#xff09; ARC是一個編譯器特征&#xff0c;它提供了對OC對象自動管理內存。ARC讓開發者專注于感興趣的代碼和對象的關系&#xff0c;而不用考慮對象的retain和release。 概要…

ubuntu11.10 samba服務器配置

安裝samba可以實現linux下文件和window共享&#xff0c;這樣window下就可以操作linux的文件了。 1、關閉LINUX防火墻 sudo ufw disable 注&#xff1a;ufw是linux下的防火墻操作命令&#xff0c;相關的操作可以查看命令幫助 2、先卸載samba-common sudo ap…

win服務器創建文件夾命令,Win10系統如利用命令提示符或WSL創建任意大小空白文件...

要測試網盤或服務器的上傳&#xff0c;下載速度&#xff0c;需要指定大小的文件用來測試。創建的空白文件雖然沒有任何內容&#xff0c;但是有大小&#xff0c;可以用來測試實際傳輸速度、覆蓋已刪除數據等用途。這篇文章是本站教大家在Win10中用命令或WSL創建任意大小空白文件…

計算UILabel帶行間距的行高

為什么80%的碼農都做不了架構師&#xff1f;>>> //設置lab的行間距 NSMutableAttributedString *attributedString [[NSMutableAttributedString alloc] initWithString:_doubletStr]; NSMutableParagraphStyle *paragraphStyle [[NSMutableParagraphStyle alloc…

FORM級別和數據庫級別的Trace

&#xfeff;&#xfeff;metalink上的文章較全的&#xff0c;中文的可參考我的博客EBS開發技術之trace http://blog.csdn.net/cai_xingyun/article/details/17250971 This document provides instructions on how to create and retrieve Forms and Database level SQL trace…

關于farpoint公司的控件:SPREAD for .NET Windows Forms Ed.的一些簡單方法.

View Code using System;using FarPoint.Win.Spread ;using System.Drawing;using System.Windows.Forms;namespace DFO010{/// <summary>/// Fpspread的相關函數.2006/4/12 制作:Chouka/// </summary> public class Classspd {public Classspd() { }/// <su…

永遠的beyond!(4 days left to get back touch)

永遠的beyond!轉載于:https://www.cnblogs.com/LaoLuo/archive/2012/03/05/2380954.html

串行總線協議筆記

I2C --INTER-IC串行總線的縮寫&#xff0c;是PHILIPS公司推出的芯片間串行傳輸總線。它以1根串行數據線&#xff08;SDA&#xff09;和1根串行時鐘線&#xff08;SCL&#xff09;實 現了雙工的同步數據傳輸。具有接口線少&#xff0c;控制方式簡化&#xff0c;器件封裝形式小&a…

ibm服務器和微軟,微軟與IBM不得不說的事情

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓在Windows 3.x 開 始 為 世 人 接 受 之 初&#xff0c; 個 人 電 腦 的 操 作 系 統 中 唯 一 可 以 與Windows 操 作 系 統 分 庭 抗 禮 的 就 是OS/2。 這 套 原 先 是 微 軟 與IBM 合 作 生 產 的 操 作 系 統&#xff0c; 由 …

[置頂] 程序員編程生產力相差10倍意味著什么?

在軟件工程研究中&#xff0c;被驗證得最多的結論就是對于同等經驗的兩個不同程序員&#xff0c;在效率和質量上可能會有10倍的差距。研究人員還發現&#xff0c;這種差距也適用于團隊級別上&#xff0c;也就是說在同一行業內的不同的團隊也是如此。 軟件開發中的個人效率的變化…

生成隨機長度字符串,比如密碼等

2019獨角獸企業重金招聘Python工程師標準>>> public function createstr( $length ) {$chars "abcdefghijklmnopqrstuvwxyz0123456789"; $str "";for ( $i 0; $i < $length; $i ) { $str. substr($chars, mt_rand(0, strlen($chars)-1), 1…

css margin屬性,css margin屬性怎么用?css margin屬性用法教程

在css中&#xff0c;有一個重要的屬性margin&#xff0c;很多人都不知道css margin屬性是什么&#xff1f;怎么用&#xff0c;下面為您總結一下css margin屬性用法教程。margin是css用于在一個聲明中&#xff0c;對所有css margin屬性的簡寫&#xff0c;正因為margin來控制css中…

對于.swp文件的恢復方法

今天在使用Secure CRT在局域網內遠程服務器上編程時出了小狀況。在文件沒有保存的情況下&#xff0c;網線斷了。 然后等我重連上去后發現&#xff0c;剛剛編寫的程序不見了。用命令:ll 發現在目錄下有一個同名的.xxxx.c.swp文件。 通過這個文件&#xff0c;可以恢復程序。 恢復…

bzoj1679[Usaco2005 Jan]Moo Volume 牛的呼聲*

bzoj1679[Usaco2005 Jan]Moo Volume 牛的呼聲 題意&#xff1a; N只牛&#xff0c;每只牛都與其他N-1只牛聊著天。一個對話的進行&#xff0c;需要兩只牛都按照和她們間距離等大的音量吼叫&#xff0c;計算音量和。N≤10000 題解&#xff1a; 第i只牛與前i-1只牛對話的音量和是…

gaia引擎分析(二)場景管理

只是粗略的分析原理&#xff0c;大蝦輕噴~~ Gaia引擎中沒有場景管理器&#xff08;scenemanager&#xff09;這種東西&#xff0c;但是并不是沒有場景管理&#xff0c;而是在cGameHost類中有一課場景樹進行場景組織、一棵四叉樹用來進行剪裁。 class cGameHost class cGameHos…

ajax登錄非空判斷,email ajax傳輸數據去重和非空判斷(示例代碼)

前臺&#xff1a;ajax:$(document).ready(function(){$("#email").blur(function(){$("#email").css("background-color","#D6D6FF");$.ajax({type:"post",url:"check_email.do",data:{‘email‘:$("#email&…