zoukankan      html  css  js  c++  java
  • ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-Excel导入和导出-自定义表模导入

    系列目录

    前言

    上一节使用了LinqToExcel和CloseXML对Excel表进行导入和导出的简单操作,大家可以跳转到上一节查看:

    ASP.NET MVC5+EF6+EasyUI 后台管理系统(63)-Excel导入和导出

    本节演示一些比较复杂的模型场景

    情景

    上次的场景:(标准的Excel表格格式)

    制定的场景:(指定表模的场景,多张sheet,不是横排的形式)

    实现

    实现思路:利用LinqToExcel循环读取Sheet,再循环读取Sheet指定单元格的内容

    (其实Excel是一个二维数组,可以直接读取诸如:B1:C1的单元格数据)

    上次的代码我们已经有了上传Excel功能,这次就不需要放出上传代码了。

    在业务层添加校验Excel的方法:可以效仿上次的普通导入

    public bool CheckImportBatchData(string fileName, List<Spl_PersonModel> personList, ref ValidationErrors errors)  

    头部分同样保持不变:

            var targetFile = new FileInfo(fileName);
    
                if (!targetFile.Exists)
                {
    
                    errors.Add("导入的数据文件不存在");
                    return false;
                }
    
                var excelFile = new ExcelQueryFactory(fileName);

    下面是核心代码:

    1.获得Excel所有的sheet

    var sheetList = excelFile.GetWorksheetNames();//IEnumberable

    由于其返回类型是IEnumberable所有我们直接一个foreach就全出来了

    2.获得sheet内部的表格数据

    foreach (var sheet in sheetList)
    {
        //获得sheet对应的数据
        var data = excelFile.WorksheetNoHeader(sheet).ToList();
    }

    视乎到这一步都很简单了!接下来我们只要分解data的数据即可,经过跟踪data是一个二维数据

    3.获得单元格内容

    好了,现在更加清晰了,我要获得光头强两个字。那么只需要data[2][3]就可以了

    //判断信息是否齐全
    if (data[1][2].Value.ToString() == "")
    {
        errorMessage.Append("姓名不能为空");
    }

    4.模型校验成功后,添加到List中来,最后集合添加到数据库

       var person = new Spl_PersonModel();
                    person.Id = "";
                    person.Name = data[1][2].Value.ToString();
                    person.Sex = data[2][2].Value.ToString();
                    person.Age = Convert.ToInt32(data[3][2].Value);
                    person.IDCard = data[4][2].Value.ToString();
                    person.Phone = data[5][2].Value.ToString();
                    person.Email = data[6][2].Value.ToString();
                    person.Address = data[7][2].Value.ToString();
                    person.Region = data[8][2].Value.ToString();
                    person.Category = data[9][2].Value.ToString();

    5.保存数据调用简单类型的即可

    还是 public void SaveImportData(IEnumerable<Spl_PersonModel> personList)方法

    总结

    效果还是一样的

    扩展

    如果有时候你的文件处理的逻辑很多,时间好几秒,那么你可能需要加个进度提示

    简单的loading代码如下:(开始导入时候调用,结束的时候关闭。)

     <div id="over" class="over"></div>
     <div id="layout" class="layout"><img src="~/Content/images/loading.gif" /></div>
    
    <script type="text/javascript">
            function showLoading() {
                    $("#over").show();
                    $("#layout").show();
                }
                function hideLoading()
                {
                    $("#over").hide();
                    $("#layout").hide();
                }
            </script>
      <style type="text/css">
                 .over{top:0;left:0;z-index:9999999;100%;height:100%;opacity:.5}.layout,.over{position:absolute;display:none}.layout{top:40%;left:40%;z-index:100000000;20%;height:20%;text-align:center}
            </style>

    效果如下:

    有时候我们的表模就是这样的,并不是都是列表形式,这是,这个方法就帮到我你,简单粗暴

    下载代码:动手体验一下,稳固知识

    链接:http://pan.baidu.com/s/1i48Lg8l 密码:vq0g

  • 相关阅读:
    配置java 环境变量(jdk)
    R语言的神奇之一--基于向量
    python绘制图形(Turtle模块)
    右键菜单中新建记事本选项丢失的解决办法
    在windows下远程访问linux服务器
    针对Chrome谷歌等浏览器不再支持showModalDialog的解决方案
    导入一个新项目需要注意的几大问题(jdk1.6+eclipse4.4+tomcat6)
    【漏洞公告】Tomcat信息泄漏和远程代码执行漏洞:CVE-2017-12615/CVE-2017-12616
    python基础篇10-py2和py3编码
    python基础篇03-range/for/break/continue/while/if
  • 原文地址:https://www.cnblogs.com/ymnets/p/6089982.html
Copyright © 2011-2022 走看看