• 再来一个XLSX的批量管理实例操作,这个要复杂一些,是我们管理终端

    创建实体

  • 先进行表的MODEL.xml编写

image.png

  • 内容如下

    1. <Table Name="Terminal" Description="终端管理" RenderGenEntity="True">
    2. <Columns>
    3. <Column Name="ID" DataType="Int32" Identity="True" PrimaryKey="True" Description="编号" />
    4. <Column Name="TerminalType" DataType="String" Description="终端类型" />
    5. <Column Name="TerminalName" DataType="String" Description="终端名称" />
    6. <Column Name="StringCode" DataType="String" Description="串码" />
    7. <Column Name="Region" DataType="String" Description="支局,区域" />
    8. <Column Name="CEOName" DataType="String" Description="支局长" />
    9. <Column Name="Receiver" DataType="String" Description="领用人" />
    10. <Column Name="TerminalState" DataType="String" Description="状态" />
    11. <Column Name="GrantDate" DataType="DateTime" Description="发放时间" />
    12. <Column Name="Bei1" DataType="String" Description="备注1" />
    13. <Column Name="Bei2" DataType="String" Description="备注2" />
    14. <Column Name="CreateUser" DataType="String" Description="创建者" />
    15. <Column Name="CreateTime" DataType="DateTime" Description="创建时间" />
    16. <Column Name="UpdateTime" DataType="DateTime" Description="更新时间" />
    17. </Columns>
    18. </Table>
  • 生成实体,在build_netcore.tt工具上点右键,使用自定义工具

image.png

  • 生成了终端管理的.cs

image.png

  • 然后按F5,运行项目,再用数据库软件打开看,表已新建拉。

image.png

