EasyExcel表头宽度根据数据内容自适应+自动换行

我的版本EasyExcel为3.x,如果使用2.x可能有些字段不一样

表头宽度根据数据内容自适应

配置类

import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
import org.apache.poi.ss.usermodel.Cell;
import org.springframework.util.CollectionUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 表头宽度根据数据内容自适应*/
public class CustomWidthStyleStrategy extends AbstractColumnWidthStyleStrategy {private Map<Integer, Map<Integer, Integer>> CACHE = new HashMap<>();/*** 设置列宽** @param writeSheetHolder* @param cellDataList* @param cell* @param head* @param relativeRowIndex* @param isHead*/@Overrideprotected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList);if (needSetWidth) {Map<Integer, Integer> maxColumnWidthMap = CACHE.get(writeSheetHolder.getSheetNo());if (maxColumnWidthMap == null) {maxColumnWidthMap = new HashMap<>();CACHE.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap);}Integer columnWidth = this.dataLength(cellDataList, cell, isHead)/2;if (columnWidth >= 0) {if (columnWidth > 255) {columnWidth = 255;}Integer maxColumnWidth = maxColumnWidthMap.get(cell.getColumnIndex());if (maxColumnWidth == null || columnWidth > maxColumnWidth) {maxColumnWidthMap.put(cell.getColumnIndex(), columnWidth);writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 256);}}}}/*** 数据长度** @param cellDataList* @param cell* @param isHead* @return*/private Integer dataLength(List<WriteCellData<?>> cellDataList, Cell cell, Boolean isHead) {//头直接返回原始长度if (isHead) {return cell.getStringCellValue().getBytes().length;} else {//不是头的话  看是什么类型  用数字加就可以了WriteCellData cellData = cellDataList.get(0);CellDataTypeEnum type = cellData.getType();if (type == null) {return -1;} else {switch (type) {case STRING:return cellData.getStringValue().getBytes().length + 1;case BOOLEAN:return cellData.getBooleanValue().toString().getBytes().length;case NUMBER:return cellData.getNumberValue().toString().getBytes().length * 2;default:return -1;}}}}
}

使用EasyExcel写入到excel里面

        EasyExcel.write(byteArrayOutputStream, DatasetRefreshHistoryVo.class).sheet("模板").registerWriteHandler(new CustomWidthStyleStrategy()).doWrite(list);

自动换行

