Springboot使用EasyExcel 的填充模板导出,导出为多Sheet工作簿
概述
Springboot使用EasyExcel 的填充模板导出,导出为多Sheet工作簿
详细代码
Excel数据填充
/**
* 使用 EasyExcel 写入Excel
* @param excelModelFilePath 模板文件地址
* @param sheetNameAndDataMap Sheet名称与Sheet数据Map集合,key为Sheet名称,value为Sheet数据集合
* @return
*/
public byte[] writeExcelData(String excelModelFilePath, Map<String, List> sheetNameAndDataMap){
try(
ByteArrayOutputStream returnStream = new ByteArrayOutputStream();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
InputStream resourceAsStream = getClass().getResourceAsStream(excelModelFilePath);){
XSSFWorkbook workbook = new XSSFWorkbook(resourceAsStream);
int i = 0;
for (String sheetName : sheetNameAndDataMap.keySet()) {
//设定key为工作簿名称
if (i == 0) {
workbook.setSheetName(0, StrUtil.isBlank(sheetName) ? ("Sheet" + i) : sheetName);
} else {
workbook.cloneSheet(0, StrUtil.isBlank(sheetName) ? ("Sheet" + i) : sheetName);
}
i++;
}
workbook.write(byteArrayOutputStream);
byte[] bytes = byteArrayOutputStream.toByteArray();
try (InputStream inputStream = new ByteArrayInputStream(bytes);
ExcelWriter excelWriter = EasyExcel.write(returnStream).withTemplate(inputStream).excelType(ExcelTypeEnum.XLSX).build()
) {
i = 0;
for (Map.Entry<String, List> entry : sheetNameAndDataMap.entrySet()) {
String sheetName = entry.getKey();
List sheetData = entry.getValue();
// 根据Sheet名称填充数据,注意:workbook填充SheetName工作簿名称时,最长31位,当超过时会自动截取,所以此处也需要手动截取,否则找不到Sheet进行填充会报错
WriteSheet writeSheet = EasyExcel.writerSheet(StrUtil.isBlank(sheetName) ? ("Sheet" + i) : StrUtil.sub(sheetName, 0, 31)).build();
excelWriter.fill(sheetData, writeSheet);
i++;
}
excelWriter.finish();
}
return returnStream.toByteArray();
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("Excel写入错误:" + e.getMessage());
}
}
注意:在填充模板中的占位符前加上【.】这样才能填充List集合,如果不添加则只能填充单一的KeyValue类型的Map或实体类
导出Excel
@PostMapping("/downloadExcel")
public void downloadExcel(HttpServletResponse response){
String excelModelFilePath = "/xxx/xxx/xxx/模板.xlsx";
Map<String, List> sheetMap = new HashMap<>();
sheetMap.put("Sheet1", new ArrayList<>());
sheetMap.put("Sheet2", new ArrayList<>());
// 写入Excel数据并获取写入后的Excel的byte[]
byte[] exportExcelByte = service.writeExcelData(excelModelFilePath, sheetMap);
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding(StandardCharsets.UTF_8.toString());
String fileName = URLEncoder.encode("测试", StandardCharsets.UTF_8.toString());
response.setHeader("Content-Disposition", "attachment; filename=" + fileName + ".xlsx");
InputStream inputStream = new ByteArrayInputStream(exportExcelByte);
IoUtil.copy(inputStream, response.getOutputStream());
}
作者:假装空白
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
分类:
Java学习——笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用