今天向大家介绍的是把我导入Excel表格的数据保存到session中,首先呢,给一个方法名为ImportExcel,用HttpPostedFileBase接受页面传过来的文件;然后就开始写代码了:
public ActionResult ImportExcel (HttpPostedFileBase file)
{
先new一个ReturnJsonVo,接下来的操作就写在try、catch中:
ReturnJsonVo returnJson = new ReturnJsonVo();
try
{
1、获取读取的文件;2、把文件转换为二进制数组;3、二进制数组转成内 存流;4、利用NPOI把内存流中的数据读取成Excel
把session中的ImportExcel移除避免残留以前数据
Session.Remove(“ImportExcel”);
判断页面传过来的文件是否为Excel表格;
通过GetExtension来获取文件的后缀
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<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 listStudentVo = new List();
获取第一个工作表
NPOI.SS.UserModel.ISheet sheet = workbook.GetSheetAt(0);
PhysicalNumberOfRows 获取的是物理行数,
也就是不包括那些空行(隔行)的情况。
判断工作表中是否有数据
if (sheet.PhysicalNumberOfRows > 0)
{
将数据装到DataTable中
定义datatable
DataTable dtExcel = new DataTable();
获取标题行
NPOI.SS.UserModel.IRow rowHeader = sheet.GetRow(0);
/*
FirstCellNum:获取某行第一个单元格下标
LastCellNum:获取某行的列数
FirstRowNum:获取第一个实际行的下标
LastRowNum:获取最后一个实际行的下标
*/
获取表格列数
int cellCount = rowHeader.LastCellNum;
获取表格行数(最后一行下标+1)
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 + 1; i < rowCount; i++)
{
获取行(1、2、3…)数据
NPOI.SS.UserModel.IRow row = sheet.GetRow(i);
创建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();
}
}
}
新行添加到dataTable中
dtExcel.Rows.Add(dtRow);
}
声明变量,记录成功和失败数据的条数
int ImportSuccess = 0;
int ImportFail = 0;
遍历dataTable中的数据
foreach (DataRow row in dtExcel.Rows)
{
创建studentVo对象保存每一条数据
studentVo student = new studentVo();
try
{
获取学院ID 和学院名称
通过dataTable中的AcademeName到dbAcademe中查找 相应的AcademeID
student.AcademeName =row["学院 "].ToString().Trim();
student.AcademeID = dbAcademe.Where(m => m.AcademeName == student.AcademeName).SingleOrDefault().AcademeID;
获取专业id和名称
根据学院ID和专业名称获取相应的专业ID
student.SpecialtyName = row[“专业”].ToString().Trim();
student.SpecialtyID = dbSpecialty.Where(m => m.AcademeID == student.AcademeID && m.SpecialtyName == student.SpecialtyName).SingleOrDefault().SpecialtyID;
获取年级ID 和名称
根据学院ID以及年级名称获取相应的年级ID
student.GradeName = row[“年级”].ToString().Trim();
student.GradeID = dbGrade.Where(m => m.AcademeID == student.AcademeID && m.GradeName == student.GradeName).SingleOrDefault().GradeID;
获取 班级ID和名称
根据学院ID&专业ID&年级ID&班级名称获取班级ID
student.ClassName = row[“班级”].ToString().Trim();
student.ClassID = dbClass.Where(m => m.AcademeID == student.AcademeID && m.SpecialtyID == student.SpecialtyID && m.GradeID == student.GradeID && m.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);
ImportSuccess++;
}
catch (Exception e)
{
returnJson.State = false;
returnJson.Text = “数据处理出错”;
ImportFail++;
}
}
将数据保存到session中
Session[“ImportExcel”] = listStudentVo;
returnJson.State = true;
returnJson.Text = “Excel表格中一共有” + dtExcel.Rows.Count + “条数据,其中” + ImportSuccess +
“条匹配成功,有” + ImportFail + “条匹配失败!”;
}
else
{
returnJson.State = false;
returnJson.Text = “工作表中没有数据!”;
}
}
else
{
returnJson.State = false;
returnJson.Text = “工作簿中没有工作表!”;
}
}
}
catch (Exception e)
{
returnJson.State = false;给它的返回值为false;
eturnJson.Text = “上传失败,类型不对应/检查是否有工作表/检查是否有数据!”;
}
return Json(returnJson, JsonRequestBehavior.AllowGet);
}
以上的内容是老师的授课内容,我自己敲了两次,还不是很清楚,就只知道一个大概,有什么写的不好的地方,还望大家指出来,我可以及时更改;
将导入的Excel表格的数据保存到session
最新推荐文章于 2019-09-06 16:10:00 发布