(保姆级教程)EasyExcel导出自适应行高,列宽

您所在的位置:网站首页 excel怎么设置行高自动适应 (保姆级教程)EasyExcel导出自适应行高,列宽

(保姆级教程)EasyExcel导出自适应行高,列宽

2024-05-31 16:15| 来源: 网络整理| 查看: 265

EasyExcel导出自适应行高,列宽 一、引言

最近客户在进行数据导出时,遇到了文本内容没完全显示的问题。看到这个问题当然第一时间就是面向百度编程啦。但是网上教程不太详细,特此我自己又研究了一番。期间踩了不少坑,调试过不同的数值对导出的影响。最终有了以下代码。下面代码直接复制即可使用,接下来是保姆级教程。

二、引入依赖

这里要注意,低版本的easyExcel依赖可能出现没有效果的问题。我一开始使用的3.0.1版本就没效果。

com.alibaba easyexcel 3.1.3 三、自适应列宽

这里我给大家详细说一下。首先是我这边定义的如果columnWidth 长度大于10,就赋值为20,否则就赋值为10,你们可以自行调整。 在计算长度的那个方法中,有个switch 方法,其中对字符串,布尔,还有数值型进行区分。然后去用不同的公式计算。这里会遇到一个坑,如果你的导出的文档有很多数字,比如金额什么的。就可以把case NUMBER删掉,因为可能列宽不够导致导出来的值是”######“。

public class CustomCellWriteWidthConfig extends AbstractColumnWidthStyleStrategy { private final Map CACHE = new HashMap(); @Override protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List cellDataList, Cell cell, Head head, Integer integer, Boolean isHead) { boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList); if (needSetWidth) { Map maxColumnWidthMap = CACHE.computeIfAbsent(writeSheetHolder.getSheetNo(), k -> new HashMap()); Integer columnWidth = this.dataLength(cellDataList, cell, isHead); if (columnWidth > 0) { if (columnWidth > 10) { columnWidth = 20; }else{ columnWidth = 10; } Integer maxColumnWidth = maxColumnWidthMap.get(cell.getColumnIndex()); if (maxColumnWidth == null || columnWidth > maxColumnWidth) { maxColumnWidthMap.put(cell.getColumnIndex(), columnWidth); Sheet sheet = writeSheetHolder.getSheet(); sheet.setColumnWidth(cell.getColumnIndex(), 256 * columnWidth + 184); } } } } /** * 计算长度 * * @param cellDataList * @param cell * @param isHead * @return */ private Integer dataLength(List cellDataList, Cell cell, Boolean isHead) { if (isHead) { return cell.getStringCellValue().getBytes().length; } else { CellData cellData = cellDataList.get(0); CellDataTypeEnum type = cellData.getType(); if (type == null) { return -1; } else { switch (type) { case STRING: // 换行符(数据需要提前解析好) int index = cellData.getStringValue().indexOf("\n"); return index != -1 ? cellData.getStringValue().substring(0, index).getBytes().length + 1 : cellData.getStringValue().getBytes().length + 1; case BOOLEAN: return cellData.getBooleanValue().toString().getBytes().length; case NUMBER: return cellData.getNumberValue().toString().getBytes().length; default: return -1; } } } } } 四、自适应行高

这里我是10个字符就插入一个换行符,你们可以根据业务场景自行调整。下面我解释一下我为什么重写afterRowDispose方法,因为在我们导出的时候除了使用一个集合进行填充,还会对单个单个单元格进行填充,也就是可能会同时使用excelWriter.fill(var1, var2, var3); 和excelWriter.fill(var1, var2); 这两个方法。因为在填充单个单元格时是没有相对行索引的概念的,所以我进行了判空处理。这个问题我排查了一下午真的裂开。特此指出。

public class CustomCellWriteHeightConfig extends AbstractRowHeightStyleStrategy { /** * 默认高度 */ private static final Integer DEFAULT_HEIGHT = 300; @Override protected void setHeadColumnHeight(Row row, int relativeRowIndex) { } @Override protected void setContentColumnHeight(Row row, int relativeRowIndex) { Iterator cellIterator = row.cellIterator(); if (!cellIterator.hasNext()) { return; } // 默认为 1 行高度 int maxHeight = 1; while (cellIterator.hasNext()) { Cell cell = cellIterator.next(); if (cell.getCellType() == CellType.STRING) { String value = cell.getStringCellValue(); for (int i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3