找回密码
 立即注册
首页 业界区 业界 Easyexcel(3-文件导出)

Easyexcel(3-文件导出)

郦珠雨 昨天 21:58
响应头设置

通过设置文件导出的响应头,可以自定义文件导出的名字信息等
  1. //编码格式为UTF-8
  2. response.setCharacterEncoding("UTF-8");
  3. //让服务器告诉浏览器它发送的数据属于excel文件类型
  4. response.setContentType("application/vnd.ms-excel;charset=UTF-8");
  5. //描述内容在传输过程中的编码格式,BINARY可能不止包含非ASCII字符,还可能不是一个短行(超过1000字符)。
  6. response.setHeader("Content-Transfer-Encoding", "binary");
  7. //must-revalidate:强制页面不缓存,post-check=0, pre-check=0:0秒后,在显示给用户之前,该对象被选中进行更新过
  8. response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
  9. //表示响应可能是任何缓存的,即使它只是通常是非缓存或可缓存的仅在非共享缓存中
  10. response.setHeader("Pragma", "public");
  11. //告诉浏览器这个文件的名字和类型,attachment:作为附件下载;inline:直接打开
  12. response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xls");
复制代码
写入单个Sheet

一次性写入数据

指定导出内容所对应的对象信息,通过doWrite写入数据
注意:doWrite方法必须传入的是集合
  1. @Data
  2. public class User {
  3.     @ExcelProperty(value = "用户Id")
  4.     private Integer userId;
  5.     @ExcelProperty(value = "姓名")
  6.     private String name;
  7.     @ExcelProperty(value = "手机")
  8.     private String phone;
  9.     @ExcelProperty(value = "邮箱")
  10.     private String email;
  11.     @ExcelProperty(value = "创建时间")
  12.     private Date createTime;
  13. }
复制代码
  1. @GetMapping("/download1")
  2. public void download1(HttpServletResponse response) {
  3.     try {
  4.         response.setContentType("application/vnd.ms-excel");
  5.         response.setCharacterEncoding("utf-8");
  6.         // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
  7.         String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
  8.         response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xls");
  9.         User user = new User();
  10.         user.setUserId(123);
  11.         user.setName("as");
  12.         user.setPhone("15213");
  13.         user.setEmail("5456");
  14.         user.setCreateTime(new Date());
  15.         EasyExcel.write(response.getOutputStream(), User.class)
  16.                 .sheet("模板")
  17.                 .doWrite(Arrays.asList(user));
  18.     } catch (Exception e) {
  19.         e.printStackTrace();
  20.     }
  21. }
复制代码
分批写入数据
  1. @GetMapping("/download2")
  2. public void download2(HttpServletResponse response) {
  3.     ExcelWriter excelWriter = null;
  4.     try {
  5.         response.setContentType("application/vnd.ms-excel");
  6.         response.setCharacterEncoding("utf-8");
  7.         // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
  8.         String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
  9.         response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xls");
  10.         User user = new User();
  11.         user.setUserId(123);
  12.         user.setName("as");
  13.         user.setPhone("15213");
  14.         user.setEmail("5456");
  15.         user.setCreateTime(new Date());
  16.         excelWriter = EasyExcel.write(response.getOutputStream(), User.class).build();
  17.         WriteSheet writeSheet = EasyExcel.writerSheet("测试").build();
  18.         // 业务逻辑处理,分页查询
  19.         excelWriter.write(Arrays.asList(user), writeSheet);
  20.         excelWriter.write(Arrays.asList(user), writeSheet);
  21.     } catch (Exception e) {
  22.         e.printStackTrace();
  23.     } finally {
  24.         if (excelWriter != null) {
  25.             excelWriter.finish();
  26.         }
  27.     }
  28. }
复制代码
通过WriteSheet对象可以指定要写入的Sheet,通过上面方式我们可以手工控制流的关闭,这样我们就可以实现多次写。可以实现分页查询获取数据,然后将数据写入Excel中,避免一次性加载的数据过多,导致内存溢出
在使用excelWriter.write方式时务必保证至少执行一次write,这样是为了将sheet和表头写入excel,否则打开excel时会报错。write的第一个参数可以为null
导出表头自定义

使用注解的方式定义表头时不能动态控制,每次修改表头内容时只能重新修改代码,这时可以通过head方法动态传参自定义表头
注意:内容结构必须是List,如果使用List会出现问题
  1. @GetMapping("/download3")
  2. public void download3(HttpServletResponse response) {
  3.     ExcelWriter excelWriter = null;
  4.     try {
  5.         response.setContentType("application/vnd.ms-excel");
  6.         response.setCharacterEncoding("utf-8");
  7.         // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
  8.         String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
  9.         response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xls");
  10.         User user = new User();
  11.         user.setUserId(123);
  12.         user.setName("as");
  13.         user.setPhone("15213");
  14.         user.setEmail("5456");
  15.         user.setCreateTime(new Date());
  16.         List<List<String>> heads = new ArrayList<>();
  17.         heads.add(Arrays.asList("姓名"));
  18.         heads.add(Arrays.asList("年龄"));
  19.         heads.add(Arrays.asList("地址"));
  20.         excelWriter = EasyExcel.write(response.getOutputStream()).head(heads).build();
  21.         WriteSheet writeSheet = EasyExcel.writerSheet("测试").build();
  22.         excelWriter.write(Arrays.asList(user), writeSheet);
  23.     } catch (Exception e) {
  24.         e.printStackTrace();
  25.     } finally {
  26.         if (excelWriter != null) {
  27.             excelWriter.finish();
  28.         }
  29.     }
  30. }
