easyexcel 模板填充Excel数据,实现自定义换行及动态调整行高,并保持列表格式一致

pom依赖:

<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.5</version>
</dependency><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version>
</dependency>

替换核心代码:

public static InputStream onlineWriter(String fileType, InputStream inputStream, JSONObject model) throws Exception {ByteArrayOutputStream out = new ByteArrayOutputStream();try (ExcelWriter excelWriter = EasyExcel.write(out).withTemplate(inputStream).registerWriteHandler(new CustomCellWeightWeightConfig()).registerWriteHandler(new CustomMergeStrategy()).build()) {// 设置自动换行,前提内容中需要加「\n」才有效WriteCellStyle writeCellStyle = new WriteCellStyle();writeCellStyle.setWrapped(true);HorizontalCellStyleStrategy cellStyleStrategy = new HorizontalCellStyleStrategy(null, writeCellStyle);WriteSheet writeSheet = EasyExcel.writerSheet().registerWriteHandler(cellStyleStrategy).build();excelWriter.fill(model, writeSheet);FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();for (Map.Entry<String, Object> entry : model.entrySet()) {if (entry.getValue() instanceof ArrayList) {JSONArray jsonArray = JSON.parseArray(JSONObject.toJSONString(entry.getValue()));FillWrapper fillWrapper = new FillWrapper(entry.getKey(), jsonArray);excelWriter.fill(fillWrapper, fillConfig, writeSheet);}}excelWriter.finish();}return new ByteArrayInputStream(out.toByteArray());
}

自定义调整行高策略:

/*** 填充内容包含\n换行符,重新计算行高*/
public class CustomCellWeightWeightConfig extends AbstractColumnWidthStyleStrategy {private Map<Integer, Map<Integer, Integer>> CACHE = new HashMap<>();@Overrideprotected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {boolean needSetWidth = isHead || StringUtils.isNotEmpty(cellDataList);if (needSetWidth) {//包含\n的内容修改行高String cellValue = getCellValue(cell);boolean contains =  StringUtils.contains(cellValue, ExcelTemplateUtil.WRAPPED);if (contains) {int rows = cellValue.split(ExcelTemplateUtil.WRAPPED).length;float height = cell.getRow().getHeightInPoints();cell.getRow().setHeightInPoints(rows * height);}}}public static String getCellValue(Cell cell) {String cellValue;switch (cell.getCellType()) {case STRING:cellValue = cell.getStringCellValue();break;case BOOLEAN:cellValue = String.valueOf(cell.getBooleanCellValue());break;case NUMERIC:cellValue = String.valueOf(cell.getNumericCellValue());break;default:cellValue = "";break;}return cellValue;}}

自定义合并表格策略:


/*** 表格填充 每一列都赋值上一列的格式,确保列格式一致*/
public class CustomMergeStrategy extends AbstractMergeStrategy {@Overrideprotected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {if(relativeRowIndex==null ||relativeRowIndex==0){return;}int rowIndex = cell.getRowIndex();int colIndex = cell.getColumnIndex();sheet=cell.getSheet();Row preRow = sheet.getRow(rowIndex - 1);Cell preCell = preRow.getCell(colIndex);//获取上一行的该格List<CellRangeAddress> list = sheet.getMergedRegions();for (int i = 0; i < list.size(); i++) {CellRangeAddress cellRangeAddress = list.get(i);if (cellRangeAddress.containsRow(preCell.getRowIndex()) && cellRangeAddress.containsColumn(preCell.getColumnIndex())) {int lastColIndex = cellRangeAddress.getLastColumn();int firstColIndex = cellRangeAddress.getFirstColumn();if (lastColIndex > firstColIndex) {int lastRowIndex = cellRangeAddress.getLastRow();CellRangeAddress cra = new CellRangeAddress(rowIndex, rowIndex, firstColIndex, lastColIndex);sheet.addMergedRegion(cra);//设置合并区域cra的边框RegionUtil.setBorderBottom(BorderStyle.THIN, cra, sheet);RegionUtil.setBorderLeft(BorderStyle.THIN, cra, sheet);RegionUtil.setBorderRight(BorderStyle.THIN, cra, sheet);RegionUtil.setBorderTop(BorderStyle.THIN, cra, sheet);return;}}}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/37951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构-线性表的应用

目录 前言一、有序表的合并1.1 顺序表实现1.2 单链表实现 二、稀疏多项式的相加和相乘2.1 稀疏多项式的相加2.2 稀疏多项式的相乘 总结 前言 本篇文章介绍线性表的应用&#xff0c;分别使用顺序表和单链表实现有序表的合并&#xff0c;最后介绍如何使用单链表实现两个稀疏多项…

基于springboot+vue+uniapp的超市售货管理平台

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

考研生活day2--王道课后习题2.3.1、2.3.2、2.3.3

2.3.1 题目描述&#xff1a; 这题和曾经做过的LeetCode203.移除元素一模一样&#xff0c;所以我们就使用LeetCode进行书写&#xff0c;题目链接203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 解题思路 大家的第一反应肯定是根据书上所学的书写方法一样书写&…

【PB案例学习笔记】-26制作一个带浮动图标的工具栏

写在前面 这是PB案例学习笔记系列文章的第26篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

爬虫cookie是什么意思

“爬虫 cookie”指的是网络爬虫在访问网站时所使用的cookie&#xff0c;网络爬虫是一种自动化程序&#xff0c;用于在互联网上收集信息并进行索引&#xff0c;这些信息可以用于搜索引擎、数据分析或其他目的。 本教程操作系统&#xff1a;Windows10系统、Dell G3电脑。 “爬虫…

51-1 内网信息收集 - 内网资源探测

导语 在内网渗透过程中,通常需要利用各种技术来探测内网资源,为后续的横向渗透做准备。发现内网存活的主机及其详细信息可以帮助确定攻击方向和潜在的漏洞。 一、基于 ICMP 发现存活主机 ICMP(Internet Control Message Protocol,因特网控制消息协议)是 TCP/IP 协议簇的…

一段式、二段式和三段式状态机的特点及适用情况:

在FPGA设计中,状态机的选择主要取决于具体应用场景和设计需求。 一段式状态机: 优点: 结构简单,易于理解和实现占用资源少时序逻辑简单,延迟小 缺点: 组合逻辑复杂度高可能存在毛刺问题不易于大规模状态机的设计 适用场景: 简单的控制逻辑状态数量较少的场合对时序要求较…

React+TS前台项目实战(二十二)-- 全局常用导出组件Export封装

文章目录 前言Export组件1. 功能分析2. 代码详细注释3. 使用方式4. 效果展示 总结 前言 今天我们来封装一个带导出图标的导出组件。 Export组件 1. 功能分析 通过传入链接地址&#xff0c;规定要跳转的导出页面&#xff0c;或是直接通过链接导出数据 2. 代码详细注释 // /c…

虚拟环境管理

虚拟环境 在使用 Python 时我们一般使用“pip install 第三方包名”来安装第三方包&#xff0c;但是由于pip的特性&#xff0c;系统只能安装每个包的一个版本。而在实际开发中&#xff0c;可能同时开发多个项目&#xff0c;如&#xff1a;上图有三个项目&#xff1b;每个项目需…

django学习入门系列之第三点《BootSrap初了解》

文章目录 初识BootStrap往期回顾 初识BootStrap BootSrap是什么&#xff1f; 是别人帮我们已写好的CSS样式&#xff0c;我们如果想要使用这个BootSrap&#xff1a; 下载BootStrap使用 在页面上引入BootStrap编写HTML时&#xff0c;按照BootStrap的规定来编写 自定制 官网&…

【UE5.1】Chaos物理系统基础——02 场系统的应用

目录 步骤 一、运用临时场&#xff08;外部张力&#xff09;破裂几何体集 二、使用构造场固定几何体集 步骤 在上一篇中&#xff08;【UE5.1】Chaos物理系统基础——01 创建可被破坏的物体&#xff09;我们已经创建了可被破碎的几何体集&#xff0c;在最后我们防止几何体集…

微信小程序简历Demo

微信小程序简历Demo 使用介绍最后获取源码 bilibili视频介绍 使用介绍 使用微信小程序实现的一个简历实现Demo 拖动马里奥&#xff0c;到指定Name下方 向上顶就可以显示对应的简历样式 点击头像可拨打电话 点击信息处可显示当前位置 最后 这是一个简单并且有趣的微信小程…

Renesas MCU使用SCI_I2C驱动OLED

目录 概述 1 软硬件 1.1 软件版本信息 1.2 OLED屏幕 1.2.1 OLED简介 1.2.2 SSD1306介绍 1.2.3 0.9寸OLED模块介绍 2 FSP配置项目 2.1 配置项目参数 2.2 生成项目文件架构 3 代码实现 3.1 I2C的库函数 3.1.1 R_SCI_I2C_Open() 3.1.2 R_SCI_I2C_Read() 3.1.3 R_SCI_…

谷粒商城篇章10 -- P262-P291/P295-P310 -- 订单服务(支付)【分布式高级篇七】

目录 1 页面环境搭建 1.1 静态资源上传到nginx 1.2 SwitchHosts增加配置 1.3 网关配置 1.4 订单模块基础配置 1.4.1 引入 thymeleaf 依赖 1.4.2 application.yml配置 1.4.3 bootstrap.properties配置 1.4.4 开启nacos注册发现和远程调用 1.5 修改各个页面的静态资源路…

windows电脑开发ios的p12证书申请流程

很多同学在做ios打包的时候&#xff0c;发现ios打包需要一个p12格式的证书和一个证书profile文件&#xff0c;那么ios开发就一定需要使用mac电脑来申请ios证书吗&#xff1f;其实申请ios证书并不一定需要mac电脑&#xff0c;因为证书是一个通用的技术&#xff0c;使用普通的ssl…

Perl 语言开发(二):变量与数据类型

目录 1. 变量的基本概念 1.1 标量变量 1.2 数组变量 1.3 哈希变量 2. 数据类型详解 2.1 标量数据类型 2.1.1 数字 2.1.2 字符串 2.2 数组数据类型 2.2.1 数组操作 2.3 哈希数据类型 2.3.1 哈希操作 3. 变量的作用域与生存期 3.1 全局变量 3.2 局部变量 3.3 词法…

JavaScript将参数传递给事件处理程序

本篇文件我们将实现导航栏中&#xff0c;选中时候&#xff0c;会将您选中的进行高亮显示&#xff1b; ● 首先我们来获取我们想要的HTML元素 const nav document.querySelector(.nav);● 接着我们来写选中的高亮显示 nav.addEventListener(mouseover, function (e) { //鼠…

主干网络篇 | YOLOv5/v7 更换主干网络之 ShuffleNetv2 | 高效CNN架构设计的实用指南

主干网络篇 | YOLOv5/v7 更换主干网络之 ShuffleNetv2 | 高效CNN架构设计的实用指南 1. 简介 近年来&#xff0c;深度卷积神经网络&#xff08;CNN&#xff09;在图像识别、目标检测等领域取得了巨大进展。然而&#xff0c;随着模型复杂度的不断提升&#xff0c;模型训练和部…

申请一张含100个域名的证书-免费SSL证书

挑战一下&#xff0c;申请一张包含100个域名的证书 首先&#xff0c;我们访问来此加密网站&#xff0c;进入登录页面&#xff0c;输入我的账号密码。 登录后&#xff0c;咱们就可以开始申请证书&#xff0c;首先说一下&#xff0c;咱账号是SVIP哦&#xff0c;只有SVIP才可以申…

记一次EasyExcel的错误使用导致的频繁FullGC

记一次EasyExcel的错误使用导致的频繁FullGC 一、背景描述二、场景复现三、原因分析四、解决方案五、思考复盘 一、背景描述 繁忙的校招结束了&#xff0c;美好的大学四年也结束了&#xff0c;作者也有10个月没有更新了。拿到心仪的offer之后也开始了苦B的打工生活。 最近接到…