要先引用NPOI的插件即可写导入方法。
思路:
(1)判断类型是否是: .xls
一、获取读取的文件; 二、把文件转换为二进制数组;三、二进制数组转成内存流;四、利用NPOI把内存流中的数据读取成工做簿Excel
(2)工做簿中有工做表
(3)工做表有数据
(4)数据准确性
(5)数据都有,而后读取数据。
如下是供参考的方法:
代码实在是有点长,不过代码中的注释写的很是清楚了。web
public ActionResult ImportExcel(HttpPostedFileBase file) { ReturnJson returnJson = new ReturnJson(); try { //把session中的ImportExcel移除避免残留之前数据 Session.Remove("ImportExcel"); //获取文件的后缀 //(1)判断类型是否是: .xls string fileExtension = 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 HSSFWorkbook(excelFileStream); //(2)工做簿中有工做表 if (workbook.NumberOfSheets > 0) { //查询出 学院,专业,年级,班级 的信息:用来根据名称获取对应的ID List<SYS_Academe> dbAcademe = (from tbAcademe in myModels.SYS_Academe select tbAcademe).ToList(); List<SYS_Specialty> dbSpecialty = (from tbSpecialty in myModels.SYS_Specialty select tbSpecialty).ToList(); List<SYS_Grade> dbGrade = (from tbGrade in myModels.SYS_Grade select tbGrade).ToList(); List<SYS_Class> dbClass = (from tbClass in myModels.SYS_Class select tbClass).ToList(); //对象列表 List<Student> listStudentVo = new List<Student>(); //获取第一个工做表 NPOI.SS.UserModel.ISheet sheet = workbook.GetSheetAt(0); //(3)工做表有数据 //判断工做表中是否有数据 if (sheet.PhysicalNumberOfRows > 0) { //(4)数据准确性(学院 专业 年级 班级 表跟表之间的关系) // 定义datatable DataTable dtExcel = new DataTable(); //将数据先装到datatable中 //获取标题行--- 第二行,索引为1;第一行是说明 NPOI.SS.UserModel.IRow rowHeader = sheet.GetRow(1); //获取表格列数 int cellCount = rowHeader.LastCellNum; //获取表格行数 int rowCount = sheet.LastRowNum + 1; //建立dataTable中的列,循环添加标题行中各个单元格的值 for (int i = rowHeader.FirstCellNum; i < cellCount; i++) { //经过遍历行中的每个单元格,获取标题行各个单元格的数据 DataColumn dtColumn = new DataColumn(rowHeader.GetCell(i).StringCellValue); //将获取到的标题行的数据放到datatable中; dtExcel.Columns.Add(dtColumn); } //读取Excel中的数据 //(sheet.FirstRowNum) 第一行是说明;第二行是标题;第三行开始才是数据信息 for (int i = (sheet.FirstRowNum) + 2; i < rowCount; i++) { //获取行(一、二、3...)数据 NPOI.SS.UserModel.IRow row = sheet.GetRow(i);//1 //建立DataTable行 DataRow dtRow = dtExcel.NewRow(); if (row != null) { //遍历excel中一行的全部单元格 for (int j = row.FirstCellNum; j < cellCount; j++) { if (row.GetCell(j) != null) { dtRow[j] = row.GetCell(j).ToString(); } } } //将填入数据的dtRow添入dtExcel dtExcel.Rows.Add(dtRow); } int intSuccess = 0; int intFail = 0; //(4)数据准确性(学院 专业 年级 班级 表跟表之间的关系) //遍历datatable中的数据 foreach (DataRow row in dtExcel.Rows) { //建立studentVo对象保存每一条数据 Student student = new Student(); try { //获取学院ID 和学院名称 student.AcademeName = row["学院"].ToString().Trim(); //经过dataTable中的AcademeName到dbAcademe中查找相应的AcademeID student.AcademeID = dbAcademe.Where(p => p.AcademeName == student.AcademeName).SingleOrDefault().AcademeID; //获取专业id和名称 //根据学院ID和专业名称获取相应的专业ID student.SpecialtyName = row["专业"].ToString().Trim(); student.SpecialtyID = dbSpecialty.Where(p => p.AcademeID == student.AcademeID && p.SpecialtyName == student.SpecialtyName).SingleOrDefault().SpecialtyID; //获取年级ID 和名称 //根据学院ID以及年级名称获取相应的年级ID student.GradeName = row["年级"].ToString().Trim(); student.GradeID = dbGrade.Where(p => p.AcademeID == student.AcademeID && p.GradeName == student.GradeName).SingleOrDefault().GradeID; //获取 班级ID和名称 //根据学院ID&专业ID&班级名称获取班级ID student.ClassName = row["班级"].ToString().Trim(); student.ClassID = dbClass.Where(p => p.AcademeID == student.AcademeID && p.SpecialtyID == student.SpecialtyID && p.GradeID == student.GradeID && p.ClassName == student.ClassName).SingleOrDefault().ClassID; student.StudentNumber = row["学号"].ToString().Trim(); student.StudentName = row["姓名"].ToString().Trim(); student.StudentIDNum = row["身份证号"].ToString().Trim(); student.StudentSex = row["性别"].ToString().Trim(); student.UserNuber = row["帐号"].ToString().Trim(); //将每一条数据都添加到对象列表中 listStudentVo.Add(student); intSuccess++;//记录成功的条数 } catch (Exception e) { Console.WriteLine(e); intFail++;//记录失败的条数 returnJson.State = false; returnJson.Text = "数据处理出错"; } } //把数据保存到Session当中 Session["ImportExcel"] = listStudentVo; returnJson.State = true; //{0},{1}和{2}是占位符,分别给dtExcel.Rows.Count,intSuccess和intFail占位的。 returnJson.Text = String.Format("success;excel文件中共{0}条信息,{1}条匹配成功,{2}条匹配失败", dtExcel.Rows.Count, intSuccess, intFail); } else { returnJson.State = false; returnJson.Text = "工做表数据为空"; } } else { returnJson.State = false; returnJson.Text = "工做簿中没有工做表!"; } } else { returnJson.State = false; returnJson.Text = "选中的文件类型不正确!"; } } catch (Exception e) { Console.WriteLine(e); returnJson.State = false; returnJson.Text = "上传失败,类型不对应;请检查是否有工做表,是否有数据,是否按照模板填写!"; } return Json(returnJson, JsonRequestBehavior.AllowGet); }
内容有点多,须要点耐心看完。数组