利用Eppluscf 表的导入数据库

  • 其实在做完这个之后很久,才反应过来,应该将处理处理结果返回本视图HTTPGET方法的,而我错误的想象了自己写一个ERROR页面,显示出错和处理情况,当list结果过大的时候,他会以参数的POST方式显在地址上,让IE掉了
  • 首先我们学习一下怎么将一个表中的数据全部导入,插入到表中去。
  • 在选择使用上,我还是选择了EPPlus,但在安装EPPLUS.CORE时,提示已弃用,建议使用Epplus,但我安装的是EPPlus 。也支持.core

image.png

  • 先创建个菜单链接

    1. <a href="~/Business/UimCard/fullimport" class="btn btn-default" target="_blank">导入整表</a> |
  • 然后写一个fullimport方法 ,并生成视图,这里主要就是上传文件的界面拉,因为我最后想实现,导入完整表,插入数据表,也可以导入部份表,比如两列,按其中一例的字段进行修改。

  • 那么这个上传这里我可以做几个from,先做第一个整表插入。

    public IActionResult fullimport()
      {
    
          return View();
      }
    
  • 在前台添加上传HTML代码,这步干了我二个小时,我现在都不知道啥原因,问的时候回答的人少,百度又不了,就是F5的时候,只有第一次点上传会到后台,然后第二次需要关掉IE,重新F5才能进后台断点

      <form method="post" action="~/Business/UimCard/fullimport1" enctype="multipart/form-data" multiple="multiple">
          <div class="form-group">
    
              <label>请选择xlsx文件</label>
              <input type="file" name="excelfile">
              <p class="help-block">注意要XLSX版本,同时注意模版哟!</p>
              @*<input type="text" class="form-control" name="StratId" placeholder="输入起启号卡" onkeyup="this.value=this.value.replace(/\D/g,'')">*@
          </div>
          <button type="submit" class="btn btn-default">提交</button>
      </form>
    
  • 下面是WEB效果

