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

Java-POI导出EXCEL(动态表头)

1、主要功能

        导出excel,表头有固定的和动态的。动态表头之间不能穿插固定表头

2、使用方法

        引入下方两个工具类,定义excel固定表头类。调用方法即可。

调用方法:

 ExcelDynamicHeader<MajorNameChangeReport> ledgerSafetyProblemExcelVoExcelUtil = new ExcelDynamicHeader<>(MajorNameChangeReport.class);ledgerSafetyProblemExcelVoExcelUtil.exportExcel(response, resultList,data, "sheet名称", "表格大标题名称");

        解释:response:HttpServletResponse response
                  resultlist:固定表头的数据,即 MajorNameChangeReport 类。
                  data:动态数据,数据形式为:Map<String,List<String>> data。map中的key为表头名
                             称,value为表格数据,注意,数据排序需要和固定表头的数据排序一致。

MajorNameChangeReport 类:

@Data
@Accessors(chain = true)
public class MajorNameChangeReport {private Integer num;@ExcelExport(value = "专业")private String majorName;@ExcelExport(value = "单位")private String depart="项";@ExcelExport(value = "合计",isFirtst = false)private String allCount="0";private String deptId;private Long  majorId;private String deptName;}

3、工具类

ExcelDynamicHeader:其中的log需要手动更改
package com.ruoyi.common.utils.poi.excel;import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;/*** @author  Mr.Gan* 类描述:  动态表头导出类* createTime:  2024/10/28 9:30*/
public class ExcelDynamicHeader<T> {private static final Logger log = LoggerFactory.getLogger(ExcelDynamicHeader.class);//大标题private String title;//数据对象private List<T> list;//动态数据对象private Map<String,List<String>> dynamicHeader;//实体对象public Class<T> clazz;//表格private Workbook workbook;//sheet页private Sheet sheet;//对象中所有要导入的字段private List<Field> firstFields=new ArrayList<>();private List<Field> lastFields=new ArrayList<>();public ExcelDynamicHeader(Class<T> clazz){this.clazz = clazz;}/*** @author Mr.Gan* 描述:* @param  * @param null:* @return* @date 9:35 2024/10/28*/public void exportExcel(HttpServletResponse response, List<T> list, Map<String,List<String>> dynamicHeader, String sheetName, String title) {// 设置响应内容类型和字符编码response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("UTF-8");//初始化表格initSheet(list, dynamicHeader, sheetName, title);//创建标题createHead();//写数据createData();try{workbook.write(response.getOutputStream());}catch (Exception e){log.error("导出Excel异常{}", e.getMessage());}finally{IOUtils.closeQuietly(workbook);}}//初始化private void initSheet(List<T> list, Map<String, List<String>> dynamicHeader, String sheetName, String title) {workbook=new XSSFWorkbook();sheet = workbook.createSheet(sheetName);this.list=list;this.dynamicHeader=dynamicHeader;this.title=title;}//创建大标题,和表格标题private void createHead(){// 创建单元格样式CellStyle cellStyle = workbook.createCellStyle();cellStyle.setAlignment(HorizontalAlignment.CENTER); // 水平居中cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直居中//创建表格标题Row row = sheet.createRow(1);Field[] declaredFields = clazz.getDeclaredFields();Integer cellIndex=0;//固定标题前部分for (Field declaredField : declaredFields) {if (declaredField.isAnnotationPresent(ExcelExport.class)){declaredField.setAccessible(true);ExcelExport attr = declaredField.getAnnotation(ExcelExport.class);if(attr.isFirtst()){row.createCell(cellIndex).setCellValue(attr.value());row.getCell(cellIndex).setCellStyle(cellStyle);cellIndex++;firstFields.add(declaredField);}else{lastFields.add(declaredField);}}}//动态标题部分for (String s : dynamicHeader.keySet()) {row.createCell(cellIndex).setCellValue(s);row.getCell(cellIndex).setCellStyle(cellStyle);cellIndex++;}//固定标题后部分for (Field declaredField : lastFields) {if (declaredField.isAnnotationPresent(ExcelExport.class)){declaredField.setAccessible(true);ExcelExport attr = declaredField.getAnnotation(ExcelExport.class);row.createCell(cellIndex).setCellValue(attr.value());row.getCell(cellIndex).setCellStyle(cellStyle);cellIndex++;}}//创建大标题Row row1 = sheet.createRow(0);row1.createCell(0).setCellValue(title);CellRangeAddress cellRangeAddress = new CellRangeAddress(0, // 第一行索引0, // 最后一行索引0, // 第一列索引cellIndex-1  // 最后一列索引);sheet.addMergedRegion(cellRangeAddress);//设置居中row1.getCell(0).setCellStyle(cellStyle);}private void createData(){Integer rowidex=2;try {for (T t : list) {int cellIndex=0;Row row = sheet.createRow(rowidex);//添加头数据for (Field firstField : firstFields) {firstField.setAccessible(true);Object value = firstField.get(t);row.createCell(cellIndex).setCellValue(value.toString());cellIndex++;}//动态数据for (String s : dynamicHeader.keySet()) {row.createCell(cellIndex).setCellValue(dynamicHeader.get(s).get(rowidex-2));cellIndex++;}//添加尾数据for (Field firstField : lastFields) {firstField.setAccessible(true);Object value = firstField.get(t);row.createCell(cellIndex).setCellValue(value.toString());cellIndex++;}rowidex++;}} catch (IllegalAccessException e) {throw new RuntimeException(e);}}}

ExcelExport类:
package com.ruoyi.common.utils.poi.excel;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelExport {/** 字段名称 */String value();//此标题是否在动态标题前boolean isFirtst() default true;
}

        

相关文章:

Java-POI导出EXCEL(动态表头)

1、主要功能 导出excel&#xff0c;表头有固定的和动态的。动态表头之间不能穿插固定表头。 2、使用方法 引入下方两个工具类&#xff0c;定义excel固定表头类。调用方法即可。 调用方法&#xff1a; ExcelDynamicHeader<MajorNameChangeReport> ledgerSafetyProblemEx…...

利用 Direct3D 绘制几何体—9.流水线状态对象

到目前为止展示过编写输入布局描述、创建顶点着色器和像素着色器&#xff0c;以及配置光栅器状态组这 3 个步骤。接下来讲如何将这些对象绑定到图形流水线上&#xff0c;用以实际绘制图形。大多数控制图形流水线状态的对象被统称为流水线状态对象&#xff08;Pipeline State Ob…...

【开源项目】libfaketime安装、使用——小白教程

项目 Github&#xff1a;GitHub - wolfcw/libfaketime: libfaketime modifies the system time for a single application libfaketime安装 01.切换路径&#xff0c;目标路径&#xff1a;/usr/local &#xff08;在/usr/local路径下git clone 开源项目) 切换路径指令: cd …...

java.util.concurrent包

java.util.concurrent包是Java中用于并发编程的重要工具集&#xff0c;提供了丰富的并发原语和组件&#xff0c;以简化多线程编程的复杂性&#xff0c;并帮助开发者编写高效、可伸缩和线程安全的并发程序。其主要功能包括以下几个方面&#xff1a; 一、线程池和任务执行框架 …...

Django创建项目模块+创建映射类+视图

确保你的项目已经正确链接数据库 链接数据库的工具有很多,数据库的种类也有很多&#xff0c;我使用的数据库是mysql&#xff0c;工具是pmysql&#xff0c;使用pymysql链接数据库&#xff0c;在settings文件中这么设置&#xff1a; DATABASES {# default: {# ENGINE: dja…...

使用AMD GPU和LangChain构建问答聊天机器人

Question-answering Chatbot with LangChain on an AMD GPU — ROCm Blogs 作者&#xff1a;Phillip Dang 2024年3月11日 LangChain是一个旨在利用语言模型强大功能来构建前沿应用程序的框架。通过将语言模型连接到各种上下文资源并基于给定的上下文提供推理能力&#xff0c;L…...

2024年808数据结构答案

1.已知带头结点单链表&#xff0c;H为头指针。设计一个算法&#xff0c;查找到链表的第m个结点(不包含头结点)&#xff0c;并将元 素值为X的结点插入到该结点后&#xff0c;形成一个新的链表。 // 定义单链表节点结构 typedef struct Node {int data;struct Node* next; } Nod…...

Amazon Linux 2023 安装 Docker

Amazon Linux 2023 安装 Docker 1. 简介 在公司需要将代码部属到 Amazon Linux 2023 系统上时&#xff0c;去 Docker 官方文档里面看也没有针对该系统的部属文档。虽然有通用的 Linux 部属方案但不能应用包管理工具。 首先执行yum、dnf、apt&#xff0c;执行yum和dnf都有正确…...

接口测试(八)jmeter——参数化(CSV Data Set Config)

一、CSV Data Set Config 需求&#xff1a;批量注册5个用户&#xff0c;从CSV文件导入用户数据 1. 【线程组】–>【添加】–>【配置元件】–>【CSV Data Set Config】 2. 【CSV数据文件设置】设置如下 3. 设置线程数为5 4. 运行后查看响应结果...

GGD证明推导学习

GGD证明推导学习 这篇文章&#xff0c;建议先看相关的论文。这篇是我读证明的感悟&#xff0c;因此&#xff0c;不会论文的主体内容 首先&#xff0c;给出命题&#xff1a; DGI的sumary向量是一个常数 给定一个图&#xff1a; G { X ∈ R N D , A ∈ R N N } \mathcal{G…...

Flink难点和高频考点:Flink的反压产生原因、排查思路、优化措施和监控方法

目录 反压定义 反压影响 WebUI监控 Metrics指标 backPressureTimeMsPerSecond idleTimeMsPerSecond busyTimeMsPerSecond 反压可视化 资源优化 算子优化 数据倾斜优化 复杂算子优化 背压机制 反压预防 性能调优 内置工具 第三方工具 反压定义 在探讨Flink的性…...

Swarm - Agent 编排工具

文章目录 一、关于 Swarm&#xff08;实验性、教育性&#xff09;为什么选择蜂群文档 二、安装使用安装基本用法其它示例 三、Running Swarmclient.run()ArgumentsResponse字段 四、AgentFields Agent指令函数切换和更新上下文变量函数模式 流媒体评估工具 一、关于 Swarm&…...

使用Python中的jieba库进行简单情感分析

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;情感分析是一项重要的任务&#xff0c;它可以帮助我们理解文本背后的情感倾向。本文将通过一个简单的例子来介绍如何使用Python的jieba库对中文文本进行基本的情感分析。 1. 环境准备 首先&#xff0c;确保已经安装…...

`pip` 下载速度慢

pip 下载速度慢&#xff08;例如只有 50KB/s&#xff09;可能由多个因素导致&#xff0c;以下是一些常见原因和解决方法&#xff1a; 1. 使用国内镜像源 国内访问 PyPI 服务器可能会较慢&#xff0c;您可以通过配置国内镜像源来提升下载速度。以下是一些常用的国内镜像源&…...

【WRF数据准备】基于GEE下载静态地理数据-叶面积指数LAI及绿色植被率Fpar

【WRF数据准备】基于GEE下载静态地理数据 准备:WRF所需静态地理数据(Static geographical data)数据范围说明基于GEE下载叶面积指数及绿色植被率GEE数据集介绍数据下载:LAI(叶面积指数)和Fpar(绿色植被率)数据处理:基于Python处理为单波段LAI数据参考GEE的介绍可参见另…...

网管平台(进阶篇):网管软件的配置方式

正确选择网管软件配置方式对于确保网络运行的高效性、稳定性和安全性至关重要&#xff0c;因为它直接影响到网络管理的灵活性、监控的深度以及故障响应的速度&#xff0c;从而保障整体网络环境的顺畅运行和业务连续性。下面我们就分别介绍一下。 一、集中式网络管理配置 在集…...

推荐系统中的AB测试

在现代互联网平台中&#xff0c;推荐系统起着至关重要的作用&#xff0c;无论是视频平台、社交网络还是电商网站&#xff0c;推荐系统都能够帮助用户找到最感兴趣的内容。为了不断优化推荐效果&#xff0c;AB测试&#xff08;A/B Testing&#xff09;作为评估新算法或功能改进的…...

.NET 8 Web API 中的身份验证和授权

本次介绍分为3篇文章&#xff1a; 1&#xff1a;.Net 8 Web API CRUD 操作.Net 8 Web API CRUD 操作-CSDN博客 2&#xff1a;在 .Net 8 API 中实现 Entity Framework 的 Code First 方法https://blog.csdn.net/hefeng_aspnet/article/details/143229912 3&#xff1a;.NET …...

Vue弹窗用也可以直接调用Js方法了

问题描述 在前端开发中&#xff0c;弹窗开发是一个不可避免的场景。然而&#xff0c;按照正常的逻辑&#xff0c;通过在template模板中先引用组件&#xff0c;然后通过v-if指令控制显隐&#xff0c;进而达到弹窗的效果。然而&#xff0c;这种方法却有一个严重的缺陷&#xff0…...

【c语言测试】

1. C语言中&#xff0c;逻辑“真”等价于&#xff08; &#xff09; 题目分析&#xff1a; “逻辑真”在C语言中通常指的是非零数。 A. 大于零的数B. 大于零的整数C. 非零的数 (正确答案)D. 非零的整数 正确答案&#xff1a;C 2. 若定义了数组 int a[3][4];&#xff0c;则对…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...