导出数据到Excel表格

(作者:杨东升,撰写时间:2019.5.6)
JS部分:
1、为了保证导出的数据和想导出的数据保持一致,我们要在导出之前要根据查询的条件在控制器查询一次(多条件查询),再进行导出。
2、获取到下拉框、文本框的val值
3、然后判断这些下拉框是否为空或者undefined,如果是就让它等于0,文本框是否为undefined,如果是就让它等于空,步骤和多条件查询一样。
4、先给用户一个提示,用户确定了再进行导出。
window.open是在浏览器窗口打开,ExportToExcel为控制器的方法,用拼接字符串的方式把上面三个变量(+号后面的)作为参数传到控制器
导出数据到Excel表格

控制器部分:
1、到控制器写控制器请求的方法ExportToExcel,因为要根据条件来筛选数据,所以要把JS里三个参数(=号前面的)传过来,我这里前两个是ID,第三个是字符串类型。
2、把我需要的员工表、部门表、职位表连起来,这里我根据员工编号进行倒序排序 ,倒序排序的好处就是会把我最新添加的数据放到最前面。
3、然后查询出我们需要导出的数据,注意,查询那边的id一定要和控制器查询的名称保持一致,这样查询出来的结果页面才能接收到。

EmployeeVo是我创的实体类,里面继承了一个员工表,写了两个员工表没有的字段,也就是我把我需要用到的字段和成了一个表,后面处理数据的话,就可以把查询出来的数据放到new EmployeeVo里,直接处理new EmployeeVo的对象就可以了,就不用重新查询。
导出数据到Excel表格
条件筛选,Lambd表达式,运算符=>,左边是参数,右边是表达式或语句,!string.IsNullOrEmpty()判断字符串是否为空
导出数据到Excel表格

查询完后,接下来就是导出了,因为要导出到Excel表格,所以得先有一张表吧
1、 创建Excel工作簿,这里用到NPOI里的HSSFWorkbook
2、 创建工作表,用CreateSheet在excelBook里创建一张工作表,空号里的是表的名字
3、 设置表头行,调用CreateRow创建行的方法,让它索引为0,就可以设置表头行了
导出数据到Excel表格
4、 为Excel表格添加数据
把创建行写到for循环里,根据数据的条数创建行数,因为第一行是表头行,所以要从第二行开始加(i+1)。
导出数据到Excel表格

5、 为Excel文件命名,获取当前的时间,拼接字符串,命名格式为:员工信息 + 年月日时分秒毫秒 + 后缀.xls。

6、 转化为内存流,让Excel文件以文件流的形式输出到页面

7、 将Excel文件写入内存流

8、输出之前调用Seek(偏移量,游标位置)移动文件读取指针到指定的位置
Seek(0,Seek.begin) 第一个参数表示相对位置,第二个参数表示参数位置
读取指针类似我们输入时的鼠标光标,随着不断输入内容光标也随着不断移动,偏移量为0也就是在文件流一开始的位置,这个位置靠Seek来确定

9、返回,application/vnd.ms-excel (后缀xls的MTME文件类型)
导出数据到Excel表格