配置

    /*** 单元格样式策略*/public static HorizontalCellStyleStrategy getHorizontalCellStyleStrategy() {// 内容的策略WriteCellStyle contentWriteCellStyle = new WriteCellStyle();// 设置边框contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);contentWriteCellStyle.setBorderRight(BorderStyle.THIN);contentWriteCellStyle.setBorderTop(BorderStyle.NONE);// 配置字体WriteFont contentWriteFont = new WriteFont();// 字体
//        contentWriteFont.setFontName("宋体");// 字体大小
//        contentWriteFont.setFontHeightInPoints(fontHeightInPoints);// 设置加粗contentWriteFont.setBold(false);contentWriteCellStyle.setWriteFont(contentWriteFont);// 【水平居中需要使用以下两行】// 设置文字左右居中contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// 设置文字上下居中contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 设置 自动换行contentWriteCellStyle.setWrapped(true);contentWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);contentWriteCellStyle.setFillForegroundColor(IndexedColors.PINK.getIndex());// 样式策略return new HorizontalCellStyleStrategy(null, contentWriteCellStyle);}

使用EasyExcel写入到excel里面
可以同时使用两个registerWriteHandler

        EasyExcel.write(byteArrayOutputStream, DatasetRefreshHistoryVo.class).sheet("模板").registerWriteHandler(this.getHorizontalCellStyleStrategy()).registerWriteHandler(new CustomWidthStyleStrategy()).doWrite(list);

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

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

相关文章

Linux 驱动开发基础知识——编写LED驱动程序(三)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

springboot(ssmit职业生涯规划系统 职业规划学习系统Java系统

springboot(ssmit职业生涯规划系统 职业规划学习系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;springboot&#xff08;可改ssm&#xff09; vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7…

边裁边招,2024大厂往哪“卷”?

裁员只是大厂踌躇、转型的缩影&#xff0c;无论是林平还是背后的公司、行业&#xff0c;都亟需给未来一个确定的答案。 从2021年冬天开始&#xff0c;大厂裁员的消息有如“击鼓传花”般&#xff0c;不断冲击着圈内外网友们的神经&#xff0c;那可能是“裁员”这个话题自互联网…

css中>>>、/deep/、::v-deep的作用和区别,element-ui自定义样式

文章目录 一、前言1.1、/deep/1.2、::v-deep1.3、>>> 二、区别三、总结四、最后 一、前言 1.1、/deep/ 在style经常用scoped属性实现组件的私有化时&#xff0c;要改变element-ui某个深层元素&#xff08;例如.el-input__inner&#xff09;或其他深层样式时&#xf…

JOSEF约瑟 大容量中间继电器 RXMH2 RK223 067 DC220V 带底座

系列型号 RXMH2 RK 223 067大容量中间继电器&#xff1b; RXMH2 RK 223 068大容量中间继电器&#xff1b; RXMH2 RK 223 069大容量中间继电器&#xff1b; RXMH2 RK 223 070大容量中间继电器&#xff1b; 一、用途 RXMH2系列大容量中间继电器用于工业自动化控制及电力系统二次…

app重新签名之后,teamID会改变吗?

哈喽大家好&#xff0c;我是咕噜美乐蒂&#xff0c;很高兴又见面啦&#xff01; 在iOS和macOS开发中&#xff0c;我们经常需要对应用进行重新签名&#xff0c;以便在发布或测试时更改应用的证书或代理。在重新签名应用程序时&#xff0c;可能会出现teamID变化的情况。本文将探…

冷知识:COS上传文件时可以同步获取文件信息

背景介绍 本文将介绍如何在上传文件到 COS 时同步获取文件信息&#xff0c;如图片的宽高、格式等。 目前&#xff0c;可以通过 COS 上传接口&#xff0c;如 PUT Object、CompleteMultipartUploads 等将文件存储至 COS 存储桶中&#xff0c;我们针对以下三种场景提供上传时同步…

Windows主机Navicat远程连接到Ubuntu18.04虚拟机MySQL

1. 在虚拟机上安装MySQL sudo apt-get install mysql-server sudo apt-get install libmysqlclient-dev 2. 检查安装 sudo netstat -tap | grep mysql 3. 查看默认密码 sudo cat /etc/mysql/debian.cnf 4. 用查看到的密码登录MySQL server&#xff0c;修改root用户的密码 …

javaWebssh宠物基地管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh宠物基地管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7.…

PostgreSQL插件说明

PostgreSQL插件是一种扩展PostgreSQL功能的程序。社区版插件管理需要超级用户权限&#xff0c;而华为公有云PostgreSQL提供了一种简单易用的插件管理方案&#xff0c;可以在数据库中创建、更新和删除插件&#xff0c;无需超级用户权限。它不仅可以增加特定的数据类型、函数、操…

JS进阶-内置构造函数(二)

小提示&#xff1a;这些内置函数在开发使用的频率非常的频繁&#xff0c;建议认真看一下&#xff0c;并背一下 目录 知识回顾&#xff1a; • Object 三个常用静态方法&#xff08;静态方法就是只有构造函数Object可以调用的&#xff09; Object.keys Object.values Obj…

brpc负载均衡load balance和服务发现name servicing

1.SharedLoadBalancer&#xff08;load_balancer.h&#xff09;&#xff1a;包含LoadBalancer指针_lb&#xff0c;AddServersInBatch 2.LoadBalancerWithNaming&#xff1a;继承SharedLoadBalancer和NamingServiceWatcher 2.1Init函数&#xff1a;SharedLoadBalancer::Init&a…

梯度的计算

文章目录 import torch as tc# 以函数f(x) x^2 为例子&#xff0c;求梯度 x1 tc.tensor(1,dtypetc.float64,requires_gradTrue) g1 tc.autograd.grad(x1**2,x1)[0] print(f"The grad of x**2 at {x1} is {g1}")(x1 ** 2).backward() print(f"The grad of x*…

四、MySQL之增删改

一、插入数据 1.1、VALUES的方式添加 使用这种语法一次只能向表中插入一条数据。 1.1.1、为表的所有字段按默认顺序插入数据 INSERT INTO 表名 VALUES (value1,value2,....);// 值列表中需要为表的每一个字段指定值&#xff0c;并且值的顺序必须和数据表中字段定义时的顺序相…

浅谈WPF之UI布局

一个成功的软件&#xff0c;离不开人性化的UI设计&#xff0c;如何抓住用户第一视觉&#xff0c;让用户产生依赖感&#xff0c;合适优雅的布局必不可少。本文以一些简单的小例子&#xff0c;简述WPF中布局 面板 控件的使用&#xff0c;仅供学习分享使用&#xff0c;如有不足之处…

AWS 云监控工具

Amazon Web Services&#xff08;AWS&#xff09;是 Amazon 提供的云计算平台&#xff0c;为企业提供技术服务&#xff0c;包括计算能力、存储和数据库。借助 AWS&#xff0c;企业无需购买、拥有或维护物理数据中心和服务器&#xff0c;而 AWS 的即用即付方法使企业能够避免与 …

vcruntime140.dll找不到的多种解决方法分享,修复vcruntime140.dll文件

当操作电脑软件的过程中弹出一个错误提示“vcruntime140.dll已加载,但找不到入口点”&#xff0c;这通常意味着程序所依赖的vcruntime140.dll文件可能已经丢失、遭到破坏&#xff0c;或者该文件的路径及位置在软件开发时未被正确配置。此外&#xff0c;这种情况还有可能是因为电…

Windows11 Copilot助手开启教程(免费GPT-4)

Windows11上开启Copilot助手教程踩坑指南 Copilot介绍Copilot开启步骤1、更新系统2、更改语言和区域3、下载 ViVeTool 工具4、开启Copilot 使用 Copilot介绍 Windows Copilot 是 Windows 11 中的一个新功能&#xff0c;它可以让你与一个智能助理进行对话&#xff0c;获取信息&…

应用协议漏洞

应用协议漏洞 一、rsync rsync是Linux下一款数据备份工具&#xff0c;支持通过rsync协议、ssh协议进行远程文件传输。其中rsync协议默认监听873端口 1.未授权访问 打开靶场 判断漏洞是否存在 rsync rsync://目标ip:端口读取文件 rsync rsync://47.99.49.128:873/src/tmp/下…

2024年的Rust与Go,你看明白了吗?

Rust和Go哪个更好&#xff1f;你应该为下一个项目选择哪种语言&#xff0c;为什么&#xff1f;两者在性能、简单性、安全性、功能特性、规模化(scale)和并发性等方面如何比较&#xff1f;它们有什么共同点&#xff0c;又有什么根本区别&#xff1f;让我们通过Rust和Go的友好且公…