订餐系统之Excel批量导入

简介:    批量导入现在基本已经成为各类系统的标配了,当前,我们订餐系统也不例外,什么商家呀、商品呀、优惠码之类的,都少不了。毕竟嘛,对非开发人员来说,看到Excel肯定比看到很多管理系统还是要亲切很多的。这里,我就分享下自己如何一步步踩坑、爬坑到最后完成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

  执行过程,和完成提示效果:

  

     

 

结语

  文章到此就结束了,分享还会继续。说实在的很多细节其实我自己也不是很清楚,有错误的地方,请指正,也希望能给部分园子里的同学带来帮助。

  成为一名优秀的程序员!

  

  

版权声明:
作者:J²
有事儿Q我
有事儿W我
编辑: 妞妞
妞妞主页
出处:http://www.cnblogs.com/jijunjian/
本文版权归作者和博客园共有,欢迎转载,大家好,才是真的好!
 
目录
相关文章
|
4月前
|
数据管理
宜搭流程中,数据管理批量发起如何成功导入 年-月-日 时:分格式数据 当前数据管理批量发起,Excel文本中编辑时间格式如2023-12-07 20:00,批量导入生成后显示为20231207 00:00,请问如何让时:分正确显示。
宜搭流程中,数据管理批量发起如何成功导入 年-月-日 时:分格式数据 当前数据管理批量发起,Excel文本中编辑时间格式如2023-12-07 20:00,批量导入生成后显示为20231207 00:00,请问如何让时:分正确显示。
61 2
|
Java
从Excel批量导入数据说到ForkJoin的原理
前面我们介绍了EasyPOI,用其进行Excel导入导出,非常的方便,非常的简单。但是4.0.0 版本以及其之前的版本都是通过单线程的方式对Excel中的数据进行解析的。效率比较差。 今天我将做一个测试,5000条数据,分别使用EasyPOI的方式和自己手写ForkJoin的方式(多任务)的方式来导入,来比较这两者的性能差异。
179 0
从Excel批量导入数据说到ForkJoin的原理
|
XML SQL 关系型数据库
将Excel数据批量导入到数据库(项目案例)
我们今天就给大家介绍一个用途非常广泛的功能:批量导入,在很多系统中,这也是必须实现的功能。而且当Excel表结构越复杂时,实现的难度就越高。 不管项目如何复杂,原理却基本相同,一般是前台页面选择Excel文件,后台获取后进行数据转化,然后循环执行Sql语句即可,了解这些原理后,一切也就变得简单。
将Excel数据批量导入到数据库(项目案例)
|
11月前
|
JSON 小程序 数据库
小程序批量导入excel数据,云开发数据库导出cvs乱码解决方案
小程序批量导入excel数据,云开发数据库导出cvs乱码解决方案
395 0
|
11月前
|
数据库
点餐系统新增excel菜品数据批量导入功能
点餐系统新增excel菜品数据批量导入功能
106 0
|
11月前
|
Java 关系型数据库 MySQL
java入门019~springboot批量导入excel数据到mysql
java入门019~springboot批量导入excel数据到mysql
172 0
|
JSON NoSQL 小程序
小程序中实现excel数据的批量导入
小程序中实现excel数据的批量导入
小程序中实现excel数据的批量导入
|
开发框架 关系型数据库 MySQL
.NET Core使用NPOI将Excel中的数据批量导入到MySQL
.NET Core使用NPOI将Excel中的数据批量导入到MySQL
266 0
.NET Core使用NPOI将Excel中的数据批量导入到MySQL
|
前端开发 开发者
.NET之NPOI Excel数据导出和批量导入功能
.NET之NPOI Excel数据导出和批量导入功能
330 0
.NET之NPOI Excel数据导出和批量导入功能
|
前端开发 定位技术 数据库
从零开始实现放置游戏(六)——实现后台管理系统(4)Excel批量导入
前面我们已经实现了在后台管理系统中,对配置数据的增删查改。但每次添加只能添加一条数据,实际生产中,大量数据通过手工一条一条添加不太现实。本章我们就实现通过Excel导入配置数据的功能。这里我们还是以地图数据为例,其他配置项可参照此例。
从零开始实现放置游戏(六)——实现后台管理系统(4)Excel批量导入