Java多sheet模板导出表格

2023-05-16

前言

需求是这样的,需要在页面导出列表表格时同时导出每项的详情数据,而且详情表格并不是一个常规的二维表格,就像图中这样的效果,所以要解决的最主要两个问题就是:多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中的key
	workbook.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()) {
	//获取sheet
    WriteSheet 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java多sheet模板导出表格 的相关文章

  • 获取 UndeclaredThrowableException 而不是我自己的异常

    我有以下代码 public Object handlePermission ProceedingJoinPoint joinPoint RequirePermission permission throws AccessException
  • 如何将log4j日志文件更改为utf8

    我收到了一个使用 log4j 作为记录器应用程序的代码 如何为其生成 UTF8 日志文件 log4j 创建的日志文件目前为 ASCII 格式 我已经尝试过以下操作 按照以下说明设置日志文件的文件编码 vi current set bomb
  • Maven UTF-8编码问题

    当我使用两个不同的项目运行下面的代码时 我得到不同的输出 String myString T rk e Karakter Testi i String value new String myString getBytes UTF 8 Sys
  • Gradle 同步失败:配置项目“:lib”时出现问题

    我正在尝试在 android studio 中构建一个项目 但它总是失败 并出现名为 org gradle api ProjectConfigurationException A problem occurred configuring p
  • 继续使用 sketch.js 编辑草图图像 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在使用 sketch js 中的示例 http intridea github io sketch js http intridea g
  • Java程序验证signtool签名的数字签名

    我已经使用 SignTool 对文件 exe 或 dll 不是 jar 文件 进行了数字签名 Signtool还可以验证数字签名 但我的要求是使用java程序检查由signtool签名的文件的数字签名 我在互联网上搜索但没有找到任何信息 您
  • 为什么从 Eclipse 导出的可运行 JAR 不起作用?

    我有一个在 Eclipse 中运行良好的项目 但是 当我将其导出到可运行的 JAR 其中包含依赖项 时 它不会运行 从控制台运行 JAR 时出现的错误是 编辑 之前没有使用 jar 运行它 INFO Loading XML bean def
  • Powermockito 可以在非最终具体类中模拟最终方法吗?

    假设我有一个非最终具体类 具有如下所示的最终方法 public class ABC public final String myMethod return test test 可以嘲笑吗myMethod 调用时返回其他内容junit usi
  • Android - 使用 Intent 打开 PDF 文档关闭后不保存

    我面临的问题是 当尝试保存对使用此 URI 打开的 PDF 文档的更改时内容 xx xxx xxx fileprovider external Download Sync FileName pdf 我所做的任何更改在关闭文档后都不会保存 但
  • 检查 jar 是否从 shell 运行

    我有一个 java jar 程序 我试图在我的机器启动时运行它 理想情况下 shell 脚本将每 60 秒检查一次以确保 jar 正在运行 我如何检查 jar 是否在 centos 上运行 这似乎不起作用 我当前的 sh 文件 bin ba
  • 如何暂停程序直到按下按钮?

    我使用从 jframe 扩展的类 它有一个按钮 我在程序中使用它 我希望当在我的程序中运行 jframe 时我的整个程序暂停 直到我按下按钮 我该怎么做 in c getch 做这个 我想要一个这样的功能 通过睡眠暂停执行 http dow
  • 如何跨工作区保存 E​​clipse 启动配置文件?

    当我复制 Eclipse 项目目录时 它包含 classpath 和 project 文件 这样当我将同一目录带到另一个 Eclipse 实例时 我不必设置我的构建路径等 假设所有资源都包含在在项目中 而不是外部 但是 此过程不会导致启动配
  • 如何知道 Solr Optimize 何时完成?

    我正在使用 Solr php client 通过 php 与 Solr 进行通信 这段代码触发solr优化命令 solr gt optimize 请问有没有什么方法可以确定优化完成了 这都是因为我的网站上有一个管理页面 我每天必须手动优化
  • 为什么ArrayList没有getSize()而不是size()?

    我在一些 JSP 页面中大量使用 ArrayList 我想像这样访问 ArrayList myArrayList size 但由于对象必须符合 JavaBean 标准 其中myArrayList getMyPropertyName is m
  • 在 Android 上解析 RSS

    我有几个 RSS 源需要为我的应用程序进行解析 我按照这里的优秀教程进行操作 http w2davids wordpress com android rssatom feeds parsing with rome http w2davids
  • Java 会话变量

    我听说有些人认为在会话中将信息存储在服务器上是一个坏主意 因为它不安全 因此 在多页面业务流程功能中 应用程序将数据写入数据库 然后在需要时检索信息 在会话中存储私人信息是否一定不安全 只要会话本身安全 在会话中存储属性就不存在安全风险劫持
  • Spring 4 MVC 和 Websockets - 没有合适的默认 RequestUpgradeStrategy

    我需要 Websockets 在我的应用程序中进行实时更新 所以我找到了这个例子并一步一步地做到了here http raymondhlee wordpress com 2014 01 19 using spring 4 websocket
  • 清单合并失败:需要为 显式指定 android:exported

    我的清单文件有问题 错误消息 清单合并失败 android 需要为 明确指定导出 面向 Android 12 及更高版本的应用需要指定显式值android exported当相应的组件定义了意图过滤器时 有关详细信息 请参阅 https d
  • 我们可以将请求分派到 servlet 内的 HTML

    这可能吗 RequestDispatcher rd request getRequestDispatcher index html rd forward request response 是的 您可以将请求分派到 HTML 页面
  • java有类似C#的属性吗? [复制]

    这个问题在这里已经有答案了 C 属性 我的意思是 get 和 set 方法 是一个非常有用的功能 java 也有类似 C 的属性吗 我的意思是我们如何在 java 中实现类似以下 C 代码的内容 public string Name get

随机推荐

  • 执行体线程--ETHREAD

    typedef struct ETHREAD KTHREAD Tcb 内嵌了KTHREAD对象作为第一个数据成员 LARGE INTEGER CreateTime 包含了线程创建时间 xff0c 他是在线程创建时被赋值的 union LAR
  • 显卡驱动的作用(本质作用)

    确切资料表明显卡不需要驱动也可以进行显示 xff0c 只需要将显示的内容存到对应的显存地址就可以 xff08 通过cpu直接或者间接的硬连线实现 xff09 也就是说单纯的显示像素的话不需要使用显卡驱动 xff0c 但是单纯的显示像素甚至某
  • 智能指针之make_unique与make_shared

    make unique的实现 std make shared是C 43 43 11的一部分 xff0c 但是std make unique很可惜不是 它是在C 43 43 14里加入标准库的 xff0c 但我们可以自己实现make uniq
  • NVIDIA Jetson TX1 系列开发教程之十二:libcurl、RapidJSON安装

    NVIDIA Jetson TX1 系列开发教程之十二 xff1a libcurl RapidJSON安装 转载请注明作者和出处 xff1a http blog csdn net u011475210嵌入式平台 xff1a NVIDIA J
  • 用户标签体系的搭建方法

    一 标签体系的困境 每一个需求背后都有对应的痛点和问题 xff0c 在讲具体的方法之前 xff0c 笔者想简单阐述一下标签体系搭建和实践过程中企业一般会遇到的问题 困境 xff0c 方便读者理解本文的搭建思路 目的和未来的优化方向 用户标签
  • Windows 安装TVM 及各种报错解决!无GPU版本

    这篇先来一个不用GPU的下次 xff0c 再整一个带GPU的 xff01 系统基本信息 Windows 11 Anaconda 4 12 Python 3 8 13 Visual Studio 2022 这几天在Windows 下安装TVM
  • C++变量前面加下划线的含义

    C 43 43 变量前面加下划线和不加下划线都不会影响对变量的定义 xff0c 只是风格问题 xff0c 更喜欢将成员变量或者私有成员变量的前面加上下划线 以表示该变量是某个类的属性 比如 xff1a int size int getsiz
  • tensorflow中GPU相关设置解决显存不足

    1 显存不足时报错如下 xff1a E tensorflow stream executor cuda cuda dnn cc 359 could not create cudnn handle CUDNN STATUS INTERNAL
  • freertos 学习笔记——第一章、裸机进阶RTOS

    第一章 前言 1 1裸机的软件写法 1 xff0c 轮询系统 void main sys init while 1 task 1 task 2 任务处理在循环中依次执行 2 xff0c 前后台系统 中断被成为前台 xff0c 无限循环被成为
  • freertos学习笔记——第三章、任务控制——3.1 全局变量造成的困扰

    裸机中经常使用全局变量 xff0c 但在RTOS中大量使用全局变量会造成很多问题 在RTOS中也可以使用全局变量但使用时一定要注意有哪些任务会写这个变量 xff0c 哪些任务会读这个变量 尤其切记在使用这个变量的过程中变量的数值发生改变 x
  • MTK项目总结

    一 sensor路径 vendor mediateck propri sensor校准 xff1a 加速度校准 adb shell 34 echo 1 gt sys bus platform drivers gsensor test cal
  • JAVA简述和JDK环境搭建

    一 Java 语言背景介绍 1 什么是 Java 语言 xff1f Java 语言是美国 Sun 公司 xff08 Stanford University Network xff09 在 1995 年推出的计算机语言 2009年 xff0c
  • Java变量、标识符以及类型转换详解

    本篇文章为本人学习笔记 xff0c 如有错误 xff0c 希望指正 一 进制 进制详细概念以及转换 xff1a https blog csdn net diyu122222 article details 80692904 这篇写的很好 x
  • Java运算符的使用和规则

    本篇文章为本人学习笔记 xff0c 如有错误 xff0c 希望指正 Java中运算符大致分为以下几类 xff1a 算数运算符赋值运算符自增自减运算符关系运算符逻辑运算符三元运算符 1 算数运算符 算数运算符包括 xff1a 作用 43 加法
  • Java的内存分配理解

    本篇文章为本人学习笔记 xff0c 如有错误 xff0c 希望指正 Java 程序在运行时 xff0c 需要在内存中分配空间 为了提高运算效率 xff0c 就对空间进行了不同区域的划分每一片区域都有特定的处理数据方式和内存管理方式 区域名称
  • IntelliJ IDEA的Debug教程

    1 什么是Debug模式 它是供程序员使用的程序调试工具 xff0c 它可以用于查看程序的执行流程 xff0c 也可以用于追踪程序执行过程来调试程序 2 Debug模式操作流程 如何加断点 选择要设置断点的代码行 xff0c 在行号的区域后
  • opencv获取相机图像并发布为ROS节点

    仅记录工程中的使用 完整代码请查看 xff1a https github com chx725 cv and ros ROS是最普遍使用的机器人系统之一 xff0c 提供了各种功能包 xff0c 仿真环境 xff0c 模型 xff0c 可视
  • Java中两种方法实现栈和队列(面试)

    学到LinkedList xff0c 上课时老师提了一下代码实现栈和队列 xff0c 面试可能会用上 xff0c 就码了栈和队列两种实现方案 如有问题 xff0c 希望指出 一 栈 1 数组实现栈 span class token comm
  • docker容器迁移教程

    前言 被领导要求部署一个和测试环境一样的演示环境 xff0c 并且数据库也要同步过去 xff0c 服务器上的各种服务都是docker部署的 xff0c 由于之前docker玩的比较少 xff0c 所以还是踩了不少坑的 xff0c 在此记录一
  • Java多sheet模板导出表格

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