订餐系统之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.mzph.cn/news/260961.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle数据库之数据导入问题

2019独角兽企业重金招聘Python工程师标准>>> 在oracle数据库中建立好数据库以后&#xff0c;需要使用PLSQL进行用户创建&#xff0c;打开PLSQL&#xff0c;使用时需要使用最高权限进入PLSQL。如下图&#xff1a; 不需要使用用户名和密码&#xff0c;进入数据库操作。…

win服务器创建文件夹命令,Win10系统如利用命令提示符或WSL创建任意大小空白文件...

要测试网盘或服务器的上传&#xff0c;下载速度&#xff0c;需要指定大小的文件用来测试。创建的空白文件虽然没有任何内容&#xff0c;但是有大小&#xff0c;可以用来测试实际传输速度、覆盖已删除数据等用途。这篇文章是本站教大家在Win10中用命令或WSL创建任意大小空白文件…

计算UILabel带行间距的行高

为什么80%的码农都做不了架构师&#xff1f;>>> //设置lab的行间距 NSMutableAttributedString *attributedString [[NSMutableAttributedString alloc] initWithString:_doubletStr]; NSMutableParagraphStyle *paragraphStyle [[NSMutableParagraphStyle alloc…

关于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…

串行总线协议笔记

I2C --INTER-IC串行总线的缩写&#xff0c;是PHILIPS公司推出的芯片间串行传输总线。它以1根串行数据线&#xff08;SDA&#xff09;和1根串行时钟线&#xff08;SCL&#xff09;实 现了双工的同步数据传输。具有接口线少&#xff0c;控制方式简化&#xff0c;器件封装形式小&a…

[置顶] 程序员编程生产力相差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中…

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

只是粗略的分析原理&#xff0c;大虾轻喷~~ Gaia引擎中没有场景管理器&#xff08;scenemanager&#xff09;这种东西&#xff0c;但是并不是没有场景管理&#xff0c;而是在cGameHost类中有一课场景树进行场景组织、一棵四叉树用来进行剪裁。 class cGameHost class cGameHos…

C++.Templates学习总结归纳1

函数模板 首先我们来看看函数模板&#xff0c;一个函数模板&#xff08;function template&#xff09;代表一族函数&#xff0c;其表现和一般的函数一样&#xff0c;只是其中的某些元素在编写的时候还不知道&#xff0c;也就是说这些还不知道的元素&#xff0c;我们将其参数化…

Xml Tips

Xml Tips//z 2012-3-7 16:43:47 PM IS2120CSDN1. xml 中的注释<!-- 这是注释 -->并非用于 XML 分析器的内容&#xff08;例如与文档结构或编辑有关的说明&#xff09;可以包含在注释中。注释以 <!-- 开头&#xff0c;以 --> 结尾&#xff0c;例如<!--catalog la…

Window7+vs2008+QT环境搭建

记录下自己是如何搭建QT开发环境的&#xff0c;备忘吧。操作系统&#xff1a;win7&#xff0c;其实winXP&#xff0c;win7都没有关系&#xff1b;我使用的机器安装的操作系统是win7&#xff1b;开发环境是VS&#xff0c;使用2005,2008,2010或者即将发布的2011都行&#xff1b;因…

Javascript创建对象的几种方式?

javascript 中常见的创建对象的几种方式&#xff1a; 1. 使用Object构造函数创建&#xff1b; 使用Object构造函数来创建一个对象&#xff0c;下面代码创建了一个person对象&#xff0c;并用两种方式打印出了Name的属性值。 var person new Object(); person.name"kevin&…

使用 RMAN 同步数据库

使用 RMAN 同步数据库使用 RMAN 同步数据库一&#xff0e;概述二 操作步骤(一)&#xff0e;把生产库置为归档模式(二).启动rman做数据库0级备份(三)&#xff0e;修改生产库数据库到未归档(四)&#xff0e;拷贝备份集到测试库(五).在测试库上的操作一&#xff0e;概述 因项目组遇…

js实现图片上传预览及进度条

js实现图片上传预览及进度条 原文js实现图片上传预览及进度条 最近在做图片上传的时候&#xff0c;由于产品设计的比较fashion&#xff0c;上网找了比较久还没有现成的&#xff0c;因此自己做了一个&#xff0c;实现的功能如下&#xff1a; 1&#xff1a;去除浏览器<input …

webapi文档描述-swagger

最近做的项目使用mvcwebapi&#xff0c;采取前后端分离的方式&#xff0c;后台提供API接口给前端开发人员。这个过程中遇到一个问题后台开发人员怎么提供接口说明文档给前端开发人员,最初打算使用word文档方式进行交流&#xff0c;实际操作中却很少动手去写。为了解决这个问题&…

《推荐系统实践》样章:如何利用用户标签数据

《推荐系统实践》样章&#xff1a;如何利用用户标签数据 推荐系统的目的是联系用户的兴趣和物品&#xff0c;这种联系需要依赖于不同的媒介。GroupLens在文章1中认为目前流行的推荐系统基本上通过三种方式来联系用户兴趣和物品。如图1所示&#xff0c;第一种方式是通过用户喜欢…

STM32 基于正电原子开发板,改换芯片为STM32F103R6,Proteus仿真的一些问题

最近在学STM32&#xff0c;网上收集了一些信息&#xff0c;最后用正点原子的开发板来学习。 MDK的配置请参考原子哥的资料&#xff0c;我主要的学习方法是参考原子哥的开发板与实验案例&#xff0c;改换不一样的芯片&#xff0c;也要做出的一样的效果。但在最基础的入门就遇到…

深入理解闭包系列第二篇——从执行环境角度看闭包

前面的话 本文从执行环境的角度来分析闭包&#xff0c;先用一张图开宗明义&#xff0c;然后根据图示内容对代码进行逐行说明&#xff0c;试图对闭包进行更直观的解释 图示 说明 下面按照代码执行流的顺序对该图示进行详细说明 function foo(){var a 2;function bar(){console.…

VS2017 调用Tesseract

最近在学tesseract&#xff0c;但遇到太多的问题是。 虽然网上有不少的方法&#xff0c;就算是按照tersseract&#xff0c;github上提供的方法也是编译不成功。 问题一大堆。不过我也想到了其它方法最张还是可以用了。 我有2个方法&#xff0c; 方法1, 1&#xff0c;先build t…