前言

需求是这样的,需要在页面导出列表表格时同时导出每项的详情数据,而且详情表格并不是一个常规的二维表格,就像图中这样的效果,所以要解决的最主要两个问题就是:多sheet实现、异形表格模板填充。

教程

1.引入EasyExcel,为了减少代码量,不重复造轮子

<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.0</version>
</dependency>

2.写填充模板

  • 我导出的表格需要有个汇总表,填充的是集合需要在变量前加点,像这样 {.变量名}

  • 这是详情表,模板可以根据你想要的来,填充非对象集合就不需要加点,这里要记住你需要生成多sheet的模板索引,这里位置在第二个,索引就是1,后面编码过程会用到

3.编码

3.1 生成多sheet名-数据对象键值对

  • 根据你的业务需求,我们可以提前把模板生成好,再去填充数据,excel中不能出现重复的sheet名,我们要把重命名的sheet名和数据对应上,我们可以创建一个HashMap去存放sheet名和数据对,这是我的代码:
//这是我想要的数据集合
List<Student> list = taskList(new Student(idList));//sheet名-数据对象
Map<String, Student> sheetMap = new HashMap<>();
for (Student student : list) {String sheetName = student.getName() + "--表格";//防止重名putIfContainsKey(sheetMap, sheetName, student);
}
  • 我这里的sheet名是有可能会重复的,所以这里的put自己写了递归去重命名,putIfContainsKey方法如下,遇到重复的sheet直接递归在sheet名后加(1)
public static void putIfContainsKey(Map sheetMap, String sheetName, Object data) {if(sheetMap.containsKey(sheetName)){putIfContainsKey(sheetMap, sheetName + "(1)", data);}else {sheetMap.put(sheetName, data);}
}

3.2 生成多sheet模板

//获取模板输入流
InputStream inStream = new FileInputStream("D:\template.xlsx");
//这里就是模板的sheet索引
int cloneIndex = 1;
//通过poi创建表对象
XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
//遍历复制sheet
ByteArrayOutputStream bos = new ByteArrayOutputStream();
for (Map.Entry<String, Domain> entry : sheetMap.entrySet()) {//给复制的sheet命名,这里取的就是map中的keyworkbook.cloneSheet(cloneIndex, entry.getKey());
}//移除原始模板sheet
workbook.removeSheetAt(cloneIndex);
//写到流
workbook.write(bos);

3.3 通过EasyExcel导出表格

//输出文件名
String filename = "D:\out.xlsx";
//创建模板输入流
ByteArrayInputStream is = new ByteArrayInputStream(bos.toByteArray());
//构造表格
ExcelWriter excelWriter = EasyExcel.write(filename).withTemplate(is).build();
//填充配置, 这里的意义是给模板中的集合数据添加新行, 保证导出不会错乱
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();//填充汇总数据
WriteSheet writeSheet = EasyExcel.writerSheet("汇总").build();
excelWriter.fill(list, fillConfig, writeSheet);
//遍历填充详情数据
for (Map.Entry<String, Domain> entry : sheetMap.entrySet()) {//获取sheetWriteSheet writeSheet = EasyExcel.writerSheet(entry.getKey()).build();//填充对象数据 直接放对象即可excelWriter.fill(entry.getValue(), fillConfig, writeSheet);//填充集合数据 需要放集合List<DomainDetail> detailList = entry.getValue().getDetailList();excelWriter.fill(list, fillConfig, writeSheet);
}
//关流
excelWriter.finish();

原文地址: Java多sheet模板导出表格 - Aunero’s Blog

