EasyExcel 自定义导出列和顺序
该功能需要前后端进行衔接 。前端需要传输两个集合,后端可以封装到一个对象中进行接收
集合1: List headList
集合2: List columnList 【对应后端实体类需要导出的字段】
代码块
前端可选择导出的列数和顺序
1. 实体类
@Data
public class ScenicAnalysis extends BaseEntity{
private static final long serialVersionUID = 1L;
//需要导出的列的集合
private List<String> columnList;
//需要导出的列的集合
private List<String> headList;
}
2. 控制层
@PostMapping("/exportColumn")
public void exportColumn(HttpServletResponse response, @RequestBody ScenicAnalysis scenicAnalysis) {
scenicAnalysisService.exportColumn(response,scenicAnalysis);
}
3. 方法层
public void exportColumn(HttpServletResponse response, ScenicAnalysis scenicAnalysis) {
//根据自己的业务逻辑生成对应的List<Object>类型的集合
List<Object> list = new ArrayList<>();
try {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
//控制 导出字段 未控制顺序
EasyExcel.write(response.getOutputStream(), ScenicAnalysis.class)
.head(head(scenicAnalysis.getHeadList()))
.includeColumnFiledNames(scenicAnalysis.getColumnList())
.sheet("模板")
.doWrite(dataList(list,scenicAnalysis.getColumnList()));
} catch (IOException e) {
e.printStackTrace();
}
}
4. 公共方法 (直接使用)
4.1 设置表头
/**
* 设置Excel头
* @param headList Excel头信息
* @return
*/
private static List<List<String>> head(List<String> headList) {
List<List<String>> list = new ArrayList<>();
for (String value : headList) {
List<String> head = new ArrayList<>();
head.add(value);
list.add(head);
}
return list;
}
4.2 设置表格信息
/**
* 设置表格信息
* @param dataList 查询出的数据
* @param fileList 需要显示的字段
* @return
*/
private static List<List<Object>> dataList(List<Object> dataList, List<String> fileList) {
List<List<Object>> list = new ArrayList<>();
for (Object person : dataList) {
List<Object> data = new ArrayList<>();
for (String fieldName : fileList) {
/**通过反射根据需要显示的字段,获取对应的属性值*/
data.add(getFieldValue(fieldName, person));
}
list.add(data);
}
return list;
}
4.3 根据字段生成对应的get方法
/**
* 根据传入的字段获取对应的get方法,如name,对应的getName方法
* @param fieldName 字段名
* @param person 对象
* @return
*/
private static Object getFieldValue(String fieldName, Object person) {
try {
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String getter = "get" + firstLetter + fieldName.substring(1);
Method method = person.getClass().getMethod(getter);
return method.invoke(person);
} catch (Exception e) {
return null;
}
}
以上可根据自己的业务需求进行相应调整