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

EasyExcel 自定义头信息导出

需求:需要在导出 excel时,合并单元格自定义头信息(动态生成),然后才是字段列表头即导出数据。

EasyExcel - 使用table去写入:https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write#%E4%BD%BF%E7%94%A8table%E5%8E%BB%E5%86%99%E5%85%A5

一、代码实现

1、查询导出数据

1.1 导出实体类

import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.converters.localdatetime.LocalDateTimeStringConverter;
import lombok.Data;import java.io.Serializable;
import java.time.LocalDateTime;/*** 用户信息 导出DTO*/
@Data
@ExcelIgnoreUnannotated
public class UserExportExcelDTO implements Serializable {private static final long serialVersionUID = -5255117385546252447L;/*** 用户ID*/@ExcelIgnoreprivate Long userId;/*** 用户名*/@ExcelProperty(value = "用户名")private String username;/*** 年龄*/@ExcelProperty(value = "年龄")private Integer age;/*** 电话号码*/@ExcelProperty(value = "电话号码")private String phone;/*** 昵称*/@ExcelProperty(value = "昵称")private String nickname;/*** 姓名*/@ExcelProperty(value = "姓名")private String name;/*** 创建时间* 使用 converter或者 @DateTimeFormat格式化时间,如果两者同时使用,@DateTimeFormat优先级高*/@ExcelProperty(value = "创建时间", converter = LocalDateTimeStringConverter.class) // yyyy-MM-dd HH:mm:ss@DateTimeFormat("yyyy年MM月dd日")private LocalDateTime createTime;}

1.2 查询导出数据方法

    @Overridepublic List<UserExportExcelDTO> listExportExcelData(UserPageQueryRequest pageRequest) {pageRequest.setCurrentPage(1L);pageRequest.setPageSize((long) Integer.MAX_VALUE);BasePageResult<UserPageDTO> basePageResult = pageQuery(pageRequest);if(!basePageResult.isSuccess()){return Collections.EMPTY_LIST;}return basePageResult.getPageList().stream().map(userPageDTO -> {UserExportExcelDTO exportExcelDTO = new UserExportExcelDTO();BeanUtils.copyProperties(userPageDTO, exportExcelDTO);return exportExcelDTO;}).collect(Collectors.toList());}

2、EasyExcel使用 table写入

