EasyExcel导出替换列中的变量
基于easyexcel2.0版本
easyexcel官网:https://easyexcel.opensource.alibaba.com/docs/2.x/quickstart/write
测试代码地址:https://gitee.com/wangtianwen1996/cento-practice/blob/master/src/test/java/com/xiaobai/easyexcel/DynamicHeadTest.java
1. 需要自定义替换字符串变量的工具类
package com.xiaobai.java_core.string_practice;import com.sun.org.apache.xml.internal.utils.StringBufferPool;
import org.springframework.lang.Nullable;import java.util.Map;/*** @author wangtw* @ClassName StringUtil* @description: 字符串工具类* @date 2023/9/1006:59*/
public class StringUtil extends org.springframework.util.StringUtils{/*** 将字符串中特定模式的字符转换成map中对应的值* <p>* use: format("my name is ${name}, and i like ${like}!", {"name":"L.cm", "like": "Java"})** @param message 需要转换的字符串* @param params 转换所需的键值对集合* @return 转换后的字符串*/public static String format(@Nullable String message, @Nullable Map<String, ?> params) {// message 为 null 返回空字符串if (message == null) {return StringPool.EMPTY;}// 参数为 null 或者为空if (params == null || params.isEmpty()) {return message;}// 替换变量StringBuilder sb = new StringBuilder((int) (message.length() * 1.5));int cursor = 0;for (int start, end; (start = message.indexOf(StringPool.DOLLAR_LEFT_BRACE, cursor)) != -1 && (end = message.indexOf(StringPool.RIGHT_BRACE, start)) != -1; ) {sb.append(message, cursor, start);String key = message.substring(start + 2, end);Object value = params.get(StringUtil.trimWhitespace(key));sb.append(value == null ? StringPool.EMPTY : value);cursor = end + 1;}sb.append(message.substring(cursor));return sb.toString();}
}
2. 实体类
package com.xiaobai.easyexcel;import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import lombok.Data;import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;/*** 基础数据类***/
@Data
public class DynamicHeadData {@ExcelProperty("字符串标题")@ColumnWidth(20)private String string;@ExcelProperty("日期标题")@ColumnWidth(20)private Date date;@ExcelProperty("数字标题")@ColumnWidth(20)private Double doubleData;/*** 忽略这个字段*/@ExcelIgnoreprivate String ignore;@ExcelProperty({"子数据", "第一列${firstColumn}"})@ColumnWidth(30)private String childrenString;@ExcelProperty({"子数据", "第二列${secondColumn}"})@ColumnWidth(30)private Date childrenDate;@ExcelProperty({"子数据", "第三列${thirdColumn}"})@ColumnWidth(30)private File imageData;@ExcelProperty({"子数据", "第四列${fourthColumn}"})@ColumnWidth(30)private String stringData;
}
3. 数据准备
/*** 数据准备* @return*/private List<DynamicHeadData> data() {List<DynamicHeadData> list = new ArrayList<DynamicHeadData>();for (int i = 0; i < 4; i++) {DynamicHeadData data = new DynamicHeadData();data.setString("字符串" + i);data.setDate(new Date());data.setDoubleData(0.56);list.add(data);}return list;}
4. 自定义拦截器
package com.xiaobai.easyexcel;import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
import com.xiaobai.java_core.string_practice.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author wangtw* @ClassName CustomCellWriterHandle* @description: 自定义EasyExcel拦截器* @date 2023/11/1222:31*/
@Slf4j
public class CustomCellWriterHandle implements CellWriteHandler {private Map<String, String> dynamicMap = new HashMap<>();public CustomCellWriterHandle(Map<String, String> dynamicMap) {this.dynamicMap = dynamicMap;}@Overridepublic void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) {}@Overridepublic void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer integer, Boolean aBoolean) {}@Overridepublic void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {}@Overridepublic void afterCellDispose(WriteSheetHolder writeSheetHolder,WriteTableHolder writeTableHolder,List<CellData> list, Cell cell,Head head, Integer integer,Boolean isHead) {if (isHead) {String headName = cell.getStringCellValue();log.info("headName: {}", headName);headName = StringUtil.format(headName, dynamicMap);cell.setCellValue(headName);}}
}
5. 表格生成
@Testpublic void tableWrite() {String fileName = this.getClass().getResource("/").getPath() + "tableWrite" + System.currentTimeMillis() + ".xlsx";List<DynamicHeadData> demoDataList = data();// 头的策略WriteCellStyle headWriteCellStyle = new WriteCellStyle();// 数据单元格策略WriteCellStyle contentWriteCellStyle = new WriteCellStyle();// 设置单元格边框contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);contentWriteCellStyle.setBorderRight(BorderStyle.THIN);contentWriteCellStyle.setBorderTop(BorderStyle.THIN);// 数据垂直居中contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现HorizontalCellStyleStrategy horizontalCellStyleStrategy =new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);Map<String, String> dynamicMap = new HashMap<>();dynamicMap.put("firstColumn", "aaaaaaaaa");dynamicMap.put("secondColumn", "bbbbbbbbbb");dynamicMap.put("thirdColumn", "cccccccccccc");dynamicMap.put("fourthColumn", "ddddddddddd");EasyExcel.write(fileName, DynamicHeadData.class).registerWriteHandler(new CustomCellWriterHandle(dynamicMap)).registerWriteHandler(horizontalCellStyleStrategy).sheet("模板").doWrite(demoDataList);}
相关文章:
EasyExcel导出替换列中的变量
基于easyexcel2.0版本 easyexcel官网:https://easyexcel.opensource.alibaba.com/docs/2.x/quickstart/write 测试代码地址:https://gitee.com/wangtianwen1996/cento-practice/blob/master/src/test/java/com/xiaobai/easyexcel/DynamicHeadTest.java …...
机器人规划算法——将多边形障碍物离散到地图像素点上?
问题一:如何判断一个点是否在多边形区域内? 方法1:向量叉乘判别法 设多边形的顶点依次为A1,A2…An,要判断的点为P,那么分别计算向量PA1叉乘向量PA2,向量PA2叉乘向量PA3,…ÿ…...
windows11使用docker部署安装minio
时间 2023-11-08 windows11使用docker部署安装minio 目录 1.docker 下载镜像2.docker安装镜像3.访问控制台4.安装问题解决5.使用教程 1.docker 下载镜像 调整镜像源到国内,否则会很慢 docker pull minio/minio2.docker安装镜像 设置用户名和密码时需要注意&…...
【JavaEESpring】Spring Web MVC⼊⻔
Spring Web MVC 1. 什么是 Spring Web MVC1.1 什么是 MVC ?1.2 是什么 Spring MVC? 2. 学习 Spring MVC2.1 建立连接2.2 请求2.3 响应 3. 相关代码链接 1. 什么是 Spring Web MVC 官⽅对于 Spring MVC 的描述是这样的: 1.1 什么是 MVC ? MVC 是 Model View C…...
flutter逆向 ACTF native app
前言 算了一下好长时间没打过CTF了,前两天看到ACTF逆向有道flutter逆向题就过来玩玩啦,花了一个下午做完了.说来也巧,我给DASCTF十月赛出的逆向题其中一道也是flutter,不过那题我难度降的相当之低啦,不知道有多少人做出来了呢~ 还原函数名 flutter逆向的一大难点就是不知道l…...
【Redis】set 集合
上一篇:list 列表 https://blog.csdn.net/m0_67930426/article/details/134364315?spm1001.2014.3001.5501 目录 Sadd Smembers Sismember Scard Srem 编辑Srandomember Spop Smove 集合类 Sdiff Sinter Sunion 官网 https://redis.io/commands/?…...
【算法与设计模式】
一、数据结构与算法 1、算法性能评估 时间复杂度、空间复杂度 2、数据结构 数组与列表 队列 堆栈 链表 二叉树 多叉树 递归算法 二、设计模式 1、单例 (1)GIL:线程互斥锁。保证同一时刻只有一个线程在进行。 (2)…...
Javaweb之javascript的小案例的详细解析
1.5.4 案例 1.5.4.1 需求说明 鲁迅说的好,光说不练假把式,光练不说傻把式。所以接下来我们需要通过案例来加强对于上述DOM知识的掌握。需求如下3个: 点亮灯泡 将所有的div标签的标签体内容后面加上:very good 使所有的复选框呈现被选中的…...
Vant 移动端UI 组件自动引入
Vue项目中安装Vant # Vue 3 项目,安装最新版 Vant npm i vant 组件按需引入配置 Vant按需引入- - -安装:unplugin-vue-components 插件 unplugin-vue-components 插件可以在Vue文件中自动引入组件(包括项目自身的组件和各种组件库中的组件&…...
敏捷开发是什么?敏捷开发流程是怎么样的?
1. 什么是敏捷开发? 敏捷开发是一种迭代、增量式的软件开发方法,旨在通过灵活、协作和快速响应变化的方式,提高开发团队的效率和产品的质量。相较于传统的瀑布式开发模型,敏捷开发更加注重用户需求的响应和团队协作࿰…...
【CASS精品教程】cass3d 11.0加载超大影像、三维模型、点云数据
CAD2016+CASS11.0(内置3d)下载与安装: 【CASS精品教程】CAD2016+CASS11.0安装教程(附CASS11.0安装包下载)https://geostorm.blog.csdn.net/article/details/132392530 一、cass11.0 3d支持的数据 cass11.0中的3d模块增加了多种数据的支持,主要有: 1. 三维模型 点击…...
Unity Input System最简单使用
开始学的是 Input Manager 比较好理解,Input System却不好理解,教程也找了很多,感觉都讲的不清楚,我这里做一个最简单的用 Input System 添加鼠标左键和右键的效果。 1. 安装 Input System 包 首先这个功能不是内置的࿰…...
3.前端调式(断点调式)
1. Elements 先来看这张图最上头的一行是一个功能菜单,每一个菜单都有它相应的功能和使用方法,依次从左往右来看 箭头按钮 用于在页面选择一个元素来审查和查看它的相关信息,当我们在Elements这个按钮页面下点击某个Dom元素时,箭…...
拓扑排序软件设计——ToplogicalSort_app(含有源码、需求分析、可行性分析、概要设计、用户使用手册)
拓扑排序软件设计 前言1. 需求分析2. 可行性分析2.1 简介2.2 技术可行性分析2.2.1 技术实现方案2.2.2 开发人员技能要求2.2.3 可行性 2.3 操作可行性分析2.4 结论 3. 项目报告3.1 修订历史记录3.2 软硬件环境3.3 需求分析3.4 详细设计3.4.1 类设计3.4.2 核心流程描述3.4.3 核心…...
ESP32网络开发实例-将数据保存到InfluxDB时序数据库
将数据保存到InfluxDB时序数据库 文章目录 将数据保存到InfluxDB时序数据库1、InfluxDB介绍与安装3、软件准备4、硬件准备5、代码实现6、InfluxDB数据可视化在本文中,将介绍 InfluxDB 以及如何将其与 ESP32 开发板一起使用。 我们将向展示如何创建数据库桶并将 ESP32 数据发送…...
NestJS——基于Node.js 服务器端应用程序的开发框架
文章目录 前言什么是 NestJS? 一、NestJS特性?二、使用步骤Typescript 知识后端开发基本知识新建项目目录结构 前言 Nestjs中文文档 什么是 NestJS? Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用…...
EXCEL中将UTC时间戳转为日期格式(精确到秒)
UTC时间戳的格式通常是一个整数,表示从1970年1月1日00:00:00 UTC到当前时间的总秒数。它可以以秒或毫秒为单位表示。例如,如果当前时间是2023年3月17日 12:34:56 UTC,则对应的UTC时间戳为1679839496(以秒为单位)或1679…...
2023年【起重机械指挥】考试试卷及起重机械指挥操作证考试
题库来源:安全生产模拟考试一点通公众号小程序 2023年起重机械指挥考试试卷为正在备考起重机械指挥操作证的学员准备的理论考试专题,每个月更新的起重机械指挥操作证考试祝您顺利通过起重机械指挥考试。 1、【多选题】《中华人民共和国特种设备安全法》…...
组件的设计原则
目录 插槽的基本概念 基础用法 具名插槽 使用场景 布局控制 嵌套组件 组件的灵活性 高级用法 作用域插槽 总结 前言 Vue 的 slot 是一项强大的特性,用于组件化开发中。它允许父组件向子组件传递内容,使得组件更加灵活和可复用。通过 slot&…...
安卓编译命令mm和mmm的区别(mm编译当前工作目录,mmm可编译指定目录)
文章目录 1. mm示例 2. mmm示例 注意 在Android操作系统的源代码编译过程中, mm和 mmm是两个用于构建部分代码的常用命令。它们都属于Android build system提供的命令集合,但用途略有不同: 1. mm mm(make module)命…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
