feat(excel): 新增混合模式模板导出功能

- 支持 Map 对象的原地填充占位符
- 支持 List 列表的展开填充新行
- 提供基于 HttpServletResponse 的导出接口
- 支持自定义模板路径和输出流导出
- 集成大数字类型转换器防止数据丢失
- 优化导出流程,支持多种数据混合填充
dev
zangch@mesnac.com 4 weeks ago
parent 4040437030
commit fca9418657

@ -3,8 +3,8 @@ package org.dromara.common.excel.utils;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.resource.ClassPathResource; import cn.hutool.core.io.resource.ClassPathResource;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import cn.idev.excel.FastExcel;
import cn.idev.excel.ExcelWriter; import cn.idev.excel.ExcelWriter;
import cn.idev.excel.FastExcel;
import cn.idev.excel.write.builder.ExcelWriterSheetBuilder; import cn.idev.excel.write.builder.ExcelWriterSheetBuilder;
import cn.idev.excel.write.metadata.WriteSheet; import cn.idev.excel.write.metadata.WriteSheet;
import cn.idev.excel.write.metadata.fill.FillConfig; import cn.idev.excel.write.metadata.fill.FillConfig;
@ -476,4 +476,58 @@ public class ExcelUtil {
return IdUtil.fastSimpleUUID() + "_" + filename + ".xlsx"; return IdUtil.fastSimpleUUID() + "_" + filename + ".xlsx";
} }
/**
* ( Map + List )
*
* @param data
* @param filename
* @param templatePath
* @param response
*/
public static void exportTemplateMixed(Map<String, Object> data, String filename, String templatePath, HttpServletResponse response) {
try {
resetResponse(filename, response);
ServletOutputStream os = response.getOutputStream();
exportTemplateMixed(data, templatePath, os);
} catch (IOException e) {
throw new RuntimeException("导出Excel异常");
}
}
/**
* ( Map + List )
* Map/Object -> forceNewRow=false ()
* Collection -> forceNewRow=true ()
*
* @param data
* @param templatePath
* @param os
*/
public static void exportTemplateMixed(Map<String, Object> data, String templatePath, OutputStream os) {
ClassPathResource templateResource = new ClassPathResource(templatePath);
ExcelWriter excelWriter = FastExcel.write(os)
.withTemplate(templateResource.getStream())
.autoCloseStream(false)
.registerConverter(new ExcelBigNumberConvert())
.build();
WriteSheet writeSheet = FastExcel.writerSheet().build();
for (Map.Entry<String, Object> entry : data.entrySet()) {
String key = entry.getKey();
Object value = entry.getValue();
boolean isCollection = value instanceof Collection;
// 智能判断:只有集合才需要展开新行,普通数据原地替换
FillConfig fillConfig = FillConfig.builder().forceNewRow(isCollection).build();
if (isCollection) {
excelWriter.fill(new FillWrapper(key, (Collection<?>) value), fillConfig, writeSheet);
} else {
excelWriter.fill(value, fillConfig, writeSheet);
}
}
excelWriter.finish();
}
} }

Loading…
Cancel
Save