一、背景

为什么会用Easyexcel来做Excel下载

项目中的Excel导入功能刚做好,领导又来了:这次要导出功能。我导入才刚整明白呢,你又来了。但是没有办法,领导才是衣食父母嘛,只有干了。

阿里巴巴语雀团队对EasyExcel是这样介绍的
  1. Java解析、生成Excel比较有名的框架有Apache poijxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi07Excel的解析,能够原本一个3MexcelPOI sax依然需要100M左右内存降低到几M,并且再大的excel不会出现内存溢出,03版依赖POIsax模式。在上层做了模型转换的封装,让使用者更加简单方便。
  2. 当然还有急速模式能更快,但是内存占用会在100M多一点
  • 这篇文章很多地方都与上传的文章相同,只是controller有所变动,因为是同一个框架嘛。

二、集成EasyExcel

1、 在pom.xml中添加EasyExcel依赖

  1. <dependency>
  2. <groupId>com.alibaba</groupId>
  3. <artifactId>easyexcel</artifactId>
  4. <version>2.1.3</version>
  5. </dependency>

2、创建EasyExcel映射实体类

  1. import com.alibaba.excel.annotation.ExcelProperty;
  2. public class ExcelEntity {
  3. // ExcelProperty中的参数要对应Excel中的标题
  4. @ExcelProperty("ID")
  5. private int ID;
  6. @ExcelProperty("NAME")
  7. private String name;
  8. @ExcelProperty("AGE")
  9. private int age;
  10. public ExcelEntity() {
  11. }
  12. public ExcelEntity(int ID, String name, int age) {
  13. this.ID = ID;
  14. this.name = name;
  15. this.age = age;
  16. }
  17. public int getID() {
  18. return ID;
  19. }
  20. public void setID(int ID) {
  21. this.ID = ID;
  22. }
  23. public String getName() {
  24. return name;
  25. }
  26. public void setName(String name) {
  27. this.name = name;
  28. }
  29. public int getAge() {
  30. return age;
  31. }
  32. public void setAge(int age) {
  33. this.age = age;
  34. }
  35. }

