导入表格数据

											导入表格数据
(开发工具与关键技术:VS  .NET MVC 作者:纳兹,撰写日期:2019.06.08 ,源于:老师上课教程)

下面图片为导入表格数据的演示过程,点击Browse选择Excel表格导入表格数据进来数据库,最终在页面表格显示导入的表格数据。
以导入考生信息为例:导入表格首先要下载模板,下载模板要先获取模板路径(string filePath = Server.MapPath("~/Document/Template/考生信息导入模板.xls"))。然后判断模板是否存在,用if(System.IO.File.Exists(filePath))判断,首先获取文件名称(string fileName = Path.GetFileName(filePath)),然后返回文件(return File(new FileStream(filePath, FileMode.Open), “application/octet-stream”, fileName)),否则else返回(return Content(“模板文件不存在,请联系系统运维人员。”))。
接着将导入的Excel表格的数据保存导Session中:首先实例化一下ReturnJsonVo,再用try…catch捕获一下异常。在try里面首先获取到读取的文件,接着把获取到的文件转化为二进制数组,再将二进制数组转化为内存流,最后利用NPOI把内存流中的数据读取成Excel,使用NPOI之前需要再引用哪里添加NPOI的引用。获取读取的文件要把session中的ImportExcel移除避免残留以前的数据(Session.Remove(“ImportExcel”));接着判断页面传递过来的文件是否为Excel表格的形式,通过获取传递过来的文件后缀名判断(string fileExtension = System.IO.Path.GetExtension(file.FileName)),用if判断((".xls".Equals(fileExtension) || “.XLS”.Equals(fileExtension))),首先声明一个二进制数组来存放文件(byte[] fileBytes = new byte[file.ContentLength]),接着将传入的文件转化为二进制的数组存入fileBytes(file.InputStream.Read(fileBytes, 0, file.ContentLength)),再将二进制的数组转化为内存流的形式(MemoryStream excelFileStream = new MemoryStream(fileBytes)),再将内存流转化为工作簿(NPOI.SS.UserModel.IWorkbook workbook= new NPOI.HSSF.UserModel.HSSFWorkbook(excelFileStream)),接着判断工作簿中是否有工作表(if (workbook.NumberOfSheets > 0)),这里以考生信息为例子,所以需要查询出学院、专业、年级、班级的信息,根据它们的ID查询出对应的名称:代码如下:(List dbAcademe = (from tbAcademe in myModels.SYS_Acadece select tbAcademe).ToList());查询出来数据,接着声明一个对象列表,用于存放导入Excel表格的学生信息(ListlistStudentVo=new List());接着获取到第一个工作表(NPOI.SS.UserModel.ISheet sheet = workbook.GetSheetAt(0)),再继续判断工作表中是否有数据(if (sheet.PhysicalNumberOfRows > 0)),这里的PhysicalNumberOfRows获取的是物理行数,也就是不包括那些空行(隔行)的情况,将数据封装到DataTable中,定义dataTable(DataTable dtExcel = new DataTable()),获取标题行(NPOI.SS.UserModel.IRow rowHeader = sheet.GetRow(0)),再获取表格列数(int cellCount = rowHeader.LastCellNum),获取表格行数(最后一行下标+1)(int rowCount = sheet.LastRowNum + 1);接着创建datatable中的列,用for循环添加标题中各个单元格的数据(for (int i = rowHeader.FirstCellNum; i < cellCount; i++)),遍历表头行中的每一个单元格,获取到标题行的每一个单元格的数据(DataColumn dtColumn = new DataColumn(rowHeader.GetCell(i).StringCellValue)),将获取到的标题行的数据存放到dataTable中(dtExcel.Columns.Add(dtColumn))。接着读取Excel表格中的数据,用for循环读取Excel表格里面的数据,首先获取行的数据(NPOI.SS.UserModel.IRow row = sheet.GetRow(i)),然后创建DatTable行(DataRow dtRow = dtExcel.NewRow()),接着用if判断行是否为空,判断完了再将新行添加到datatable中(dtExcel.Rows.Add(dtRow))。接着声明两个变量一个记录成功条数(int ImportSuccess = 0)、一个记录导入失败条数(int ImportFail = 0)。接着用foreach循环遍历dataTable中的数据(foreach (DataRow row in dtExcel.Rows)),创建studentVo对象保存每一条数据,再用try…catch捕获一下异常,再try里面通过获取ID和名称来获取相对应的信息,并将每一条数据都添加到对象列表中去(listStudentVo.Add(student)),记录成功条数(ImportSuccess++),在catch里面捕获导入失败的异常。接着将数据并保存到session中(Session[“ImportExcel”] = listStudentVo)),返回值为真则提示匹配成功的信息;否则else返回false,输出数据表为空或工作簿中没有数据表或文件类型错误,最后catch捕获最开始try里面发生的异常;最后返回数据。
接着需要获取到session中的数据,并对这些数据进行分页操作:实例化(List listStudentVo = new List()),接着用if判断存进session里的数据不等于空值,然后计算总条数(int totalRow = listStudentVo.Count()),接着实例化一下LayuiTableData,LayuiTableData有两个值是必须使用的,所以要实例化一下LayuiTableData;然后返回数据(return Json(layuiTableData, JsonRequestBehavior.AllowGet))。
导入之后需要保存到数据库中:首先声明一个变量,用try…catch捕获一下异常。在try里面声明两个变量:一个记录保存成功条数;一个记录因为数据库已经有相同的数据而保存失败的条数;实例化(List listStudentVo = new List()),用if判断(if (Session[“ImportExcel”] != null))判断保存到session的数据不等于空;接着用foreach遍历循环session中的数据,在foreach里面判断数据是否与数据库中已有数据重复,再用if判断导入新增的数据,当(myModels.SaveChanges() > 0)则成功保存到数据库,否则else保存失败,(else)保存失败可能是某张表数据不完整。成功则弹出成功导入几条数据的显示框。如果try里面发生了异常,在catch里面会捕获到异常,最后返回数据。
以上为导入数据表格的简述。导入表格数据_第1张图片
导入表格数据_第2张图片
导入表格数据_第3张图片

你可能感兴趣的:(导入表格数据)