导入Excel表格(1)
(作者:ヤ青春ゞ滋味,撰写时间:2019年6月9日)
在我们学习ASP.NET.MVC的过程中,如果我们录入的数据比较少的话,我们可以通过新增的方法来实现,当是呢,如果我们遇到要录入数据比较多的话,这时候我们如果用新增的方法来一条一条的数据新增会比较麻烦,那么这时候我们就可以想到用Excel表格来实现大量的数据新增,这样会节省我们的时间。接下来我们来看看如何实现导入Excel表格数据的。
第一步,当我们上传Excel表格时,我们需要把它保存到Session中。首先呢我们来看一下我们需要的就是在页面上点击导入按钮后,然后弹出一个模态框。如下图:
接着我们来写弹出模态框的方法,一开始我们把表单重置一下,然后就是我们要把保存到数据库的按钮给禁用。然后就是我们点击背景时不关闭动态模态框,按下esc时不关闭动态模态框,接着就是弹出模态框了,对了这个时候我们需要清空一下临时表,避免有数据残留,接下来我们来看代码,如下图:
然后我们需要要判断一下的就是当我们弹出文件选择器的时候,如果我们不选择文件或者选择了点击取消,所以我们避免取消文件后触发后上传。
接着上面的分析,我们在上传的时候可以让它显示一个加载层,然后我们通过ajaxSubmit()方法来提交,也就是表单提交。
注意的是,我们需要在form标签那里要添加action属性,这样我们才能获取后台的代码。
接着我们在后台来写控制器代码,我们需要传一个这样的参数HttpPostedFileBase,我们需要的是把导入进来的Excel表格中的数据保存到Session中,并且进行分页操作,我们需要把session中的ImportExcel移除掉避免它残留以前数据,代码如下:
Session.Remove("ImportExcel");
那么这时候我们判断页面上传过来的文件是否为Excel表格,获取文件的后缀是否为.xls,如果不是则让它返回文件类型错误,请上传Excel文件!这时如果是的话,我们就要声明一个二进制数组来存放文件,再将传入的文件转化成二进制的数组存放在我一开始声明的二进制数组那里去,最后我们再把二进制数组转化成内存流,然后再通过内存流转化成工作簿。代码如下:
接着再来判断工作簿是否有工作表,接着我们来查询出对应的数据,再获取对应的ID, 声明对象列表,存放导入的学生信息,接着我们在工作簿里获取第一个工作表,因为一个工作簿中可以有多个工作表,所以我们要获取第一个工作表。代码如下:
然后我们就接着来判断一下工作表是否有数据,没有则返回工作簿中没有数据表!,反之,就定义一个DataTable,将数据装到DataTable中;然后就是获取标题行和获取表格列数;再获取表格行数即最后一行下标+1;然后创建dataTable中的列,是为了循环添加标题行中各个单元格的数据,这里用到了for循环语句,i=每一行的第一个单元格下标,i<每一行的列数,i自增;然后就是遍历表头行中每一个单元格,是为了获取标题行各个单元格的数据,再将获取到的标题行的数据放到dataTable中。FirstCellNum:获取某行第一个单元格下标;LastCellNum:获取某行的列数;FirstRowNum:获取第一个实际行的下标;LastRowNum:获取最后一个实际行的下标。代码如下
把获取到的标题行的数据放到dataTable中,然后我们就要读取Excel表格中的数据,sheet.FirstRowNum表示第一行的是标题,接着我们来用循环语句来获取每一行的数据,然后再来创建DataTable行;我们为了防止每一行的数据为空,所以在这我们用if来判断每一行的行数不能为空,如果不为空,那么我们就继续有循环语句来遍历Excel中每一行中的所有单元格,反之则不执行该语句里的代码。最后我们把新行添加到dataTable中。代码如下:
因为我们导入的数据不可能全部成功的,所以我们就要声明两个变量来记录成功和失败的条数,然后用foreach遍历dataTable中的数据,创建studentVo对象保存每一条数据,因为全部代码都是差不多的,所以我就以学院为列子,首先呢,我们要先获取学院ID 和学院名称,然后通过dataTable中的AcademeName到dbAcademe中查找相应的AcademeID,然后就将每一条数据都添加到对象列表中。代码如下:
其实我们看着觉得非常复杂,但是我们理清楚思路的话就非常容易了。1、获取读取的文件,2、把文件转换为二进制数组,3、二进制数组转成内存流,4、利用NPOI把内存流中的数据读取成Excel。这样将导入的Excel表格的数据保存到session中就完成了。
这时候我们就完成了上传Excel表格,保存到临时表这个功能了。效果图如下: