当前位置: 首页 > 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;则对…...

一种将树莓派打造为游戏机的方法——Lakka

什么是Lakka&#xff1f; Lakka是一款Linux发行版&#xff0c;轻量级的&#xff0c;可将小型计算机转变为一台复古游戏机。 图1-Lakka官网&#xff0c;见参考链接[1] Lakka是RetroArch和libretro生态系统下的官方操作系统&#xff0c;前者RetroArch是模拟器、游戏引擎和媒体播…...

如何在 MySQL 中创建一个完整的数据库备份?

在MySQL数据库中创建一个完整的数据库备份通常不是通过编程语言直接实现的&#xff0c;而是借助MySQL提供的命令行工具mysqldump来完成。 作为Java开发者&#xff0c;我们可以编写脚本来调用这些工具&#xff0c;从而实现自动化备份。 下面我们将详细介绍如何使用Java来调度m…...

京准电钟HR-901GB双GPS北斗卫星时钟服务器

京准电钟HR-901GB双GPS北斗卫星时钟服务器 京准电钟HR-901GB双GPS北斗卫星时钟服务器 作为国家电力系统最重要的设备之一,卫星时间同步装置随着电力行业的发展不断有了新的要求,从单纯的具备时间数据输出能力,发展到装置状态信息上送、对用时设备的对时质量进行监测,确保站点内…...

uniapp使用websocket

后端java websoket中的 onOpen 中。依赖注入为null 引用&#xff1a;https://blog.csdn.net/qq_63431773/article/details/132389555 https://blog.csdn.net/weixin_43961117/article/details/123989515 https://cloud.tencent.com/developer/article/2107954 https://blog.c…...

基于Pycharm和Django模型技术的数据迁移

1.配置数据库 在trip_server/settings.py中修改配置&#xff1a; 其格式可访问官网&#xff1a;Settings | Django documentation | Django 1.1 配置数据库 文件地址&#xff1a;trip_server/settings.py 配置前需要创建&#xff08;NaviCat&#xff09;个人数据库 "…...

乐尚代驾-----Day10(订单三)

hi UU 们&#xff01;&#xff01;&#xff01;我又来跟辛辣&#xff01;感谢你们的观看&#xff0c;话不多说&#xff01;~ 司机到达代驾终点&#xff0c;代驾结束了。结束代驾之后&#xff0c; – 获取额外费用&#xff08;高速费、停车费等&#xff09; – 计算订单实际里程…...

105. 聚光源SpotLight

入门部分给大家介绍过平行光DirectionalLight、点光源PointLight、环境光AmbientLight,下面给大家介绍一个新的光源对象&#xff0c;也就是聚光源SpotLight。 创建聚光源SpotLight 聚光源可以认为是一个沿着特定方会逐渐发散的光源&#xff0c;照射范围在三维空间中构成一个圆…...

系统接口权限拦截器,获取用户信息存储

UserInfo 类 这是一个表示用户信息的 Java 类&#xff0c;使用了 Lombok 注解来简化代码编写。 import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString;import java.io.Serializable; import java.util.List;Data ToString EqualsAndHashCode public…...

Chromium HTML5 新的 Input 类型color 对应c++

一、Input 类型: color color 类型用在input字段主要用于选取颜色&#xff0c;如下所示&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body&…...

问:SQL中的通用函数及用法?

SQL函数是在SQL语句中使用的预定义的计算工具&#xff0c;可以对一列数据进行操作并返回一个单一的结果。这些函数大致可以分为两类&#xff1a;Aggregate函数和Scalar函数。Aggregate函数对一组值执行计算&#xff0c;并返回单个值&#xff0c;如求和、平均值、最大值和最小值…...

劳务合同免费模板下载/广州seo运营

四周静悄悄的&#xff0c;只有墙上的钟表在喳喳喳地响个不停&#xff0c;似乎只有它没有疲倦的感觉。手头的山东一级OFFICE开发模块估计做了一半多了&#xff0c;今晚终于又克服了一个难题。终于可以停下来休息了。四周静悄悄的&#xff0c;我的心却显得尤为激动......记得一个…...

社交网站开发公司/如何利用网络进行推广和宣传

lxml是Python中与XML及HTML相关功能中最丰富和最容易使用的库。lxml并不是Python自带的包&#xff0c;而是为libxml2和libxslt库的一个Python化的绑定。它与众不同的地方是它兼顾了这些库的速度和功能完整性&#xff0c;以及纯Python API的简洁性&#xff0c;与大家熟知的Eleme…...

大型大型网站建设/爱站小工具圣经

{"folders":[{//你项目的相对路径"path": "."}],"settings":{//这里是项目的设置&#xff0c;sublime会自动载入这里的设置&#xff08;你也可以在这里填写其他插件的配置&#xff09;"xdebug": {"path_mapping":…...

html企业网站怎么做/百度网盟推广官方网站

原文地址&#xff1a;LeetCode--633 平方数之和 题目描述&#xff1a; 给定一个非负整数 c &#xff0c;你要判断是否存在两个整数 a 和 b&#xff0c;使得 示例1: 输入: 5 输出: True 解释: 1 * 1 2 * 2 5示例2: 输入: 3 输出: False 解题方法一&#xff1a;利用双向…...

网站前端设计软件/家庭优化大师下载

前台线程&#xff1a;需要等待所有前台子线程执行完&#xff0c;主线程才能继续往下走。除非强行关掉主线程&#xff0c;所有前台子线程才会强行结束。 后台线程&#xff1a;不需要等待后台线程执行完&#xff0c;主线程会继续往下走。当主线程正常结束或非正常结束&#xff0…...

专业做网站公司哪家好/怎么注册一个自己的网址

系统管理与维护任务书2011-2012学年第一学期电信学院计算机系课程设计总结课设名称 系统管理与维护 课设日期 17-18周 指导老师 班 级 学 号 姓 名 课程设计任务书指导教师姓名所在系计算机系课程名称系统管理与维护学时2周设计目的、任务和要求设计目的通过本次教学实践活动&a…...