不要总是重复造“轮子”
作为朋友,我真的建议你不要重复造轮子,网上现在很多工具库都写很成熟了,拿来就用即可。没有必要事事躬亲,没有必要事事都自己亲自下手去写代码。浪费时间,你不是打字员,而且,如果你自己又没有什么新idea,或者,自己重新写相同的工具类也没有什么性能上的提升,就麻烦你还是好好找找轮子吧,没有必要整天把时间耗在别人已经做过的事情上。
web生成Excel需求
相信你做Java这么久了,也或多或少也遇到过一些需要生成Excel报表的需求吧。毕竟办公软件还是微软是天下,Excel对于非编程人员来说,太重要了,可以说是必不可少的。本人工作也遇到过很大需要生成Excel报表的需求,但是,每一次都有一大段重复的代码,太冗余了,看起来一点都不简洁。
“那么,有没有一个工具库可以最少的代码就可以完成这项任务的?或者就用一个注解就OK了呢?
”
有,而且,就用一个注解就可以。
代码实操
引入库
<dependency>
<groupId>com.gaoice</groupId>
<artifactId>easyexcel-spring-boot-starter</artifactId>
<version>1.0</version>
</dependency>
在springboot的配置文件application.properties上加上一行:
# 是否解析带有 @ResponseExcel 注解的函数的返回值为文件下载
com.gaoice.easyexcel.enable-response-excel=true
看清楚,加上@ResponseExcel注解,而不是 @ResponseBody注解,看清楚了哦!!!
@RequestMapping("/downloadExcel")
@ResponseExcel(fileName="Java知识日历20201101测试",sheetName = "同一班的同学名册",columnNames= {"学生姓名","学号","年龄"},classFieldNames = { "name","stuNo","age" })
public List<Student> list() {
return getStudents();
}
没错!就这么简单,就一个注解,就一个注解,就一个注解。
只要加上@ResponseExcel就可以了,看看想一想,我们节省了多少开发时间,节省了多少代码。
测试截图
![](https://i-blog.csdnimg.cn/blog_migrate/913ca9fb1a8e090c8543be4ade85c050.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b01e4af256af5ce35e7a1370ede65836.png)
就这?
No!还可以更加复杂一点
这个工具库还提供了可以定制特殊需求方案,也是非常简单。你可以使用工具库里面的Model对象组合你的Excel 分别是:SheetInfo 和 ExcelFile 对象,可以让你灵活组合你的Excel,真的减少了很多冗余的代码。
这两个对象的用法,在文中最后的全部代码里面都有例子。放心哈!
全部代码
pom.xml
<dependency>
<groupId>com.gaoice</groupId>
<artifactId>easyexcel-spring-boot-starter</artifactId>
<version>1.0</version>
</dependency>
application.properties
#############Java知识日历 微信公众号 测试专用###########
# 是否解析 ExcelFile 类型的返回值为文件下载
com.gaoice.easyexcel.enable-excel-file=true
# 是否解析 SheetInfo 类型的返回值为文件下载
com.gaoice.easyexcel.enable-sheet-info=true
# 是否解析带有 @ResponseExcel 注解的函数的返回值为文件下载
com.gaoice.easyexcel.enable-response-excel=true
Student.java (Model类)
package com.nh.modules.test.model;
/**
* @author Java知识日历
*/
public class Student {
private String name;
private String stuNo;
private int age;
private ClassTeacher classTeacher;//该学生的班主任
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getStuNo() {
return stuNo;
}
public void setStuNo(String stuNo) {
this.stuNo = stuNo;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public ClassTeacher getClassTeacher() {
return classTeacher;
}
public void setClassTeacher(ClassTeacher classTeacher) {
this.classTeacher = classTeacher;
}
}
ClassTeacher.java (Model类)
package com.nh.modules.test.model;
/**
* @author Java知识日历
*/
public class ClassTeacher {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
TestController.java
package com.nh.modules.test.controllers;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.gaoice.easyexcel.SheetInfo;
import com.gaoice.easyexcel.spring.boot.autoconfigure.ExcelFile;
import com.gaoice.easyexcel.spring.boot.autoconfigure.annotation.ResponseExcel;
import com.nh.modules.test.model.ClassTeacher;
import com.nh.modules.test.model.Student;
/**
* @author Java知识日历
*
* 在 Controller 上使用 @RestController 或者 @ResponseBody 会导致 starter 失效
*/
@Controller
@RequestMapping("/test")
public class TestController {
/**
* 注解 @ResponseExcel 的必须值:classFieldNames
* sheetName 默认值为 default
* fileName 默认使用 sheetName 的值
* columnNames 默认使用 classFieldNames 的值
* sheetStyle 可以指定样式,默认为 DefaultSheetStyle.class
* 生效条件:
* enable-response-excel=true
* 使用 @ResponseExcel 注解
* 不使用 @ResponseBody 注解
*
* @return List
*/
@RequestMapping("/downloadExcel")
@ResponseExcel(fileName="Java知识日历20201101测试",sheetName = "同一班的同学名册",columnNames= {"学生姓名","学号","年龄"},classFieldNames = { "name","stuNo","age" })
public List<Student> list() {
return getStudents();
}
/**
* 生成测试数据
*
* @return List
*/
private List<Student> getStudents() {
List<Student> list = new ArrayList<Student>();
Student stu = new Student();
stu.setName("Java知识日历");
stu.setAge(3);
stu.setStuNo("A0001");
ClassTeacher classTeacher = new ClassTeacher();
classTeacher.setName("Java课老师");
stu.setClassTeacher(classTeacher);
list.add(stu);
for(int i = 0;i<10;i++) {
Student testStu = new Student();
testStu.setName("小明"+i+"号" );
testStu.setAge(6+i);
testStu.setStuNo("A000"+(i+2));
ClassTeacher classTeacher1 = new ClassTeacher();
classTeacher1.setName((i+1)+"课老师");
testStu.setClassTeacher(classTeacher1);
list.add(testStu);
}
return list;
}
/***其他特殊需要定制的需求。可以灵活组合,满足你个性定制的需求***/
/**
* 文件名默认使用 sheetName
* 生效条件:
* enable-sheet-info=true
* 返回值类型为 SheetInfo
* 不使用 @ResponseBody 注解
*
* @return SheetInfo
*/
@RequestMapping("/sheetInfo")
public SheetInfo sheetInfo() {
String sheetName = "灵活组合测试";
String[] columnNames = {"学生姓名", "学号", "年龄"};
String[] classFieldNames = {"name", "stuNo", "age"};
List<Student> data = getStudents();
return new SheetInfo(sheetName, columnNames, classFieldNames, data);
}
/**
* 生效条件:
* enable-excel-file=true
* 返回值类型为 ExcelFile
* 不使用 @ResponseBody 注解
*
* @return ExcelFile
*/
@RequestMapping("/excelFile")
public ExcelFile excelFile() {
/* SheetInfo */
String sheetName = "灵活组合测试Sheet1";
String[] columnNames = {"学生姓名", "学号", "年龄"};
String[] classFieldNames = {"name", "stuNo", "age"};
List<Student> data = getStudents();
SheetInfo sheetInfo1 = new SheetInfo(sheetName, columnNames, classFieldNames, data);
String sheetName2 = "灵活组合测试Sheet2";
String[] columnNames2 = {"学生姓名", "学号", "年龄","班主任姓名"};
String[] classFieldNames2 = {"name", "stuNo", "age","classTeacher.name"};
SheetInfo sheetInfo2 = new SheetInfo(sheetName2, columnNames2, classFieldNames2, data);
/* 通过 ExcelFile 自定义下载的文件名,放入多个 sheet */
ExcelFile excelFile = new ExcelFile();
excelFile.setFileName("ExcelFile可以自定义文件名和放入多个sheet");
excelFile.addSheet(sheetInfo1);
excelFile.addSheet(sheetInfo2);
return excelFile;
}
}
上面的TestController.java全部测试结果截图
![](https://i-blog.csdnimg.cn/blog_migrate/fc6e1df5f51bcab9796e1e9c12ee31a5.png)
ExcelFile对象生成的定制版Excel
![](https://i-blog.csdnimg.cn/blog_migrate/64d580717b78c941f078169385cad870.png)
SheetInfo对象生成的定制版Excel
![](https://i-blog.csdnimg.cn/blog_migrate/77a44ac5cbdeee985c75d3da0cefef68.png)
使用@ResponseExcel注解的普通Excel
![](https://i-blog.csdnimg.cn/blog_migrate/b01e4af256af5ce35e7a1370ede65836.png)
作者寄语
有兴趣的朋友可以copy我的代码测试一下,就可以发现使用一个注解 @ResponseExcel 就解决生成Excel的问题了,少了很多冗余代码,简洁了很多,看起来心情好多了。
原创不易啊!希望大家多多支持哈,后面会有更多更好的原创文章分享给大家的。希望大家能给我点个赞支持一下我,最好还点亮小花花(“在看”)啦。谢谢。