网站一条龙服务,阿里云wordpress优化,wordpress做成微信小程序,沈阳中小企业网站制作背景
在使用easyexcel导出时#xff0c;如果遇到一个模板中同时存在 一部分是实体类中的字段#xff0c;另外部分是列表的字段#xff0c;需要特殊处理一下#xff0c;比如下面的模板#xff1a;
这里面 user#xff0c; addr 是实体类#xff08;或者map#xff09…背景
在使用easyexcel导出时如果遇到一个模板中同时存在 一部分是实体类中的字段另外部分是列表的字段需要特殊处理一下比如下面的模板
这里面 user addr 是实体类或者mapextra是一个字符串datadata1是两组列表数据。
准备数据的代码如下 private static MapString, Object getParams() {// 准备导出的数据User user new User();user.setName(user);MapString, Object addr new HashMap();addr.put(name, addr);String extra extra;ListData dataList new ArrayList();for (int i 0; i 10; i) {Data data new Data();data.setName(data i);data.setAge(i);dataList.add(data);}MapString, Object params HashMap.newHashMap(16);params.put(user, user);params.put(addr, addr);params.put(extra, extra);params.put(data, dataList);params.put(data1, dataList);return params;}问题
我们一开始的想法很简单直接把这些参数打包丢到map里面直接fill一次不就成功了但是实际上并没有成功,导出代码如下
var params getParams();
String templateFileName D:\\test.xlsx;String fileName D:\\test-res.xlsx;
try (ExcelWriter excelWriter EasyExcel.write(fileName).withTemplate(templateFileName).build()) {WriteSheet writeSheet EasyExcel.writerSheet().build();excelWriter.fill(params, writeSheet);
}导出结果
可以看到除了没有前缀的的extra所有带前缀的都导出失败了仔细查阅文档后发现这些需要用FillWrapper包装一下为了方便使用这里写了一个工具类代码如下
public static void export(String templateFileName, String outputFile, MapString, Object params){try (ExcelWriter excelWriter EasyExcel.write(outputFile).withTemplate(templateFileName).build()) {WriteSheet writeSheet EasyExcel.writerSheet().build();// 先把不带前缀的都fill进去excelWriter.fill(params, writeSheet);params.forEach((key, val) - {// 基础类型都是不带前缀的前面处理了不再处理。if (ClassUtil.isBasicType(ClassUtil.getClass(val))) {return;}if (val instanceof Collection? collectionVal) {// 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行然后下面的数据往后移动。默认 是false会直接使用下一行如果没有则创建。// forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了所以慎用// 简单的说 如果你的模板有list,且list不是最后一行下面还有数据需要填充 就必须设置 forceNewRowtrue 但是这个就会把所有数据放到内存 会很耗内存FillConfig fillConfig FillConfig.builder().forceNewRow(Boolean.TRUE).build();excelWriter.fill(new FillWrapper(key, collectionVal), fillConfig, writeSheet);}else {// bean/map 只能假装是个列表了excelWriter.fill(new FillWrapper(key, Collections.singleton(val)), writeSheet);}});}}代码中的ClassUtil是hutool的
导出结果 可以看到几处都填充成功了。
补充
web环境下把导出方法的前俩参数直接改成对应的输出/输入流就行了。