复制代码
1.jpeg

导出内容自定义

当导出的内容不是某个固定的实体类时,希望导出不同的内容时可以通过List自定义要写入的内容
  1. @GetMapping("/download5")
  2. public void download5(HttpServletResponse response) {
  3.     ExcelWriter excelWriter = null;
  4.     try {
  5.         response.setContentType("application/vnd.ms-excel");
  6.         response.setCharacterEncoding("utf-8");
  7.         // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
  8.         String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
  9.         response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xls");
  10.         List<List<String>> heads = new ArrayList<>();
  11.         heads.add(Arrays.asList("姓名"));
  12.         heads.add(Arrays.asList("年龄"));
  13.         heads.add(Arrays.asList("地址"));
  14.         excelWriter = EasyExcel.write(response.getOutputStream()).head(heads).build();
  15.         WriteSheet writeSheet = EasyExcel.writerSheet("测试").build();
  16.         List<List<String>> dataList = new ArrayList<>();
  17.         dataList.add(Arrays.asList("张三", "18", "上海"));
  18.         dataList.add(Arrays.asList("李四", "28"));
  19.         excelWriter.write(dataList, writeSheet);
  20.     } catch (Exception e) {
  21.         e.printStackTrace();
  22.     } finally {
  23.         if (excelWriter != null) {
  24.             excelWriter.finish();
  25.         }
  26.     }
  27. }
复制代码
2.jpeg

写入多个表头

若业务需求要求在同一个Sheet中写多个表,就需要用到WriteTable了。只定义一个WriteSheet,有几个表就定义几个WriteTable即可
  1. @GetMapping("/download4")
  2. public void download4(HttpServletResponse response) {
  3.     ExcelWriter excelWriter = null;
  4.     try {
  5.         response.setContentType("application/vnd.ms-excel");
  6.         response.setCharacterEncoding("utf-8");
  7.         // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
  8.         String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
  9.         response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xls");
  10.         User user = new User();
  11.         user.setUserId(123);
  12.         user.setName("as");
  13.         user.setPhone("15213");
  14.         user.setEmail("5456");
  15.         user.setCreateTime(new Date());
  16.         excelWriter = EasyExcel.write(response.getOutputStream()).build();
  17.         WriteSheet writeSheet = EasyExcel.writerSheet("测试").build();
  18.         List<List<String>> heads1 = new ArrayList<>();
  19.         heads1.add(Arrays.asList("姓名"));
  20.         heads1.add(Arrays.asList("年龄"));
  21.         heads1.add(Arrays.asList("地址"));
  22.         WriteTable writeTable1 = EasyExcel.writerTable(1).head(heads1).needHead(true).build();
  23.         List<List<String>> heads2 = new ArrayList<>();
  24.         heads2.add(Arrays.asList("姓名"));
  25.         heads2.add(Arrays.asList("年龄"));
  26.         heads2.add(Arrays.asList("地址"));
  27.         heads2.add(Arrays.asList("出生日期"));
  28.         WriteTable writeTable2 = EasyExcel.writerTable(2).head(heads2).needHead(true).build();
  29.         excelWriter.write(Arrays.asList(user), writeSheet, writeTable1);
  30.         excelWriter.write(Arrays.asList(user), writeSheet, writeTable2);
  31.     } catch (Exception e) {
  32.         e.printStackTrace();
  33.     } finally {
  34.         if (excelWriter != null) {
  35.             excelWriter.finish();
  36.         }
  37.     }
  38. }
复制代码
3.jpeg

写入多个Sheet

通过EasyExcel.writerSheet创建对应的sheet,然后在写入sheet时指定对应的WriteSheet即可,同时可指定每个Sheet对应的对象
  1. @GetMapping("/download6")
  2. public void download6(HttpServletResponse response) {
  3.     ExcelWriter excelWriter = null;
  4.     try {
  5.         response.setContentType("application/vnd.ms-excel");
  6.         response.setCharacterEncoding("utf-8");
  7.         // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
  8.         String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
  9.         response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xls");
  10.         List<List<String>> heads = new ArrayList<>();
  11.         heads.add(Arrays.asList("姓名"));
  12.         heads.add(Arrays.asList("年龄"));
  13.         heads.add(Arrays.asList("地址"));
  14.         excelWriter = EasyExcel.write(response.getOutputStream()).head(heads).build();
  15.         WriteSheet writeSheet1 = EasyExcel.writerSheet(0, "测试1").build();
  16.         WriteSheet writeSheet2 = EasyExcel.writerSheet(1, "测试2").build();
  17.         User user = new User();
  18.         user.setUserId(123);
  19.         user.setName("as");
  20.         user.setPhone("15213");
  21.         user.setEmail("5456");
  22.         user.setCreateTime(new Date());
  23.         excelWriter.write(Arrays.asList(user), writeSheet1);
  24.         excelWriter.write(Arrays.asList(user), writeSheet2);
  25.     } catch (Exception e) {
  26.         e.printStackTrace();
  27.     } finally {
  28.         if (excelWriter != null) {
  29.             excelWriter.finish();
  30.         }
  31.     }
  32. }
复制代码
4.jpeg

5.jpeg


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册