将导入的Excel表格的数据保存到session
要经过1、获取读取的文件;2、把文件转换为二进制数组;3、二进制数组转成内存流;4、利用NPOI把内存流中的数据读取成Excel,这四步操作
用HttpPostedFileBase类来接收获取的文件,
声明了一个string类型的fileExtension来接收,GetExtension方法用来获取文件的后缀名,
一、第一个判断要判断传过来文件的类型的后缀是否是.xls,忽略大小写,判断成立时就,执行下面的代码
/声明二进制数组存放文件
byte[] fileBytes = new byte[file.ContentLength];
/将传入的文件file转化为二进制的数组存入fileBytes,内容长度从0开始读取到最后
file.InputStream.Read(fileBytes, 0, file.ContentLength);
/ excelFileStream是声明的内存流,将转化为二进制的fileBytes转化为内存流
MemoryStream excelFileStream = new MemoryStream(fileBytes);
/需要引用NPOI,就可以用IWorkbook,将内存流excelFileStream转化为工作簿IWorkbook
NPOI.SS.UserModel.IWorkbook workbook = new HSSFWorkbook(excelFileStream);
不成立时,返回“文件类型错误,请上传excel文件!”
一个打开excel表格为一个工作簿,工作簿里面可以建多个工作表
二、第二个判断就是判断工作簿里面是否有工作表, workbook有一个属性NumberOfSheets用来判断是否有工作表,没有则返回“工作簿中没有数据表!”,有就执行下面
获取第一个工作表,NPOI.SS.UserModel.ISheet sheet = workbook.GetSheetAt(0);
三、获取到工作表之后,再判断表里面是否有数据,sheet.PhysicalNumberOfRows>0, PhysicalNumberOfRows获取的是物理行数,也就是不包括那些空行(隔行)的情况,小于等于0都是没有数据的情况,就返回“数据表为空!”,当大于0的时候,就表示表里面有数据,这时就要对数据进行处理,定义对象将数据装到DataTable中,DataTable dtExcel = new DataTable();通过NPOI的IRow创建存放表头标题行,命名为rowHeader, NPOI.SS.UserModel.IRow rowHeader = sheet.GetRow(0);通过获取工作表sheet的第一行下标为0来获取标题行,要区分下面的几个值:
FirstCellNum:获取某行第一个单元格下标
LastCellNum:获取某行的列数
FirstRowNum:获取第一个实际行的下标
LastRowNum:获取最后一个实际行的下标
再获取表格列数int cellCount = rowHeader.LastCellNum; 获取rowHeader行的列数用LastCellNum,获取表格行数int rowCount = sheet.LastRowNum + 1;获取表sheet的行数用LastRowNum+1
通过for循环(int i = rowHeader.FirstCellNum; i < cellCount; i++)将表头数据放到dtExcel里面, FirstCellNum获取到表头行的第一列,i小于cellCount表格的列数时就执行for循环里面的代码DataColumn dtColumn = new DataColumn(rowHeader.GetCell(i).StringCellValue);声明对象获取列的数据,它获取的数据是表头行列GetCell下标为i的数据,第一次执行时i=0,获取的是第一列为学号,i小于cellCount列数时会一直执行for循环,这样就可以一直执行到最后账号这一列为止
StringCellValue是当前获取到的列的值,dtExcel.Columns.Add(dtColumn);这样就可以把获取到的dtColumn表头列放到dtExcel的列集合Columns里面,接下来就是获取实际数据,继续再for循环
sheet.FirstRowNum 获取的是表格实际行下标,这时获取到的是表头,所以要获取到实际数据时就要加1,i小于rowCount表格行数时就执行for循环,跟获取表头一样,通过NPOI的IRow创建存放数据行,命名为row,获取sheet工作表下标为i的数据行,数据要放到DataTable里面,所以dtExcel也需要创建行NewRow用dtRow接收上面row传来的数据,这时就要判断row不等与空才能继续执行下一个for循环,变量j等于获取到的row这一行数据的第一列的下标,j小于表格的列数时会j++,再判断GetCell(j)拿到的数据不等于空时,就把拿到的数据,转化为字符串放到dtRow里面,最后把dtRow添加到dtExcel数据表里面,循环一次处理一行数据。
现在数据全部在dtExcel数据表里面,需要再进行整理,声明两个变量,记录成功和失败的条数,int ImportSuccess = 0; int ImportFail = 0; 遍历dataTable中的数据,创建对象保存每一条数据studentVo student = new studentVo(); 需要用try{}cath(){}因为数据容易出错
用studentVo对象里面的字段获取数据里面的列,对象里面字段的属性等于row[]这一列的值,ToString变成字符串再去空格,但是对于学院,专业,年级,班级这些数据,它们是有关联的,不能随便赋值,比如学院下面会有对应的专业信息,所以要查询出它们各个表的信息,是要在判断是否有工作表的时候去查询,查询出来的表里面就包含了所有相对应的全部信息,后面声明一个对象列表,这样数据就可以以一个类是的形式保存到session
查询的条件是名称相等或者ID相等,SingleOrDefault返回一条唯一的数据,为空时返回一个null,但是如果是多条数据时就会引发异常,查询出数据后就根据到对应的ID值,这样查询出来的数据就是对应的信息
到这里数据都已经全部处理完成了,就需要将数据添加到对象列表中
listStudentVo.Add(student);
ImportSuccess++;
在catch里面写:
returnJson.State=false;
returnJson.Text=”数据处理出错!”;
ImportFail++;
最后在遍历完所有数据后,正式将数据放到session中