如何导入Excel表格
开发工具与关键技术:VS MVC
作者:李亮银
撰写时间:2019年05月03日
导入Excel表格前先要准备一个Excel表格模板,然后把它放在指定的地方等待使用。
第一步弹出导入Excel模态框:
弹出模态框首先肯定是要重置表单了,因为模态框就是一个表单嘛!然后禁用保存到数据库的按钮(浅蓝色的按钮):导入到数据库是最后一步,为了避免操作失误,所以现在要把它禁用(到后面会启用)。然后声明一个全局变量来放置临时表,再初始化导入数据临时表,清空临时表,数据重载;最后弹出模态框。
第二步下载导入模板:(只有一句代码)
打开一个新的窗口,并在窗口中装载指定的URL地址的网页。
window. open(“DownImportTemplate”);
写完这两步,就到控制器写下载模板的控制器代码:
首先获取模板路径(在项目里创建一个新的文件夹,把准备好的模板放进去),找到文件路径之后就判断一下这个模板是否存在,模板存在就获取文件名称然后返回文件(这里就已经实现了下载的功能),模板不存在就提示用户:模板文件不存在,请联系系统运维人员。
下载的功能实现后,接下来就把Excel表格里的数据上传到临时表。(这里有两步操作:第一步操作是选中Excel表格里的数据把它保存到session里面,第二步是从session里面把数据提取出来对它进行分页处理再把它返回到表格)。选择文件、上传文件就会涉及到表单的change事件,所以要给这个表单写一个change改变事件。
看代码:
首先为了避免取消选择文件后触发上传,所以要判断表单是否为空;为空就返回,否则就继续执行。
然后到控制器写将导入的Excel表格的数据保存到session的代码:首先把session清空一下,这样下次导入别的Excel表格是原来的数据就不会保存在里面。
然后判断页面传过来的文件是否为Excel表格(需要获取文件的后缀名),如果获取到的文件后缀名为指定的文件类型的后缀名(大小写不论)就将文件转换为二进制数组,否则就提醒用户传入的文件类型错误,请上传Excel文件。将文件转化为二进制数组首先要声明一个二进制数组来存放文件,然后将传入的文件转化为二进制数组存入fileBytes;之后就要把二进制数组转成内存流,最后是将内存流转化为工作薄。
其实就是四个步骤:
1、获取到读取的文件;
2、把文件转换为二进制数组;
3、二进制数组转成内存流;
4、利用NPOI把内存流中的数据读取成Excel。
这时候工作簿已经存在了,但是这个工作簿中是否存在工作表还不知道,所以需要判断一下这个工作簿中是否存在工作表。
根据名称来获取相对应的ID;然后声明对象列表,将导入的信息存放到这个列表中,然后就要获取到这个工作簿中的第一个工作表。
现在已经获取到工作表,但还不知道工作表里是否有数据,所以还要判断工作表中是否有数据。如果没有数据就返回空,如果有数据的话就对数据进行处理,也就是把得到的数据装到DataTable(数据表格)中。
要把数据放到dataTable的前提是这个表格已存在,所以要先定义一个dataTable:首先获取标题行,然后获取表格列数,最后获取表格行数。创建dataTable的列,循环添加标题行中各个单元格的数据需要用到for循环,遍历循环表头行的每一个单元格,然后获取到标题行的各个单元格的数据,然后将获取到的标题行的数据放到dataTable中。
把数据放到dataTable后就读去Excel中的数据,Excel的第一行是标题,读取数据也是一个for循环。在for循环中获取行(第二行)的数据,把这个行的数据放到dataTable里,再创建DataTable行接收这个行的数据,然后判断是否为空,不为空就遍历excel中每一行的单元格,其中新的行添加到dataTable中去。
数据已经放到dataTable中,接下来需要把这个dataTable中的数据整理,然后放到之前声明的对象列表里面,这样数据就会以列的格式保存在session中。
首先声明两个变量(ImportSuccess++;、ImportFail++;),记录成功和失败的条数;然后写一个foreach循环,遍历循环dataTable中的数据,再创建一个对象来保存每一条数据。具体请看代码:
由于这里的代码容易出现异常,所以要try…catch捕抓异常。里面的专业名称、年级名称以及班级名称都是Excel表格中所需要的内容,其实还有学院名称、学号等等,这里就不一一列举了,主要是因为代码太多了。
获取到数据之后就将每一条数据都添加到对象列表中:
listStudentVo.Add(student);
ImportSuccess++;添加成功这个变量就会自加一。
ImportFail++;添加失败这个变量就会自加一。
循环全部执行完之后,最后将得到的数据列表保存到session中:
控制器执行完成之后回到页面上返回一个值,关闭加载层然后判断传过来的值的状态是否为真;为真就重启保存到数据库的按钮然后重载数据;否则清空表单格,输出值。
将数据保存到session之后,就将session中的数据提取出来,并把它进行分页。最后将导入的Excel表格数据保存到数据库。
首先打开加载层,然后请求保存导入的数据的URL,然后保存导入的数据到数据库。但是在保存数据到数据库之前要判断一下数据库中是否已经有导入的数据。如果数据库中已存在该条数据,那么该条数据就不能保存到数据库。如果导入的数据没有与数据库中的数据重复那么就保存导入的数据。
然后再判断新增的数据是否为零。如果为零,则新增失败;不为零,则保存成功。
保存成功后回到页面,关闭加载层和模态框,然后提示用户,导入成功。最后刷新表格,把成功导入的数据显示出来。
备注:以上代码来源于授课老师的上课项目。