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

【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());
http://www.lryc.cn/news/397411.html

相关文章:

  • 半月内笔者暂不写时评文
  • Python面试题:如何在 Python 中解析 XML 文件?
  • 3033.修改矩阵
  • 解决MCM功率电源模块EMC的关键
  • 在conda的环境中安装Jupyter及其他软件包
  • spark中的floor函数
  • 最简单的Docker离线安装教程
  • 如何在 Python 中创建一个类似于 MS 计算器的 GUI 计算器
  • 警惕:与ChatGPT共享业务数据可能十分危险
  • 基于MacOS系统Sonoma 14.5的SSH服务禁止密码登录
  • 深入理解MySQL中的EXPLAIN及type列
  • LoRaWAN网络协议Class A/Class B/Class C三种工作模式说明
  • ITSS服务经理:WAVE SUMMIT深度学习开发者大会2024在北京召开
  • Keysight 是德 DSAX93204A 高性能示波器
  • oracle逻辑层级详解(表空间、段、区、数据块)
  • 华为OD机试(C卷,200分)- 字符串拼接、田忌赛马
  • Windows中配置python3.11环境安装教程
  • 市场趋势的智能预测:Kompas.ai如何洞察未来市场动向
  • 华南师范大学“大学生校外实践教学基地”授牌仪式暨见习参观活动圆满结束
  • 防爆定位信标适合工厂吗?都有哪些优势呢?
  • 行为模式8.状态模式------灯泡状态切换
  • Linux账户和组管理——账户和工作组分类,用户账号文件,/etc/passwd文件中7个字段,id 命令
  • 《大明混一图》: 令人叹为观止的古代世界地图
  • Java高级重点知识点-22-缓冲流、转换流、序列化流、打印流
  • express民族民俗文化分享平台-计算机毕业设计源码22552
  • Web 基础与HTTP 协议
  • C++超市外卖小程序-计算机毕业设计源码62482
  • 合合信息“大模型加速器”亮相2024世界人工智能大会
  • 2024.07.03校招 实习 内推 面经
  • MySQL中的DDL语句