Java多sheet模板导出表格相关推荐

  1. java通过Excel 模板导出复杂统计类excel文档,在ruoyi前后端分离框架中的应用

    Hello, 大家好! 我是不作死就不会死,智商不在线,但颜值超有品的拆家队大队长 --咖啡汪 一只不是在戏精,就是在戏精路上的极品二哈 前几天刚做了java通过Excel 模板导出复杂统计类exce ...

  2. 【Apache POI】Java Web根据模板导出word文件

    最近工作中遇到一个需求:根据word模板文档导出word文件. 查阅了一些资料,发现Apache POI可以实现文档读写的功能,于是就研究了一下,总结如下: Apache-POI在线Javadoc:h ...

  3. java 根据excel模板导出excel

    java 根据excel模板导出excel 由于项目需求,最近做了一个需要根据查询接口导出excel表格数据的需求 pom依赖: <dependency><groupId>or ...

  4. java 分析excel模板,java 根据excel模板导出excel

    java 根据excel模板导出excel 由于项目需求,最近做了一个需要根据查询接口导出excel表格数据的需求 pom依赖: org.apache.poi poi 3.16 org.apache. ...

  5. java使用poi实现导出表格模板

    产品经理新需求!要求导出类似检查记录的模板表格下面是已经做好的表格 下面讲一讲如何实现 1,依赖导入 <!-- excel工具 --><dependency><group ...

  6. Chimm.Excel——使用 Java 基于 excel 模板操作表格的生成

    1. 项目介绍 1.1 简介 Chimm.Excel 是什么? 该程序是一个用 Java 写的 Excel 生成工具,基于模板操作,简单,快捷,易上手. 1.2 特性 数据组装方式大有不同 和网上部分 ...

  7. Java按照word模板导出、下载文档

    在日常的开发工作中,我们时常会遇到导出Word文档报表的需求,比如公司的财务报表.医院的患者统计报表.电商平台的销售报表等等. 导出Word方式多种多样,通常有以下几种方式: 1. 使用第三方Java ...

  8. java修改导出模板,java模板导出word模板 java根据word模板导出

    java 调用word模板实现循环套打生成word文档 首先我用的技术是 poi 这是代码,一个工具类得调用 public class WordUtil { /** * 基于模板文件导出 word 文 ...

  9. java根据word模板导出_java根据模板生成,导出word和pdf(aspose.words实现word转换pdf)...

    相关一部分java文件和jar包 pom文件 com.aspose aspose-words 18.2 word模板 其中的内容要在设置在表格里面 js导出方法 functionf_export(){ ...

最新文章

  1. 【Spring】面向切面编程AOP
  2. [转]IE11下Forms身份认证无法保存Cookie的问题
  3. 【Java报错】MultipartFile 类型文件上传 Current request is not a multipart request 问题处理(postman添加MultipartFile)
  4. Collection集合概述
  5. SAP Spartacus产品数据HTTP GET请求前的OPTIONS请求
  6. 由「Metaspace容量不足触发CMS GC」从而引发的思考
  7. OpenNMS全接触-事件及通知(九)
  8. KMS的几个开源实现汇总
  9. (37)VHDL实现RS触发器
  10. 爱奇艺纪录片《棒!少年》《从长安到罗马》入选广电总局“2020年优秀国产纪录片集锦”...
  11. vscode取消底部横滚动条(自动换行)
  12. 搜狗发布全球首位 3D AI 主播,背后分身技术有玄机
  13. python实现食品推荐_Python分析亚马逊赞不绝口食物评论
  14. Linux(ARM glibc)使用libhybris调用Android(ARM bionic)
  15. 如何保持MacBook电池健康并延长其使用寿命?
  16. 漂白android软件,原本图片漂白软件
  17. 魔窗使用笔记(穿透微信)
  18. java list移除所有元素_Java - List集合中如何删除多个元素? remove( )方法 ?
  19. 易中天品汉代风云人物02: 冤死的晁错(下)
  20. UE4 制作玻璃材质总结

热门文章

  1. 在iPhone或iPad上阅读新闻的最佳方法
  2. 为什么学Django及Django的未来在哪里?
  3. python多大的孩子_少儿python教材适合多大的孩子?孩子接触起来困难吗?
  4. 写个人app记录(小小宣传一下)《幼儿学古诗》
  5. Android漏洞与安全总结
  6. Continual Learning with Deep Generative Replay笔记
  7. php网站后门漏洞检测 渗透测试木马解决
  8. 编程从键盘上输入一行字符,依次读入字符显示在屏幕上,以回车结束输入
  9. 阿里云开通3306端口的坑
  10. java unchecked 警告_警告: [unchecked] 未经检查的转换