以前做导出功能,表头和数据都是固定的。使用EasyExcel实体类上注解的方式就是。比如这样
@Getter
@Setter
@EqualsAndHashCode
public class DemoData {
@ExcelProperty("姓名")
private String name;
@ExcelProperty("年龄")
private String age;
@ExcelProperty("手机号")
private String phone;
}
//然后伪代码
List<MemoData> data = 数据查库。。。。
EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data);
但是TMD,有时候表头是动态的,从数据库里取的或者动态计算的。例如表头可能是动态的天数。
总不能这样
@ExcelProperty("1日")
private String oneDay;
@ExcelProperty("2日")
private String twoDay;
.........
或者反射创建这个对象?
一开始,以为可以直接用Map接受数据
想用List<Map<Object,Object>> data取代 List<MemoData> data
然而并没有什么卵用
后来通过查看官方文档,终于找到了解决办法。
文档地址:写excel · 语雀
首先表头是可以动态的。(这个我早就知道,只是不知道数据怎么映射)
然后数据映射,可以这么解决
用 List<List<Object>> 取代了 List<MemoData> data
完美解决!
脱敏后的效果如下,表头的时间是动态的: