本文共 2862 字,大约阅读时间需要 9 分钟。
开发工具与关键技术: MVC
作者:彭水清
撰写时间:2019/4/30
今天我要跟大家分享Excel数据导入,希望可以帮助到你们喔!
下图就是点击导入考生弹出的Excel的模态框,里面有个选择框,accept 属性只能与 配合使用。它规定能够通过文件上传进行提交的文件类型。还有Excel临时表,下载导入模板和导入到数据库等这些功能。
接下来我点击Browse这个按钮,就会弹出一个窗口,而我最主要讲解的是点击我所需要的考生数据的Excel表格导入到临时表(就是上图中模态框的表格,把它称作为临时表)的控制器的方法。(1)获取读取的文件;(2)把文件转换为二进制数组;(3)二进制数组转成内存流;(4)利用NPOI把内存流中的数据读取成Excel
先判断页面传过来的文件是否为Excel表格,再获取文件的后缀
通过System.IO.Path.GetExtension(file.FileName)这个方法获取HttpPostedFileBase file的名称
开始判断后缀名是否为".xls"或".XLS"
string fileExtension = System.IO.Path.GetExtension(file.FileName);
if (".xls".Equals(fileExtension) || “.XLS”.Equals(fileExtension))
判断成功后声明二进制数组存放文件,数组名称为byte[] fileBytes,数组长度为file.ContentLength,
byte[] fileBytes = new byte[file.ContentLength];
将传入的文件转化为二进制的数组存入fileBytes
file.InputStream.Read(fileBytes, 0, file.ContentLength);
要先引入namespace ,再将二进制的数组转化为内存流
MemoryStream excelFileStream = new MemoryStream(fileBytes);
将内存流转化为Excel工作簿,然后引用NPOI
NPOI.SS.UserModel.IWorkbook workbook = new NPOI.HSSF.UserModel.HSSFWorkbook(excelFileStream);
转化为Excel工作簿后,再判断工作簿中是否有工作表
if (workbook.NumberOfSheets
判断成功后,获取工作簿中的第一张工作表,然后workbook.GetSheetAt(0)里的这个零,在数组里面代表的是1
NPOI.SS.UserModel.ISheet sheet =
workbook.GetSheetAt(0);PhysicalNumberOfRows
获取的是物理行数,也就是不包括那些空行(隔行)的情况。判断工作表中是否有数据if (sheet.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 (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();
遍历excel中一行所有的单元格
for (int j = row.FirstCellNum; j
< cellCount; j++)dtRow[j] =
row.GetCell(j).ToString();新行添加到dataTable中
dtExcel.Rows.Add(dtRow);
声明对象列表,存放导入的信息
List listStudentVo = new List();
查询出需要导入的信息 ,用来根据名称获取对应的ID
List<SYS_Academe> dbAcademe = (from tbAcademe in myModels.SYS_Academe
select tbAcademe).ToList();
遍历dataTable中的数据
foreach (DataRow row in dtExcel.Rows)
创建studentVo对象保存每一条数据
studentVo student = new studentVo();
获取学院ID和学院名称
通过dataTable中的AcademeName到dbAcademe中查找相应的AcademeID
student.AcademeName
= row[“学院”].ToString().Trim();student.AcademeID
= dbAcademe.Where(m => m.AcademeName == student.AcademeName).SingleOrDefault().AcademeID;将每一条数据都添加到对象列表中
listStudentVo.Add(student);
将数据保存到session中
Session[“ImportExcel”] = listStudentVo;
到这里Excel数据就导入成功了,来回顾了解一下思路:(1)获取读取的文件;(2)把文件转换为二进制数组;(3)二进制数组转成内存流;(4)利用NPOI把内存流中的数据读取成Excel。
新手上道,请多多指教。如果有更好的方法或不懂得地方欢迎在评论区教导和提问喔!
转载地址:https://blog.csdn.net/weixin_44540414/article/details/89883051 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!