Excel数据导入
发布日期:2021-11-02 20:00:50 浏览次数:2 分类:技术文章

本文共 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

  1. 判断成功后,定义datatable,将数据装到DataTable中

DataTable dtExcel = new DataTable();

  1. 获取标题行

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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:水晶报表打印
下一篇:layui table分页查询

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月07日 09时08分50秒