3、创建controller

  • 这里必须设置setContentType以及setHeader两个东西,否则下载出来的文件会有问题。
  1. import com.alibaba.excel.EasyExcel;
  2. import com.alibaba.excel.ExcelReader;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. import org.springframework.web.bind.annotation.*;
  6. import org.springframework.web.multipart.MultipartFile;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.util.List;
  10. @RestController
  11. @CrossOrigin
  12. @RequestMapping("/loggerItem")
  13. public class LoggerItemController {
  14. @GetMapping("/download")
  15. public void downLoad(HttpServletResponse response){
  16. // 设置响应类型为excel
  17. response.setContentType("application/vnd.ms-excel");
  18. /*
  19. * 设置响应头以及文件名称
  20. * Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。
  21. * 浏览器接收到头时,它会激活文件下载对话框
  22. * attachment 附件
  23. * filename 附件名
  24. */
  25. response.setHeader("Content-Disposition", "attachment;filename=aaa.xlsx");
  26. try {
  27. // 从HttpServletResponse中获取OutputStream输出流
  28. ServletOutputStream outputStream = response.getOutputStream();
  29. /*
  30. * EasyExcel 有多个不同的read方法,适用于多种需求
  31. * 这里调用EasyExcel中通过OutputStream流方式输出Excel的write方法
  32. * 它会返回一个ExcelWriterBuilder类型的返回值
  33. * ExcelWriterBuilde中有一个doWrite方法,会输出数据到设置的Sheet中
  34. */
  35. EasyExcel.write(outputStream,ExcelEntity.class).sheet("测试数据").doWrite(UploadExcelListener.list);
  36. } catch (IOException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. }

5、application.yml配置

这里的文件上传大小,如果单做导出的话可以不用配,由于我这里需要上传数据进行测试,所以进行了配置

  1. server:
  2. # 指定端口号
  3. port: 8080
  4. spring:
  5. servlet:
  6. multipart:
  7. # 配置单个上传文件大小
  8. file-size-threshold: 100Mb
  9. # 配置总上传大小
  10. max-request-size: 300M

6、测试

我们先搞一个简单的Excel,上传上去用来测试

 

然后通过Postman模拟发送上传请求,上传测试文件

  • 选择Post请求并输入请求地址
  • 在下面选择Body
  • Key的框中输入controller中的请求的方法中的参数,后面的下拉框中选择File
  • VALUE框中有一个Select File ,点击后选择自己刚才创建的测试的Excel
  • 最后点击Send发送请求

然后在浏览器中发送下载请求

成功下载

三、EasyExcel中的write方法汇总

  1. /**
  2. * Build excel the write
  3. *
  4. * @return
  5. */
  6. public static ExcelWriterBuilder write() {
  7. return new ExcelWriterBuilder();
  8. }
  9. /**
  10. * Build excel the write
  11. *
  12. * @param file
  13. * File to write
  14. * @return Excel writer builder
  15. */
  16. public static ExcelWriterBuilder write(File file) {
  17. return write(file, null);
  18. }
  19. /**
  20. * Build excel the write
  21. *
  22. * @param file
  23. * File to write
  24. * @param head
  25. * Annotate the class for configuration information
  26. * @return Excel writer builder
  27. */
  28. public static ExcelWriterBuilder write(File file, Class head) {
  29. ExcelWriterBuilder excelWriterBuilder = new ExcelWriterBuilder();
  30. excelWriterBuilder.file(file);
  31. if (head != null) {
  32. excelWriterBuilder.head(head);
  33. }
  34. return excelWriterBuilder;
  35. }
  36. /**
  37. * Build excel the write
  38. *
  39. * @param pathName
  40. * File path to write
  41. * @return Excel writer builder
  42. */
  43. public static ExcelWriterBuilder write(String pathName) {
  44. return write(pathName, null);
  45. }
  46. /**
  47. * Build excel the write
  48. *
  49. * @param pathName
  50. * File path to write
  51. * @param head
  52. * Annotate the class for configuration information
  53. * @return Excel writer builder
  54. */
  55. public static ExcelWriterBuilder write(String pathName, Class head) {
  56. ExcelWriterBuilder excelWriterBuilder = new ExcelWriterBuilder();
  57. excelWriterBuilder.file(pathName);
  58. if (head != null) {
  59. excelWriterBuilder.head(head);
  60. }
  61. return excelWriterBuilder;
  62. }
  63. /**
  64. * Build excel the write
  65. *
  66. * @param outputStream
  67. * Output stream to write
  68. * @return Excel writer builder
  69. */
  70. public static ExcelWriterBuilder write(OutputStream outputStream) {
  71. return write(outputStream, null);
  72. }
  73. /**
  74. * Build excel the write
  75. *
  76. * @param outputStream
  77. * Output stream to write
  78. * @param head
  79. * Annotate the class for configuration information.
  80. * @return Excel writer builder
  81. */
  82. public static ExcelWriterBuilder write(OutputStream outputStream, Class head) {
  83. ExcelWriterBuilder excelWriterBuilder = new ExcelWriterBuilder();
  84. excelWriterBuilder.file(outputStream);
  85. if (head != null) {
  86. excelWriterBuilder.head(head);
  87. }
  88. return excelWriterBuilder;
  89. }

所有的方法都在这儿了,其实如果看不懂到底应该调用哪一个write方法的话,可以以根据自己所能得到的参数来判断。

四、扩展

  • 导出到本地Excel

 

 

 

  1. public static void main(String[] args) {
  2. EasyExcel.write("C:/Users/Lonely Programmer/Desktop/输出文件名.xlsx"
  3. ,ExcelEntity.class)
  4. .sheet("测试数据")
  5. .doWrite(UploadExcelListener.list);
  6. }

 

 

输出本地的Excel和通过OutputStream流输出的方式是一样的,只是参数变了,原本传的是OutputStream流,现在传的是文件的绝对路径。

 

 

 


平时上班比较忙,操作过程中如果遇到什么问题,可以评论提问,我看到了的话,有时间基本上都会回复的(前提是我会,哈哈哈)。

其实百度才是最好的老师。