Excel表格的导入与导出
(作者:杨先金;撰写时间:2019年4月22日)
一、主要思路:
1、获取读取的文件;2、把文件转换为二进制数组;3、二进制数组转成内存流;4、利用NPOI把内存流中的数据读取成Excel。
二、Excel表格的导入:
1、首先初始化导入数据临时表,上传Excel表格,将上传的Excel表格保存到临时表:
(1)、提交表单,到控制器请求数据,获取到文件的后缀,然后判断页面传过来的文件是否为Excel表格,如果不是(.xls || .XLS)后缀,则输出"文件类型错误,请上传Excel文件!"。
(2)、把文件转换为二进制数组;
(3)、二进制数组转成内存流;
(4)、利用NPOI把内存流中的数据读取成Excel;
(5)、判断工作簿中是否有工作表,如果没有则输出"工作簿中没有数据表!",如果有,那么获取第一个工作表,使用PhysicalNumberOfRows这个静态类判断工作簿中是否有数据,PhysicalNumberOfRows 获取的是物理行数,也就是不包括那些空行(隔行)的情况。
如果没有,输出"数据表为空!";如果有,将数据装到DataTable中,并获取标题行、获取表格列数、获取表格行数;
创建dataTable中的列,循环添加标题行中各个单元格的数据,遍历表头行中每一个单元格,获取标题行各个单元格的数据,将获取到的标题行的数据放到dataTable中,
遍历dataTable中的数据,创建studentVo对象保存每一条数据,将查询并获取到的每一条数据都添加到对象列表中,最后将数据保存到session中。
2、保存导入的Excel表格数据到数据库。
三、Excel表格的导出:
在导出之前最好是先将数据筛选一遍,如果是这样,那么你要获取当前表格数据的筛选条件,并判断数据是否完整,ID为空或者undefined的,给它赋值为0,然后就是提示用户"是否要导出当前表格中的数据,是请点击确定按钮,否则请筛选需要导出的数据!";
到控制器根据筛选条件查询数据,然后创建Excel工作簿、创建工作表、创建表头行、设置表头——
For循环每一条数据,为Excel表格添加数据,刚才创建的是表头行,现在我们要创建的是内容行,并且给它的内容行一一添加数据,
接下来要为Excel文件命名,跟导入差不多,也要把创建好的工作簿转化为内存流,将Excel文件写入内存流中,输出之前调用Seek(偏移量,游标位置) 移动文件读取指针到指定的位置,Seek(0,Seek.begin) 第一个参数表示相对位置,第二个参数表示参照位置。
最后返回一个文件,文件类型为"application/vnd.ms-excel"。