image.png

  • 后台代码,我选择了不保存在服务器,确实没啥,意思,保存了,又打开,连百度几个都不得行。
  • 直接打开,进行逐条插入。 ``` [HttpPost]

      public ActionResult fullimport1(IFormFile excelfile)
      {
          ////var excelfile=Request.Form.file IFormCollection excelfile
          var excelfile1 = Request.Form.Files.Where(x => x.Name.Equals("excelfile"));
    
          //上传文件没有,同时对10M以上的不给予导入
          if (excelfile1 == null || excelfile1.Count() <= 0)
          {
              return RedirectToAction("Error", "UimCard", new { ErrorText = "未选择文件上传,文件名为空拉!" });
          }
          //格式限制
          var allowType = new string[] { "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" };
          if (excelfile1.Any(b => !allowType.Contains(b.ContentType)))
          {
              return RedirectToAction("Error", "UimCard", new { ErrorText = "只能上传Excel 2007 格式文件" });
          }
          //大小限制
          if (excelfile1.Sum(b => b.Length) >= 1024 * 1024 * 10)
          {
              return RedirectToAction("Error", "UimCard", new { ErrorText = "上传文件的总大小只能在10M以下" });
          }
          ///保存文件 
          ///
          /// 
          //设置一个出错的序号进去list<string>,到时返回前台, 
          List<string> errornum = new List<string>();
          //给表起个保存的名字,我为什么要取固定不取guid随及哩,这种导入只用一次,不停的改名字到时导入多了,文件 夹中全是,固定的会覆盖。
          //var fileName = @"uimimport.xlsx";
          //    //设置文件保存路径
          //    var filepath= Directory.GetCurrentDirectory() + "\\Upload";
          //var path = Path.Combine(filepath, fileName);
          //    //保存文件 
          //    using (var stream = System.IO.File.Create(path))
          //    {
          //        excelfile1.Copy(stream);
          //    }
          //    //获取文件信息
          try
          {
              ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial;
              using ExcelPackage package = new ExcelPackage(excelfile.OpenReadStream());
              var workSheet = package.Workbook.Worksheets[0];
              int row = workSheet.Dimension.Rows;
              int colomn = workSheet.Dimension.Columns;              
             try
              {
                  for (int i=2; i <= row; i++)
                  {
                      var uimcard = new UimCard
                      {
                          CardId = workSheet.Cells[i,2].Value?.ToString(),
                          County = workSheet.Cells[i, 3].Value?.ToString(),
                          Region = workSheet.Cells[i,4].Value?.ToString(),
                          BPSName = workSheet.Cells[i,5].Value?.ToString(),
                          Receiver = workSheet.Cells[i,6].Value?.ToString(),
                          CardState = workSheet.Cells[i,7].Value?.ToString(),
                          Bei1 = workSheet.Cells[i,8].Value?.ToString(),
    
                      };
                      uimcard.Insert();
                      //将完成的序号加在list<string>中
                      errornum.Add(workSheet.Cells[i, 2].Value?.ToString());
                  }
    
              }
              catch (Exception ex)
              {
                  return RedirectToAction("Error1", "UimCard", new { ErrorText = "导入被中断出错拉", errornum });
    
              }
          }
          catch (Exception ex)
          {
              return RedirectToAction("Error", "UimCard", new { ErrorText = "请上传正确的excel!" });
    
          }
          return RedirectToAction("Error", "UimCard", new { ErrorText = "插入完成!" });
          //return RedirectToAction("Error1", "UimCard", new
          //{
          //    ErrorText = "导入操作完成!",
          //    errornum
          //});
    
    }

- 插入完成后,他会提示一个插入完成。
- 但实际我想将完成操作的所有卡号显示出来。

//return RedirectToAction(“Error1”, “UimCard”, new //{ // ErrorText = “导入操作完成!”, // errornum //});


- 然后error1,会通过

public IActionResult Error1(string ErrorText,List errornum) { ViewBag.errortext = ErrorText; ViewBag.errortext2 = errornum; return View(errornum); }


- 通过viewbag将这个LIST送到前台,

@{ List list = ViewData[“errortext2”] as List; foreach (string item in list) {

  • @item
  • } }

    
    - 结果确衫可行,但发觉他会把操作的list(string)送在地址栏中,很多XLSX上传的时候,他就会出现网页打不开,但后台又全部插入进去了。所以我就把成功的去掉了。
    
    ![image.png](https://cdn.nlark.com/yuque/0/2021/png/1174002/1616938131830-1abdbd81-fa4a-4bff-a1b7-63657612430f.png#align=left&display=inline&height=166&margin=%5Bobject%20Object%5D&name=image.png&originHeight=166&originWidth=862&size=10239&status=done&style=none&width=862)
    
    - 现在正确的完成
    
    ![image.png](https://cdn.nlark.com/yuque/0/2021/png/1174002/1616938190160-5b74c9f6-144a-4f30-8c6d-b11081b9d5a6.png#align=left&display=inline&height=135&margin=%5Bobject%20Object%5D&name=image.png&originHeight=135&originWidth=342&size=5215&status=done&style=none&width=342)
    
    - 数据库
    
    ![image.png](https://cdn.nlark.com/yuque/0/2021/png/1174002/1616938204602-5c432780-0045-40b2-9cb3-ee98a04da163.png#align=left&display=inline&height=205&margin=%5Bobject%20Object%5D&name=image.png&originHeight=205&originWidth=344&size=16132&status=done&style=none&width=344)
    
    <a name="zZxVY"></a>
    ## 导入XLS批量修改信息
    
    - 还有个功能是批量修改信息,我觉得很常用。
    - 对于我来说,主要是修改这批卡发给了谁,就是发放人,更主要是修改状态,这批卡号是否可用。
    - 先是准备通过cardId字段进行修改,但后来一想,这样就要做几个按钮功能,其实完全可以就是这个表的整模板,需要修改的这几栏都填上,一并修改,为空的时候则不作修改?先测试。
    - 为了方便 ,我前期还是要所有表中内容都填好,没有空格
    - 这个表关键值就是cardID,当他相等的时候进行修改
    
    前台的上传页面,都在这个fullimport页面中一起拉。
    
    <form method="post" action="~/Business/UimCard/fullimport2" enctype="multipart/form-data" multiple="multiple">
        <div class="form-group">
    
            <label>请选择xlsx文件</label>
            <input type="file" name="excelfile">
            <p class="help-block">注意要XLSX版本,同时注意模版哟!</p>
            @*<input type="text" class="form-control" name="StratId" placeholder="输入起启号卡" onkeyup="this.value=this.value.replace(/\D/g,'')">*@
        </div>
        <button type="submit" class="btn btn-default">提交</button>
    </form>
    
    
    - 前台效果
    
    ![image.png](https://cdn.nlark.com/yuque/0/2021/png/1174002/1616938820478-63050011-586c-4955-9f5b-1f2af6a0c4de.png#align=left&display=inline&height=221&margin=%5Bobject%20Object%5D&name=image.png&originHeight=221&originWidth=874&size=29716&status=done&style=none&width=874)
    
    - 先写一个模板下载
    - 后台代码:
    

    ///

    /// 导入XLS的进行部份信息修改 /// /// /// [HttpPost] public ActionResult fullimport2(IFormFile excelfile) { var excelfile1 = Request.Form.Files.Where(x => x.Name.Equals(“excelfile”)); //上传文件没有,同时对10M以上的不给予导入 if (excelfile1 == null || excelfile1.Count() <= 0) { return RedirectToAction(“Error”, “UimCard”, new { ErrorText = “未选择文件上传,文件名为空拉!” }); } //格式限制 var allowType = new string[] { “application/vnd.openxmlformats-officedocument.spreadsheetml.sheet” }; if (excelfile1.Any(b => !allowType.Contains(b.ContentType))) { return RedirectToAction(“Error”, “UimCard”, new { ErrorText = “只能上传Excel 2007 格式文件” }); } //大小限制 if (excelfile1.Sum(b => b.Length) >= 1024 1024 10) { return RedirectToAction(“Error”, “UimCard”, new { ErrorText = “上传文件的总大小只能在10M以下” }); } //用于存放一起错误的信息 List errornum = new List(); try { ExcelPackage.LicenseContext = OfficeOpenXml.LicenseContext.NonCommercial; using ExcelPackage package = new ExcelPackage(excelfile.OpenReadStream()); var workSheet = package.Workbook.Worksheets[0]; int row = workSheet.Dimension.Rows; int colomn = workSheet.Dimension.Columns; try { for (int i = 2; i <= row; i++) { ///取第一行的数据的Cardid值去表中进行搜索 string cardseach = workSheet.Cells[i, 2].Value?.ToString(); //var uimcardEdit= UimCard.FindAll(UimCard..CardId.Contains(“cardseach”)).FirstOrDefault(); var uimcardEdit = UimCard.Find(UimCard..CardId.Contains(cardseach)); if (uimcardEdit == null) { //将不存在的卡号存入list errornum.Add(cardseach+”不存在!”); } else { //用表中信息进行修改

                            uimcardEdit.County = workSheet.Cells[i, 3].Value?.ToString();
                            uimcardEdit.Region = workSheet.Cells[i, 4].Value?.ToString();
                            uimcardEdit.BPSName = workSheet.Cells[i, 5].Value?.ToString();
                            uimcardEdit.Receiver = workSheet.Cells[i, 6].Value?.ToString();
                            uimcardEdit.CardState = workSheet.Cells[i, 7].Value?.ToString();
                            uimcardEdit.Bei1 = workSheet.Cells[i, 8].Value?.ToString();
    
    
                            uimcardEdit.Update();
                            //将完成的序号加在list<string>中
                            //errornum.Add(workSheet.Cells[i, 2].Value?.ToString());   
                        }
                    }
    
                }
                catch (Exception ex)
                {
                    //return RedirectToAction("Error1", "UimCard", new { ErrorText = "导入被中断出错拉", errornum });
                    return RedirectToAction("Error", "UimCard", new { ErrorText =  "修改出错拉!" });
    
                }
            }
            catch (Exception ex)
            {
                return RedirectToAction("Error", "UimCard", new { ErrorText = "请上传正确的excel!" });
    
            }
            //return RedirectToAction("Error", "UimCard", new { ErrorText = "插入完成!" });
            return RedirectToAction("Error1", "UimCard", new
            {
                ErrorText = "导入操作完成!",
                errornum
            });
    
    
        }
    

    ```

    • 前台效果

    image.png

    批量改卡的状态

    • 其实用得最多就是批改状态,我想了,也就是串码,需要改的状态,比如已使用。