【EasyExcel】根据单元格内容自动调整列宽
1.自定义Excel列宽样式策略类
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.commons.collections.CollectionUtils;
import org.apache.poi.ss.usermodel.Cell;import java.util.HashMap;
import java.util.List;
import java.util.Map;
/*** 自定义Excel列宽样式策略类,用于根据单元格内容自动调整列宽。* 继承自 AbstractColumnWidthStyleStrategy 以提供列宽调整功能。*/
public class ExcelWidthStyleStrategy extends AbstractColumnWidthStyleStrategy {// 定义单元格最大列宽,避免列宽过大private static final int MAX_COLUMN_WIDTH = 30;// 缓存每个sheet中每列的最大列宽private final Map<Integer, Map<Integer, Integer>> columnWidthCache = new HashMap<>(8);/*** 设置列宽的方法,根据单元格内容的长度动态调整列宽。** @param writeSheetHolder 写入Sheet的持有者* @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) {// 获取当前sheet的列宽缓存Map<Integer, Integer> columnWidthMap =columnWidthCache.computeIfAbsent(writeSheetHolder.getSheetNo(), k -> new HashMap<>(16));// 计算当前单元格的数据长度Integer columnWidth = computeCellDataLength(cellDataList, cell, isHead);if (columnWidth >= 0) {// 确保列宽不会超过最大值columnWidth = Math.min(columnWidth, MAX_COLUMN_WIDTH);// 获取当前列的最大列宽Integer maxColumnWidth = columnWidthMap.get(cell.getColumnIndex());// 如果当前列宽大于缓存中的最大列宽,则更新缓存并设置列宽if (maxColumnWidth == null || columnWidth > maxColumnWidth) {columnWidthMap.put(cell.getColumnIndex(), columnWidth);// 设置列宽,乘以512是因为Excel中列宽单位与字符长度有关writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 512);}}}}/*** 计算单元格内容的字节长度** @param cellDataList 当前列的单元格数据列表* @param cell 当前单元格* @param isHead 是否为表头* @return 单元格内容的字节长度*/private Integer computeCellDataLength(List<WriteCellData<?>> cellDataList, Cell cell, Boolean isHead) {if (isHead) {// 表头直接计算字符串的字节长度return cell.getStringCellValue().getBytes().length;} else {if (cellDataList == null || cellDataList.isEmpty()) {return -1; // 如果数据列表为空,则返回-1}WriteCellData<?> cellData = cellDataList.get(0);CellDataTypeEnum type = cellData.getType();if (type == null) {return -1; // 如果类型未知,则返回-1} else {switch (type) {case STRING:return cellData.getStringValue().getBytes().length;case BOOLEAN:return cellData.getBooleanValue().toString().getBytes().length;case NUMBER:return cellData.getNumberValue().toString().getBytes().length;default:return -1; // 对于其他类型,返回-1}}}}
}
2.使用策略
excelWriter.write(ExcelData, EasyExcel.writerSheet(sheetName).head(Product.class).registerWriteHandler(new ExcelWidthStyleStrategy()).build());
相关文章:
【EasyExcel】根据单元格内容自动调整列宽
1.自定义Excel列宽样式策略类 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.e…...
半月内笔者暂不写时评文
今晨,笔者在刚恢复的《新浪微博》发布消息表态如下:“要开会了!今起,半月内笔者暂不写敏感时评文,不让自媒体网管感到压力,也是张驰有度、识时务者为俊杰之正常选择。野钓去也。” 截图:来源笔者…...
Python面试题:如何在 Python 中解析 XML 文件?
在 Python 中解析 XML 文件可以使用内置的 xml.etree.ElementTree 模块。以下是一个示例,展示了如何使用这个模块解析 XML 文件: 读取 XML 文件: import xml.etree.ElementTree as ET# 读取 XML 文件 tree ET.parse(example.xml) root tr…...
3033.修改矩阵
1.题目描述 给你一个下标从 0 开始、大小为 m x n 的整数矩阵 matrix ,新建一个下标从 0 开始、名为 answer 的矩阵。使 answer 与 matrix 相等,接着将其中每个值为 -1 的元素替换为所在列的 最大 元素。 返回矩阵 answer 。 示例 1: 输入&am…...
解决MCM功率电源模块EMC的关键
对MCM功率电源而言,由于其工作在几百kHz的高频开关状态,故易成为干扰源。电磁兼容性EMC(Electro Magnetic Compatibility),是指设备或系统在其电磁环境中符合要求运行并不对其环境中的任何设备产生无法忍受的电磁干扰的…...
在conda的环境中安装Jupyter及其他软件包
Pytorch版本、安装和检验 大多数软件包都是随Anaconda安装的,也可以根据需要手动安装一些其他软件包。 目录 创建虚拟环境 进入虚拟环境 安装Jupyter notebook 安装matplotlib 安装 pandas 创建虚拟环境 基于conda包的环境创建、激活、管理与删除http://t.cs…...
spark中的floor函数
在Spark中,floor函数是一种数学函数,用于返回不大于给定数值的最大整数。具体作用如下: 1. 数值操作: floor函数会将每个元素向下取整到最接近的整数。例如,对于浮点数或双精度数值,它会返回不大于该数值的…...
最简单的Docker离线安装教程
最简单的Docker离线安装教程 方式一 RPM 包方式1. 在线下载 RPM 包2. 将 RPM 包拷贝到安装机器3. 安装4. 启动 方式二 二进制安装方式(推荐)1. 下载包2. 将包进行解压授权3. 注册 systemd4. 自启和启动 一直以来在线安装 docker 到服务器上是非常方便的&…...
如何在 Python 中创建一个类似于 MS 计算器的 GUI 计算器
问题背景 假设我们需要创建一个类似于微软计算器的 GUI 计算器。这个计算器应该具有以下功能: 能够显示第一个输入的数字。当按下运算符时,输入框仍显示第一个数字。当按下第二个数字时,第一个数字被替换。 解决方案 为了解决这个问题&am…...
警惕:与ChatGPT共享业务数据可能十分危险
您已经在使用ChatGPT了吗?或者您正在考虑使用它来简化操作或改善客户服务?虽然ChatGPT提供了许多好处,但重要的是,您要意识到与ChatGPT这样的人工智能工具共享敏感业务数据相关的安全风险。下面,我们概述了一些关键问题…...
基于MacOS系统Sonoma 14.5的SSH服务禁止密码登录
基于系统Sonoma 14.5,不同系统有所差异。 修改sshd_config文件 sudo vim /etc/ssh/sshd_config找到以下两行取消注释,修改值为 no PasswordAuthentication no KbdInteractiveAuthentication no重启sshd服务 # 关闭服务 sudo launchctl unload -w /System…...
深入理解MySQL中的EXPLAIN及type列
在MySQL中,EXPLAIN是一个强大的工具,它可以帮助我们理解SQL查询的执行计划。通过使用EXPLAIN,我们可以获取到查询的详细信息,包括如何执行查询,以及查询的各个部分如何连接在一起。在本篇博客中,我们将重点…...
LoRaWAN网络协议Class A/Class B/Class C三种工作模式说明
LoRaWAN是一种专为广域物联网设计的低功耗广域网络协议。它特别适用于物联网(IoT)设备,可以在低数据速率下进行长距离通信。LoRaWAN 网络由多个组成部分构成,其中包括节点(终端设备)、网关和网络服务器。Lo…...
ITSS服务经理:WAVE SUMMIT深度学习开发者大会2024在北京召开
在6月28日,由深度学习技术及应用国家工程研究中心主导的WAVE SUMMIT深度学习开发者大会2024于北京隆重举行。 此次盛会由百度飞桨和文心大模型联袂承办。 在大会上,百度震撼发布文心大模型4.0 Turbo版本,并宣布其API接口将向广大开发者开放…...
Keysight 是德 DSAX93204A 高性能示波器
Keysight 是德 DSAX93204A 高性能示波器 DSAX93204A Infiniium 高性能示波器: 33 GHz 高带宽实时示波器 zui佳的 33 GHz 真正模拟带宽80 GSa/s 采样率,2 通道;40 GSa/s 采样率,4 通道zui深的存储深度――高达 2 Gpts 存储器&am…...
oracle逻辑层级详解(表空间、段、区、数据块)
文章目录 逻辑结构的层次如下所述:逻辑结构包括表空间、段、区和数据块。表空间:段:区:数据块: 逻辑结构的层次如下所述: oracle数据库至少包含一个表空间。 表空间包含一个或多个段。(segmen…...
华为OD机试(C卷,200分)- 字符串拼接、田忌赛马
(C卷,200分)- 字符串拼接 题目描述 给定 M(0 < M ≤ 30)个字符(a-z),从中取出任意字符(每个字符只能用一次)拼接成长度为 N(0 < N ≤ 5)的字符串, 要求…...
Windows中配置python3.11环境安装教程
在Windows中配置Python 3.11环境的步骤如下: 第一步:下载 Python 3.11 访问 Python 官方网站:https://www.python.org/导航到 “Downloads” 部分,选择 “Windows”。在 “Windows” 页面中,找到 “Python 3.11.x”&…...
市场趋势的智能预测:Kompas.ai如何洞察未来市场动向
在商业领域,市场趋势预测是企业制定战略规划和做出明智决策的关键。准确把握市场动向能够帮助企业及时调整战略,抓住机遇,规避风险。Kompas.ai,一款先进的人工智能市场分析工具,正通过其深度学习和数据分析能力&#x…...
华南师范大学“大学生校外实践教学基地”授牌仪式暨见习参观活动圆满结束
为促进校企合作的深入发展,培育出具有实际应用技能的人才,7月9日,华南师范大学数学科学院与广东泰迪智能科技股份有限公司联合开展“大学生校外实践教学基地”授牌仪式暨见习参观活动。华南师范大学数学科学院数据科学系主任陈艳男、副主任陈…...
Arduino UNO R4专用ME310G1通信库:AT封装与低功耗LPWAN集成
1. 项目概述ME310G1 是 CodeZoo 基于 Telit ME310G1-W3 LTE-M/NB-IoT 模块开发的官方 Arduino 通信库,专为 Arduino UNO R4 平台深度适配。该库并非从零构建,而是以 Telit 官方 Charlie Arduino Library 为基础进行系统性重构与硬件抽象层重写࿰…...
AI修图新体验:LongCat-Image-Edit快速部署,轻松实现图片局部修改
AI修图新体验:LongCat-Image-Edit快速部署,轻松实现图片局部修改 1. 模型简介:一句话精准修图 LongCat-Image-Edit是美团团队开源的一款革命性图像编辑工具,它能通过简单的文字指令实现图片的精准修改。与传统的图像生成工具不同…...
ExoPlayer进阶技巧:利用exo_overlay实现视频浮层效果的5种创意用法
ExoPlayer进阶技巧:利用exo_overlay实现视频浮层效果的5种创意用法 在移动视频应用开发中,ExoPlayer凭借其高度可定制性成为众多开发者的首选。而exo_overlay作为PlayerView中一个常被忽视的强大功能,实际上能为视频播放体验带来质的飞跃。这…...
Qwen3.5-9B算法学习伙伴:LeetCode解题思路分析与代码实现
Qwen3.5-9B算法学习伙伴:LeetCode解题思路分析与代码实现 1. 为什么需要AI算法学习伙伴 刷LeetCode是每个程序员提升算法能力的必经之路,但独自面对难题时常常陷入困境。你可能遇到过这些情况:盯着题目半小时毫无头绪、写出的代码总是超时、…...
OpenClaw语音交互扩展:Qwen3-14b_int4_awq对接Whisper实现语音指令
OpenClaw语音交互扩展:Qwen3-14b_int4_awq对接Whisper实现语音指令 1. 为什么需要语音交互能力 作为一个长期依赖键盘输入的开发者,我最初对语音交互持怀疑态度——直到上个月连续加班导致手腕腱鞘炎发作。当连敲空格键都变成折磨时,才意识…...
OpenClaw安全加固:Qwen3-14B镜像操作权限精细控制方案
OpenClaw安全加固:Qwen3-14B镜像操作权限精细控制方案 1. 为什么需要安全加固? 去年我在尝试用OpenClaw自动整理财务报告时,差点酿成大错——脚本误删了原始Excel文件。这次经历让我意识到:当AI能直接操作系统时,安全…...
手把手教你用Node.js对接阿里云/火山引擎TTS流式API(附完整代码与避坑指南)
Node.js实战:阿里云与火山引擎TTS流式API集成全攻略 在语音交互应用开发中,文本转语音(TTS)技术的流畅度直接影响用户体验。传统一次性请求的TTS接口往往存在明显延迟,而流式API则能实现"边生成边播放"的效果。本文将带你从零实现…...
告别重复提问:手把手教你用Continue的YAML配置文件打造专属AI编程助手
告别重复提问:用YAML配置文件打造你的AI编程伙伴 每次打开IDE准备写代码时,你是否也厌倦了反复输入那些相似的提示词?"生成单元测试"、"添加注释"、"解释这段代码"... 这些重复性请求不仅浪费时间,…...
OpenClaw跨平台控制:Qwen3-32B同步操作多台设备的配置方法
OpenClaw跨平台控制:Qwen3-32B同步操作多台设备的配置方法 1. 为什么需要分布式OpenClaw控制? 去年冬天,当我需要在三台不同操作系统的设备上同步执行数据清洗任务时,第一次意识到单机OpenClaw的局限性。每台设备需要单独登录、…...
别再只盯着mAP了:用YOLO做项目时,TP/FP/FN这些指标到底该怎么看?
别再只盯着mAP了:用YOLO做项目时,TP/FP/FN这些指标到底该怎么看? 当你第一次看到YOLO模型的预测结果时,那些密密麻麻的边界框可能会让你感到既兴奋又困惑。兴奋的是模型确实检测到了目标,困惑的是——这些检测结果到底…...
