mvc5+ef+ adminlte教程15:NPOI 导入和导出exlce(以上章的echars图表中的表为例 ) (2017-06-16 19:44)
本来上章是准备用LinqToExcle的,但那家伙,竟然 要求安装OFFICE组件,要不出错。于是果断放弃,使用NPoi
1.下载
先去官网:http://npoi.codeplex.com/下载
然后右边有一个大大的DOWNLOAD,点击,然后选择最新的版本,我现在能下的是2.2.1版本Npoi
然后解压后,好几个dll文件进行引用。
但我却懒 得这么做,因为我在安装包中竟然能搜到,而且2.3版本。
3.实现数据库表的导出
.在前台加一个导出按钮
@Html.ActionLink("导出Excle", "ToExlce", "", new { @class = "btn btn-info" })
然后后台增加代码
//导出的方法Npoi public FileResult ToExlce() { //创建Excel文件的对象 HSSFWorkbook book = new HSSFWorkbook(); //添加一个sheet ISheet sheet1 = book.CreateSheet("Sheet1"); //获取list数据,我把网上的示范改了,直接用数据表中的数据进行LIST List<Echarone> listRainInfo = db.Echarones.ToList(); //给sheet1添加第一行的头部标题 NPOI.SS.UserModel.IRow row1 = sheet1.CreateRow(0); row1.CreateCell(0).SetCellValue("序号"); row1.CreateCell(1).SetCellValue("栏目ID"); row1.CreateCell(2).SetCellValue("主体"); row1.CreateCell(3).SetCellValue("任务数"); row1.CreateCell(4).SetCellValue("完成数"); row1.CreateCell(5).SetCellValue("排序"); //将数据逐步写入sheet1各个行 for (int i = 0; i < listRainInfo.Count; i++) { NPOI.SS.UserModel.IRow rowtemp = sheet1.CreateRow(i + 1); rowtemp.CreateCell(0).SetCellValue(listRainInfo[i].Id.ToString()); rowtemp.CreateCell(1).SetCellValue(listRainInfo[i].EcharColmnId.ToString()); rowtemp.CreateCell(2).SetCellValue(listRainInfo[i].ObjNmae.ToString()); rowtemp.CreateCell(3).SetCellValue(listRainInfo[i].TaskDondeOne.ToString()); rowtemp.CreateCell(4).SetCellValue(listRainInfo[i].TaskDondeTwo.ToString()); rowtemp.CreateCell(5).SetCellValue(listRainInfo[i].Sort.ToString()); } // 写入到客户端 System.IO.MemoryStream ms = new System.IO.MemoryStream(); book.Write(ms); ms.Seek(0, SeekOrigin.Begin); return File(ms, "application/vnd.ms-excel", "图表数据.xls"); }
然后点击导出
会自动下载EXCE表,打开就是数据库中的数据。
成功,上面有个小错误,我当时把排序也写在第4列了,所以导致完成数被排序数所覆盖。
更改好正常。
三、导入功能
导入就比较麻烦了,经测试只能使用XLS的文件,2007生成的XLSX的要出错。
1.新建一个XLS表,内容和数据库中对应,第一行为字段名,因为我没有写字段名,所以第一行未能成功写入。
2.前台。
先在indexlist视图中增加了一个导入按钮,然后点击转入到Import视图和控制器。
在import控制器中,他读出所有的Echareones有中的数据。
最主要是上面有一个bootstrap 样式的fileupdate,就是上传的操作。
(1)先上传文件
(2)上传文件后在后台保存
(3)用npoi读出来。删除原有所有数据,然后每一行为一个MODEL,进行ADD,最后save.change()
@model IEnumerable<jsdhh2.Models.Echarone> @{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_AdminLayout.cshtml"; } <!-- Content Header (Page header) --> <section class="content-header"> <h1> 导入数据库 <small>导入电子表格,请注意模板</small> </h1> <ol class="breadcrumb"> <li><a href="#"><i class="fa fa-dashboard"></i> Level</a></li> <li class="active">Here</li> </ol> </section> <!--end Content Header (Page header) --> <section class="content"> <div class="panel panel-default"> <div class="panel-heading"> @Html.ActionLink("新建", "Create", "", new { @class = "btn btn-success" }) </div> <div class="panel-body"> <!-- button --> @using (Html.BeginForm("Browse", "Echarones", FormMethod.Post, new { enctype = "multipart/form-data", id = "form_Upload" })) { @Html.AntiForgeryToken() //防止跨站请求伪造(CSRF:Cross-site request forgery)攻击 <input id="input-41" name="input41[]" type="file" multiple class="file-loading"> <hr> <button type="submit" class="btn btn-primary">上传</button> <button type="reset" class="btn btn-default">清除</button> } <h2></h2> <table class="table"> <tr> <th> 栏目ID </th> <th> 主体名 </th> <th> 任务 </th> <th> 完成 </th> <th> 排序 </th> <th></th> </tr> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.EcharColmnId) </td> <td> @Html.DisplayFor(modelItem => item.ObjNmae) </td> <td> @Html.DisplayFor(modelItem => item.TaskDondeOne) </td> <td> @Html.DisplayFor(modelItem => item.TaskDondeTwo) </td> <td> @Html.DisplayFor(modelItem => item.Sort) </td> <td> @Html.ActionLink("修改", "Edit", new { id = item.Id }) | @Html.ActionLink("删除", "Delete", new { id = item.Id }) </td> </tr> } </table> </div> </section> @section scripts{ <link href="~/Content/bootstrap-fileinput/css/fileinput.css" rel="stylesheet" /> <script src="~/Content/bootstrap-fileinput/js/fileinput.js"></script> <script> $(document).on('ready', function () { $("#input-41").fileinput({ maxFileCount: 10, maxFileSize: 1000, allowedPreviewTypes: ['other'], allowedFileExtensions: ['xlsx','xls'] }); }); </script> }
2.后台方法。
//显示所有的图表中的数据 public async Task<ActionResult> IndexList() { return View(await db.Echarones.ToListAsync()); }
上面是IndexList()
正同是重点
//导入的操作 public ActionResult Import() { return View( db.Echarones); } //上传方法 public ActionResult Browse() { //int saveCount = 0; //定义变量 //if (ModelState.IsValid && !string.IsNullOrEmpty(id)) //{} var files = Request.Files; if (files.Count > 0) { var file = files[0]; string strFileSavePath = Request.MapPath("~/Content/Excle"); //定义上传目标地址 string strFileExtention = Path.GetExtension(file.FileName); if (!Directory.Exists(strFileSavePath)) { Directory.CreateDirectory(strFileSavePath); } var dt = DateTime.Now; string str = dt.ToString("yyyyMMddHHmmss"); var savePath = strFileSavePath + "/" + str + strFileExtention; //拼接保存文件路径 file.SaveAs(strFileSavePath + "/" + str + strFileExtention); //保存文件 //导入的代码 HSSFWorkbook hssfworkbook; try { //读出表中数据 using (FileStream filesw = new FileStream(savePath, FileMode.Open, FileAccess.Read)) { hssfworkbook = new HSSFWorkbook(filesw); } //删除所有的数据,就是清空表原有数据 List<Echarone> xx = db.Echarones.ToList(); db.Echarones.RemoveRange(xx); } catch (Exception e) { throw e; } ISheet sheet = hssfworkbook.GetSheetAt(0) ; //DataTable table = new DataTable(); IRow headerRow = sheet.GetRow(0);//第一行为标题行 int cellCount = headerRow.LastCellNum; //LastCellNum = PhysicalNumberOfCells int rowCount = sheet.LastRowNum;//LastRowNum = PhysicalNumberOfRows - 1 //handling header. for (int i = (sheet.FirstRowNum + 1); i <= rowCount; i++) { IRow row = sheet.GetRow(i); //DataRow dataRow = table.NewRow(); if (row != null) { //for (int j = row.FirstCellNum; j < cellCount; j++) //{ // if (row.GetCell(j) != null) // dataRow[j] = GetCellValue(row.GetCell(j)); //} Echarone echarones = new Echarone(); echarones.EcharColmnId = row.GetCell(1).ToString(); echarones.ObjNmae = row.GetCell(2).ToString(); echarones.TaskDondeOne = System.Convert.ToDouble(row.GetCell(3).ToString()); echarones.TaskDondeTwo = System.Convert.ToDouble(row.GetCell(4).ToString()); echarones.Sort = Convert.ToInt32(row.GetCell(5).ToString()); db.Echarones.Add(echarones); } } db.SaveChanges(); ///删除上传的表格文件 System.IO.File.Delete(savePath); return RedirectToAction("Import", "Echarones"); } return View(); }
经测试,完全正确。