利用easyexcel生成excel文件-自定义表头与数据栏对应的处理方式
By:Roy.LiuLast updated:2020-12-21
前面几篇文章测试过用easyexcel生成动态表头,动态样式。特别是动态表头以及下面数据列表与表头字段的对应是采用注解方式实现的。但在实际工作中,有些到处是灵活生成的,也就是说对于同一个类,在不同的场景下,导出的字段,以及各自的顺序是完全不一样的。这个时候注解也就失去灵活性了。所以直接用编程方式处理数据字段对于各表头的顺序才是好的处理方式.
回顾一下前面写的类,在生成多表头时,为了保证表头与数据的对应,用到了注解 @ExcelProperty(value="名称",order = 0) 里面的order 就是表示位置,当然用index也是可以的。这种做法不够灵活,在我上面提到的场景下,完全无法满足要求,甚至位置到处错乱. 这个时候需要自定需要从列表里展示的字段,然后得到各自的值,按顺序加入到list中。这个顺序与你自定义表头的顺序一致。用反射来实现.
public List<List<Object>> getExportListDatas(List<T> list, List<String> includeColumns) {
List<List<Object>> listData = new ArrayList<>();
if (CollectionUtils.isEmpty(list)) {
return listData;
}
try {
for (T t : list) {
List<Object> rowLine = new ArrayList<>();
for(String s : includeColumns) {
String getMethodName = "get" + s.substring(0,1).toUpperCase() + s.substring(1);
Class clazz = t.getClass();
Method getMethod;
getMethod = clazz.getMethod(getMethodName, new Class[]{} );
Object value = getMethod.invoke(t, new Object[]{});
rowLine.add(value);
}
listData.add(rowLine);
}
}catch (Exception e) {
log.error("生成EXCEL错误:{}", e.getMessage());
}
return listData;
}很明显,这部分代码,就是将 List<T>转换成按顺序的的 List<List<Object>> ,然后我们把这个数据与对应的自定义头传入到 easyexcel的导出参数中:
EasyExcel.write(filePath) .head(headerList) .sheet(sheetName).doWrite(datas);
这里面的filePath是导出excel 的路径, headerList 是自定义 表头, datas 就是上面的List<List<Object>> 对象,数据顺序刚好与headList对应, 这样就很灵活的实现了自定义表土与数据的顺序展示.
参考
利用easyexcel生成excel文件-复杂表头/多表头/自定义表头设计
From:一号门
Previous:centos稳定版停止维护了, 真无耻呀

COMMENTS