    /*** 用户导出接口** @param pageRequest 分页查询请求体*/@SneakyThrows@ApiOperation(value = "用户导出接口")@GetMapping("/exportExcel")public void exportExcel(HttpServletResponse response, @RequestBody UserPageQueryRequest pageRequest) {response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");String fileName = URLEncoder.encode("用户信息", StandardCharsets.UTF_8.name()).replaceAll("\\+", "%20");response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");// 查询导出数据List<UserExportExcelDTO> exportExcelDataList = userService.listExportExcelData(pageRequest);// 自定义头信息StringBuilder headName = new StringBuilder();LocalDateTime startTime = pageRequest.getCreateTimeStart();LocalDateTime endTime = pageRequest.getCreateTimeEnd();if (startTime != null && endTime != null) {String startTimeStr = LocalDateTimeUtil.format(startTime, DatePattern.CHINESE_DATE_PATTERN);String endTimeStr = LocalDateTimeUtil.format(endTime, DatePattern.CHINESE_DATE_PATTERN);headName.append(startTimeStr).append("至").append(endTimeStr);}headName.append("时间段的用户信息");List<List<String>> headList = new ArrayList<>();List<String> head = new ArrayList<>();head.add(headName.toString());headList.add(head);/*** 创建 ExcelWriter* 1.创建写入的工作表,不需要表头。命名为"sheet1"。*/ExcelWriter excelWriter = null;try {excelWriter = EasyExcelFactory.write(response.getOutputStream()).build();} catch (IOException e) {log.error("导出车辆在线率统计异常:e=", e);}WriteSheet writeSheet = EasyExcel.writerSheet("sheet1").needHead(Boolean.FALSE).build();/*** 2.创建并写入表格数据,设置表头为 headList,需要表头。* tableNo:表格序号,从0开始。* OnceAbsoluteMergeStrategy:创建一个合并单元格策略。*/WriteTable writeTable1 = EasyExcel.writerTable(0).head(headList).registerWriteHandler(new OnceAbsoluteMergeStrategy(0, 2, 0, 5)).needHead(Boolean.TRUE).build();// 写入空数据到 writeSheetexcelWriter.write(new ArrayList<>(), writeSheet, writeTable1);/*** 3.创建写入表格,基于AnysCarOfflineStatisticsVo类定义表头,需要表头。* writerTable(3):因为 writeTable1从0开始,并合并了 3行,所以 writeTable2是从第4个行(tableNo = 3)开始写入。* SimpleColumnWidthStyleStrategy:设置列宽策略*/WriteTable writeTable2 = EasyExcel.writerTable(3).head(UserExportExcelDTO.class).registerWriteHandler(new SimpleColumnWidthStyleStrategy(25)).relativeHeadRowIndex(2).needHead(Boolean.TRUE).build();// 写入导出数据到 writeSheetexcelWriter.write(exportExcelDataList, writeSheet, writeTable2);excelWriter.finish();}

3、导出结果

在这里插入图片描述

– 求知若饥,虚心若愚。

相关文章:

EasyExcel 自定义头信息导出

需求&#xff1a;需要在导出 excel时&#xff0c;合并单元格自定义头信息(动态生成)&#xff0c;然后才是字段列表头即导出数据。 EasyExcel - 使用table去写入&#xff1a;https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write#%E4%BD%BF%E7%94%A8table%E…...

网络运维学习笔记 012网工初级(HCIA-Datacom与CCNA-EI)某机构新增:GRE隧道与EBGP实施

文章目录 GRE隧道&#xff08;通用路由封装&#xff0c;Generic Routing Encapsulation&#xff09;协议号47实验&#xff1a;思科&#xff1a;开始实施&#xff1a; 华为&#xff1a;开始实施&#xff1a; eBGP实施思科&#xff1a;华为&#xff1a; GRE隧道&#xff08;通用路…...

【系列专栏】银行IT的云原生架构-存储架构-数据库部署 10

银行 IT 的云原生架构&#xff1a;存储架构&#xff08;数据库部署&#xff09; 一、引言 在银行 IT 云原生架构的构建中&#xff0c;存储架构作为关键支撑&#xff0c;其性能、可靠性和扩展性直接影响着银行各类业务系统的运行效率与数据安全。而数据库作为数据存储与管理的…...

Python 爬虫selenium

1.selenium自动化 selenium可以操作浏览器&#xff0c;在浏览器页面上实现&#xff1a;点击、输入、滑动 等操作。 不同于selenium自动化&#xff0c;逆向本质是&#xff1a; 分析请求&#xff0c;例如&#xff1a;请求方法、请求参数、加密方式等。用代码模拟请求去实现同等…...

为啥vue3设计不直接用toRefs,而是reactive+toRefs

Vue 3 设计中将 reactive 和 toRefs 结合使用而非直接使用 toRefs&#xff0c;主要基于以下设计考量&#xff1a; 1. 响应式粒度的不同需求 reactive 适用于对象整体响应式 reactive 会为整个对象创建响应式代理&#xff0c;自动追踪对象内部所有属性的变化。这种设计适用于需要…...

深入解析 vLLM:高性能 LLM 服务框架的架构之美(二)调度管理

深入解析 vLLM&#xff1a;高性能 LLM 服务框架的架构之美&#xff08;一&#xff09;原理与解析 深入解析 vLLM&#xff1a;高性能 LLM 服务框架的架构之美&#xff08;二&#xff09;调度管理 1. vLLM 调度器结构与主要组件 在 vLLM 中&#xff0c;调度器的结构设计围绕任务…...

VMware安装教程

一、安装VMware软件 1. 安装前准备 系统要求&#xff1a; 操作系统&#xff1a;Windows 10/11 或 Linux&#xff08;如Ubuntu、CentOS&#xff09;。硬件要求&#xff1a; CPU&#xff1a;支持虚拟化技术&#xff08;Intel VT-x 或 AMD-V&#xff09;&#xff0c;需在BIOS中启…...

iOS事件传递和响应

背景 对于身处中小公司且业务不怎么复杂的程序员来说&#xff0c;很多技术不常用&#xff0c;你可能看过很多遍也都大致了解&#xff0c;但是实际让你讲&#xff0c;不一定讲的清楚。你可能说&#xff0c;我以独当一面&#xff0c;应对自如了&#xff0c;但是技术的知识甚多&a…...

TensorFlow 实现任意风格的快速风格转换

一、什么是风格迁移&#xff1f; 风格迁移&#xff08;Style Transfer&#xff09;是一种利用深度学习技术&#xff0c;将一幅图像的内容与另一幅图像的艺术风格相结合&#xff0c;生成新图像的技术。其核心思想是将图像的“内容”和“风格”分离&#xff0c;再重新组合&#…...

火绒终端安全管理系统V2.0【系统防御功能】

火绒企业版V2.0系统防御功能包含系统加固、应用加固、软件安装拦截、摄像头保护和浏览器保护。火绒终端安全管理软件V2.0守护企业用户终端安全。 系统防御 1. 系统加固 系统加固功能根据火绒提供的安全加固策略&#xff0c;当程序对特定系统资源操作时提醒用户可能存在的安…...

全志A133 android10 适配SLM770A 4G模块

一&#xff0c;模块基本信息 1.官方介绍 SLM770A是美格智能最新推出的一款LTE Cat.4无线通讯模组&#xff0c;最大支持下行速率150Mbps及上行速率50Mbps。同时向下兼容现有的3G和2G网络&#xff0c;以确保即使在偏远地区也可以进行网络通信。 SLM770A模组支持分集接收和MIMO技…...

第3章 3.2 配置系统 .NET Core配置系统

3.2.1 配置系统的基本使用 .NET Core中的配置系统支持非常丰富的配置源&#xff0c;包括文件&#xff08;JSON、XML、INI等&#xff09;、注册表、环境变量、命令行、Azure Key Vault等&#xff0c;配置系统还支持自定义配置源。 用配置系统开发包Microsoft.Extensions.Confi…...

装修流程图: 装修前准备 → 设计阶段 → 施工阶段 → 安装阶段 → 收尾阶段 → 入住

文章目录 引言I 毛坯房装修的全流程**1. 装修前准备****1.1 确定装修预算****1.2 选择装修方式****1.3 选择装修公司****1.4 办理装修手续****2. 设计阶段****2.1 量房****2.2 设计方案****2.3 确认方案****3. 施工阶段****3.1 主体拆改****3.2 水电改造****3.3 防水工程****3.…...

Python----数据结构(单链表:节点,是否为空,长度,遍历,添加,删除,查找)

一、链表 链表是一种线性数据结构&#xff0c;由一系列按特定顺序排列的节点组成&#xff0c;这些节点通过指针相互连接。每个节点包含两部分&#xff1a;元素和指向下一个节点的指针。其中&#xff0c;最简单的形式是单向链表&#xff0c;每个节点含有一个信息域和一个指针域&…...

NLP-RNN-LSTM浅析

双向 LSTM&#xff08;Bi - LSTM&#xff09; 结构原理&#xff1a;从图片中可以看到&#xff0c;双向 LSTM 由两个方向相反的 LSTM 组成&#xff0c;一个是正向 LSTM&#xff08;forward&#xff09;&#xff0c;一个是反向 LSTM&#xff08;backward&#xff09;。正向 LSTM …...

【Cadence射频仿真学习笔记】Pcell Designer设计电感学习笔记

Cadence的Pcell designer官方入门教程 一、下载Pcell Designer 首先&#xff0c;前往Cadence网站下载Pcell Designer软件 &#xff08;具体安装过程就不记录了&#xff0c;大家自己去看视频吧&#xff09; 二、创建新的P-cell 然后打开Virtuoso&#xff0c;点击Tools->…...

臻识相机,华夏相机,芊熠车牌识别相机加密解密

臻识&#xff0c;华夏&#xff0c;芊熠这三种车牌识别相机解密我都试过了&#xff0c;可以正常解密成功&#xff0c;其它品牌我暂时没有测试。超级简单&#xff0c;免费的&#xff0c;白嫖无敌&#xff01; 流程&#xff1a; ①&#xff1a;先导出配置文件&#xff0c;例如我以…...

一个前端,如何同时联调多个后端

文章目录 场景解决方案思路实现步骤创建项目目标前端配置安装cross-env配置vue.config.js配置package.json 测试 场景 一个前端&#xff0c;需要同时和N个后端联调 一个需求里有若干个模块&#xff0c;分别给不同的后端开发&#xff0c;前端需要和N个后端联调 本地开启一个端…...

向量的点乘的几何意义

源自AI 向量的点乘&#xff08;Dot Product&#xff09;在几何和图形学中有重要的意义。它不仅是数学运算&#xff0c;还可以用来描述向量之间的关系。以下是点乘的几何意义及其应用&#xff1a; 1. 点乘的定义 对于两个向量 a 和 b&#xff0c;它们的点乘定义为&#xff1a;…...

如何组织和管理JavaScript文件:最佳实践与策略

在现代Web开发中&#xff0c;JavaScript已经成为不可或缺的一部分。随着项目规模的扩大&#xff0c;JavaScript代码的复杂性也随之增加。如何有效地组织和管理这些文件&#xff0c;不仅影响开发效率&#xff0c;还直接关系到项目的可维护性和可扩展性。本文将深入探讨如何组织和…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...