在使用软件的时候,有时会需要将本地Excel表格数据导入。而这个功能要怎么实现呢?接下来的内容可能会有所解惑。
这里我用一个学生信息的表格为例来讲解。在页面上的部分就不多说,主要看后台操作。
导入的数据是保存到数据库中,选择Excel表格文件提交到控制器,使用HttpPostedFileBase file为控制器参数接收文件。
1、声明二进制数组存放文件
byte[] fileBytes = new byte[file.ContentLength];以上载文件的大小声明数组;
2、将传入的文件转化为二进制的数组存入fileByres
file.InputStream.Read(fileBytes, 0, file.ContentLength);
3、将二进制的数组转化为内存流
MemoryStream excelFileStream = new MemoryStream(fileBytes);
4、将内存流转化为工作簿,利用NPOI
NPOI.SS.UserModel.IWorkbook workbook = new HSSFWorkbook(excelFileStream);
5、获取第一个工作表
NPOI.SS.UserModel.ISheet sheet = workbook.GetSheetAt(0);这里只导入一个表。
6、将数据封装到DataTable中,先声明dtExcel。
DataTable dtExcel = new DataTable();
7、获取标题行
NPOI.SS.UserModel.IRow rowHeader = sheet.GetRow(0);
8、获取表格列数
int cellCount = rowHeader.LastCellNum;
9、获取表格行数(最后一行下标+1)
int rowCount = sheet.LastRowNum + 1;
这样就把所有数据添加到了dtExcel中,然而仅仅得到表格文件的数据是不够的。因为要保存在数据库,也就是其中的各个表,所以表中的字段信息全部要获得。
根据所需字段(不可获得的除外)创建类,声明对象列表,存放导入的学生信息
List<studentVo> listStudentVo = new List<studentVo>();
遍历dataTable中的数据
foreach (DataRow row in dtExcel.Rows)
创建studentVo对象保存每一条数据
studentVo student = new studentVo();
根据名称使用Lambda表达式获取对应ID,将数据一一对应放入student中。
将每一条数据都添加到对象列表中
listStudentVo.Add(student);
之后就是按顺序的将数据保存到对应的各表了,具体就不过多赘述了。