区域菜单添加

  • 要用魔方的后台管理这个表,就要增加区域
  • 区域我们用那个业务区域就OK拉,在Areas/Business/Controllers下,新建控制器TerminalController.cs,
  • 将控制器上面的改一下:

    1. [BusinessArea]
    2. [DisplayName("终端管理")]
    3. public class TerminalController : EntityController<Terminal>
    4. {
    5. protected override IDictionary<MethodInfo, Int32> ScanActionMenu(IMenu menu)
    6. {
    7. menu.Visible = true;
    8. return base.ScanActionMenu(menu);
    9. }
  • 测试一下,区域菜单出来拉。

image.png

  • 看见菜单有了,但右边是空的?这个是哪里有问题哩?
  • 但分析后找到原因,新建的控制器中,一定不能写index()方法 ,删 除就OK拉

image.png

终端的批量录入

  • 因为终端的发放不可能一台一台的发,这样录入也不方便,所以这里新增终端就是指的批量导入XLSX进行批量录入拉。
  • 因为CreateUser,CreateTime,UpdateTime三个字段是自动生成,所以在导入XLSX表的模板中是不需要的
  • 刚才新建了一个ADDTerminal视图,现在增加这个菜单

image.png

  • 然后注意要在角色那里,给这个菜单新增的,打上个勾,然后F5,刷新,即可看到这个终端菜单拉。

  • 因为终端表比较复杂,我主要想,一是实现批量上传,二是实现批量修改,但在批量修改的时候,分得很细,改状态的只需要上传二列数据,一个串码,一个状态,没必要把上传表整复杂了。也可以修改责任人和其他人员等。
  • 前台代码:

    @{
      Layout = "_Layout1";
    }
    <div class="uim_addtitle">
      <h2>终端管理界面</h2>
      <div class="uim_npoi text-left">
          <a href="~/Business/UimCard/fullimport" class="btn btn-default" target="_blank">导入整表</a> | 用于整个表的发放批量导入插入数据库
    
      </div>
      <hr />
      <div class="uim_npoi text-left">
          <a href="~/Business/UimCard/fullimport" class="btn btn-default" target="_blank">修改状态</a> | 用于对指定的串码修改状态
      </div>
      <hr />
      <div class="uim_npoi text-left">
          <a href="~/Business/UimCard/fullimport" class="btn btn-default" target="_blank">全字段修改</a> | 用于对指定串码进行批量导入进行所有字段的修改
      </div>
      <hr />
      <div class="uim_npoi text-left">
          <a href="~/Business/UimCard/fullimport" class="btn btn-default" target="_blank">修改支局及支局长</a> | 用于对支局及支局CEO名称进行修改
      </div>
      <hr />
      <div class="uim_npoi text-left">
          <a href="~/Business/UimCard/fullimport" class="btn btn-default" target="_blank">修改最终发放人</a> | 可以个修改支局发给谁的,除非支局提供
      </div>
      <hr />
    </div>
    
  • 效果

image.png

  • 现在开始实现批量导入功能,先改第一个按钮

    a href="~/Business/Terminal/fullimportTerminal" class="btn btn-default" target="_blank">导入整表</a>
    
  • 然后后台

    [HttpGet]
          public IActionResult fullimportTerminal( )
          {
    
              return View();
          }
    
  • 生成视图

然后在这里我才发现,我做卡的时候,为什么要新建一个error视图来显示哩,笨死了,在本页面多好httpget

  • 现在上后台代码 ``` [HttpGet]

      public IActionResult FullimportTerminal()
      {
         ViewBag.error1 = "";
          var xx =new List<string>();
          ViewBag.errortext2 = xx;
          return View();
      }
      [HttpPost]
      public IActionResult FullimportTerminal(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)
          {
              ViewBag.error1 = "未选择文件上传,文件名为空拉!";
              return View();
          }
          //格式限制
          var allowType = new string[] { "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" };
          if (excelfile1.Any(b => !allowType.Contains(b.ContentType)))
          {
              ViewBag.error1 = "只能上传Excel 2007 格式文件拉!";
              return View();
    
          }
          //大小限制
          if (excelfile1.Sum(b => b.Length) >= 1024 * 1024 * 10)
          {
              ViewBag.error1 = "上传文件的总大小只能在10M以下拉!";
              return View(); 
          }
          //设置一个出错的序号进去list<string>,到时返回前台, ViewBag.errortext2就是这个get方法
          List<string> errornum = new List<string>();
          //开始try文件的读取
          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;
              //定义一个出错的序列号初始值
              int errnum = 0;
              try
              {
                  //i是指行数,从2开始要因为1行是标题
                  for (int i = 2; i <= row; i++)
                  {
                      //组errnumm赋成I值,便于insert出错分析
                      errnum = i;
                      //分析串码是否存在
                      string ifcode = workSheet.Cells[i, 4].Value?.ToString();
                      var mm = Terminal.FindAll(Terminal._.StringCode.Contains(ifcode));
                      if (mm.Count != 0)
                      {
                          errornum.Add(ifcode + "系统已存在!"); ;
                      }
                      else { 
                      var uimcard = new Terminal
                      {
                          TerminalType = workSheet.Cells[i, 2].Value?.ToString(),
                          TerminalName = workSheet.Cells[i, 3].Value?.ToString(),
                          StringCode = workSheet.Cells[i, 4].Value?.ToString(),
                          Region = workSheet.Cells[i, 5].Value?.ToString(),
                          CEOName = workSheet.Cells[i, 6].Value?.ToString(),
                          Receiver = workSheet.Cells[i, 7].Value?.ToString(),
                          TerminalState = workSheet.Cells[i, 8].Value?.ToString(),
                          GrantDate = DateTime.Parse(workSheet.Cells[i, 9].Value.ToString()),
                          Bei1 = workSheet.Cells[i,10].Value?.ToString(),
                          Bei2 = workSheet.Cells[i,11].Value?.ToString(),
    
                      };
                      uimcard.Insert();
    
                      }
                  }
    
              }
              catch (Exception ex)
              {
                  ViewBag.error1 = errnum + "行左右导入被中断出错拉!";
                  return View();
    
            }
        }
        catch (Exception ex)
        {
            ViewBag.error1 = "请上传正确的excel!";
            return View();

        }

        ViewBag.error1 = "导入表插入数据库全部完成!!";
         ViewBag.errortext2 = errornum;
        return View();
    }

- 然后点击上传

![image.png](https://cdn.nlark.com/yuque/0/2021/png/1174002/1617350193525-0d918b06-2829-45e9-bd07-ab715b5268e2.png#height=212&id=utpGa&margin=%5Bobject%20Object%5D&name=image.png&originHeight=212&originWidth=566&originalType=binary&ratio=1&size=15438&status=done&style=none&width=566)

- 在数据库表中也全部正常

![image.png](https://cdn.nlark.com/yuque/0/2021/png/1174002/1617350218490-8f0087e9-66b5-418f-9841-1f0a938e0418.png#height=205&id=SSxn4&margin=%5Bobject%20Object%5D&name=image.png&originHeight=205&originWidth=914&originalType=binary&ratio=1&size=31265&status=done&style=none&width=914)

- 我们再测试一下已存在的串码插入

![image.png](https://cdn.nlark.com/yuque/0/2021/png/1174002/1617350593901-1ee33f0f-eeb3-4c28-a430-57f498f14dc0.png#height=353&id=Tx848&margin=%5Bobject%20Object%5D&name=image.png&originHeight=353&originWidth=1009&originalType=binary&ratio=1&size=31070&status=done&style=none&width=1009)

- 呵,正功显示并不在插入
- 然后我利用这个功能,先将近几个月的终端全部插入数据库
<a name="FerdV"></a>
## 导入更改状态

- 很多时候,我只需改状态,只需要二列,只有两列,一列串码,一列状态
- 简单快捷,写个HHTPGET方法 ,并生成视图

[HttpGet] public IActionResult EditCodeState() { ViewBag.error1 = “”; var xx = new List(); ViewBag.errortext2 = xx; return View(); }


- 然后,前台

@{ Layout = “_Layout1”; }

修改串码状态

模板只需二列,一列串码,一列状态

        <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>



@{ if (ViewBag.errortext2 != null) { List list = ViewData[“errortext2”] as List; foreach (string item in list) {
  • @item
  • }

    }
    

    }

    
    - httppost方法
    

    [HttpPost] public IActionResult EditCodeState(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) { ViewBag.error1 = “未选择文件上传,文件名为空拉!”; return View(); } //格式限制 var allowType = new string[] { “application/vnd.openxmlformats-officedocument.spreadsheetml.sheet” }; if (excelfile1.Any(b => !allowType.Contains(b.ContentType))) { ViewBag.error1 = “只能上传Excel 2007 格式文件拉!”; return View();

            }
            //大小限制
            if (excelfile1.Sum(b => b.Length) >= 1024 * 1024 * 10)
            {
                ViewBag.error1 = "上传文件的总大小只能在10M以下拉!";
                return View();
            }
            //设置一个出错的序号进去list<string>,到时返回前台, ViewBag.errortext2就是这个get方法
            List<string> errornum = new List<string>();
            //开始try文件的读取
            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;
                //定义一个出错的序列号初始值
                int errnum = 0;
                try
                {
                    //i是指行数,从2开始要因为1行是标题
                    for (int i = 2; i <= row; i++)
                    {
                        //组errnumm赋成I值,便于insert出错分析
                        errnum = i;
                        //分析串码是否存在
                        string ifcode = workSheet.Cells[i, 1].Value?.ToString();
                        var uimcardEdit = Terminal.Find(Terminal._.StringCode.Contains(ifcode));
                        if (uimcardEdit == null)
                        {                             
                            errornum.Add(ifcode + "不存在!"); 
                        }
                        else
                        {
                            uimcardEdit.TerminalState = workSheet.Cells[i, 2].Value?.ToString();
                            uimcardEdit.Update();
    
                        }
                    }
    
                }
                catch (Exception ex)
                {
                    ViewBag.error1 = errnum + "行左右导入被中断出错拉!";
                    return View();
    
                }
            }
            catch (Exception ex)
            {
                ViewBag.error1 = "请上传正确的excel!";
                return View();
    
            }
    
            ViewBag.error1 = "导入修改数据全部完成!!";
            ViewBag.errortext2 = errornum;
            return View();
        }
    

    ``` 然后以止方法,再写其他三个批量导入修改。OK,完工。