当前位置: 首页 > news >正文

使用easyexcel导出复杂模板,同时使用bean,map,list填充

背景

在使用easyexcel导出时,如果遇到一个模板中同时存在 一部分是实体类中的字段,另外部分是列表的字段,需要特殊处理一下,比如下面的模板:
在这里插入图片描述

这里面 useraddr 是实体类(或者map),extra是一个字符串,datadata1是两组列表数据。

准备数据的代码如下:

    private static Map<String, Object> getParams() {// 准备导出的数据User user = new User();user.setName("user");Map<String, Object> addr = new HashMap<>();addr.put("name", "addr");String extra = "extra";List<Data> dataList = new ArrayList<>();for (int i = 0; i < 10; i++) {Data data = new Data();data.setName("data" + i);data.setAge(i);dataList.add(data);}Map<String, 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, Map<String, 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不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存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);}});}}

代码中的ClassUtilhutool

导出结果:
在这里插入图片描述
可以看到,几处都填充成功了。

补充

web环境下把导出方法的前俩参数直接改成对应的输出/输入流就行了。

http://www.lryc.cn/news/493442.html

相关文章:

  • 最大值(Java Python JS C++ C )
  • 17.5k Star,ThingsBoard 一款开源、免费、功能全面的物联网 IoT 平台 -慧知开源充电桩平台
  • 《C++ 与神经网络:自动微分在反向传播中的高效实现之道》
  • 【CSS】设置文本超出N行省略
  • open-instruct - 训练开放式指令跟随语言模型
  • DI依赖注入详解
  • TDengine在debian安装
  • 【C#设计模式(15)——命令模式(Command Pattern)】
  • XGBoost库介绍:提升机器学习模型的性能
  • 网络安全构成要素
  • SpringMVC——SSM整合
  • Windows系统电脑安装TightVNC服务端结合内网穿透实现异地远程桌面
  • 【ubuntu24.04】GTX4700 配置安装cuda
  • Spring Boot 动态数据源切换
  • MySQL技巧之跨服务器数据查询:进阶篇-从A服务器的MySQ数据库复制到B服务器的SQL Server数据库的表中
  • 大语言模型LLM的微调中 QA 转换的小工具 xlsx2json.py
  • CFD 在生物反应器放大过程中的作用
  • Axios与FastAPI结合:构建并请求用户增删改查接口
  • 美畅物联丨如何通过ffmpeg排查视频问题
  • 基于OpenCV视觉库让机械手根据视觉判断物体有无和分类抓取的例程
  • QChart数据可视化
  • 转换的艺术:如何在JavaScript中序列化Set为Array、Object及逆向操作
  • 万能门店小程序管理系统存在前台任意文件上传漏洞
  • 详解Rust泛型用法
  • 移远通信携手紫光展锐,以“5G+算力”共绘万物智联新蓝图
  • Mybatis:Mybatis快速入门
  • 微信小程序用户登录页面制作教程
  • python+django自动化平台(一键执行sql) 前端vue-element展示
  • JavaScript学习总结
  • Python 3 教程第22篇(数据结构)