利用Eppluscf 表的导入数据库
- 其实在做完这个之后很久,才反应过来,应该将处理处理结果返回本视图HTTPGET方法的,而我错误的想象了自己写一个ERROR页面,显示出错和处理情况,当list
结果过大的时候,他会以参数的POST方式显在地址上,让IE掉了 - 首先我们学习一下怎么将一个表中的数据全部导入,插入到表中去。
- 在选择使用上,我还是选择了EPPlus,但在安装EPPLUS.CORE时,提示已弃用,建议使用Epplus,但我安装的是EPPlus 。也支持.core
先创建个菜单链接
<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效果
- 后台代码,我选择了不保存在服务器,确实没啥,意思,保存了,又打开,连百度几个都不得行。
直接打开,进行逐条插入。 ``` [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
- 通过viewbag将这个LIST送到前台,
@{
List
- 结果确衫可行,但发觉他会把操作的list(string)送在地址栏中,很多XLSX上传的时候,他就会出现网页打不开,但后台又全部插入进去了。所以我就把成功的去掉了。

- 现在正确的完成

- 数据库

<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>
- 前台效果

- 先写一个模板下载
- 后台代码:
///
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
});
}
```
- 前台效果
批量改卡的状态
- 其实用得最多就是批改状态,我想了,也就是串码,需要改的状态,比如已使用。