使用easyexcel导出时行高不自动调整的解决

简介: 使用easyexcel导出时行高不自动调整的解决

easyexcel在使用模板填充的方式时,有些文字比较长,需要设置自动换行显示,文档中并没有在此处说明如何设置,翻到前面的写excel中有设置自定义样式的方式,照着搬过来即可:

// 内容的策略
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
// 这里需要指定 FillPatternType 为FillPatternType.SOLID_FOREGROUND 不然无法显示背景颜色.头默认了 FillPatternType所以可以不指定
contentWriteCellStyle.setWrapped(true);
// 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
HorizontalCellStyleStrategy horizontalCellStyleStrategy =
    new HorizontalCellStyleStrategy(null, contentWriteCellStyle);
ExcelWriter excelWriter = EasyExcel.write(fileName).registerWriteHandler(horizontalCellStyleStrategy).withTemplate(templateFileName).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
// 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行,然后下面的数据往后移动。默认 是false,会直接使用下一行,如果没有则创建。
// forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了,所以慎用
// 简单的说 如果你的模板有list,且list不是最后一行,下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
// 如果数据量大 list不是最后一行 参照下一个
FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();

image.gif

核心就是在构造ExcelWriter时设置样式策略。我在这样设置后,一直有问题,第一行显示正常,但第二行的样式上虽然已经有了自动换行但打开文件后,内容却显示的不全,所以有更硬核的修改方式,我直接改了源码中的ExcelWriteFillExecutor类,在该类的doFill方法中加入如下代码,强行锁定行高,最终修改成功。

private void doFill(List<AnalysisCell> analysisCellList, Object oneRowData, FillConfig fillConfig,
        Integer relativeRowIndex) {
        Map dataMap;
        if (oneRowData instanceof Map) {
            dataMap = (Map)oneRowData;
        } else {
            dataMap = BeanMap.create(oneRowData);
        }
        WriteSheetHolder writeSheetHolder = writeContext.writeSheetHolder();
        Map<String, ExcelContentProperty> fieldNameContentPropertyMap =
            writeContext.currentWriteHolder().excelWriteHeadProperty().getFieldNameContentPropertyMap();
        for (AnalysisCell analysisCell : analysisCellList) {
            Cell cell = getOneCell(analysisCell, fillConfig);
            if (analysisCell.getOnlyOneVariable()) {
                String variable = analysisCell.getVariableList().get(0);
                if (writeContext.currentWriteHolder().ignore(variable, analysisCell.getColumnIndex())) {
                    continue;
                }
                if (!dataMap.containsKey(variable)) {
                    continue;
                }
                Object value = dataMap.get(variable);
                CellData cellData = converterAndSet(writeSheetHolder, value == null ? null : value.getClass(), cell,
                    value, fieldNameContentPropertyMap.get(variable));
                //这是我添加的代码-------开始
                CellStyle cellStyle = cell.getCellStyle();
                cellStyle.setWrapText(true);
                String stringValue = cellData.getStringValue();
                //如果内容比较多,前面已经设置了自动换行,但是,行高依然会有bug,这里可以手动进行设置
                if (stringValue.length()>10) {
                    Row row = cell.getRow();
                    row.setHeight((short) 820);
                }
                //这是我添加的代码-------结束
                WriteHandlerUtils.afterCellDispose(writeContext, cellData, cell, null, relativeRowIndex, Boolean.FALSE);
            } else {
                StringBuilder cellValueBuild = new StringBuilder();
                int index = 0;
                List<CellData> cellDataList = new ArrayList<CellData>();
                for (String variable : analysisCell.getVariableList()) {
                    cellValueBuild.append(analysisCell.getPrepareDataList().get(index++));
                    if (writeContext.currentWriteHolder().ignore(variable, analysisCell.getColumnIndex())) {
                        continue;
                    }
                    if (!dataMap.containsKey(variable)) {
                        continue;
                    }
                    Object value = dataMap.get(variable);
                    CellData cellData = convert(writeSheetHolder, value == null ? null : value.getClass(), cell, value,
                        fieldNameContentPropertyMap.get(variable));
                    cellDataList.add(cellData);
                    CellDataTypeEnum type = cellData.getType();
                    if (type != null) {
                        switch (type) {
                            case STRING:
                                cellValueBuild.append(cellData.getStringValue());
                                break;
                            case BOOLEAN:
                                cellValueBuild.append(cellData.getBooleanValue());
                                break;
                            case NUMBER:
                                cellValueBuild.append(cellData.getNumberValue());
                                break;
                            default:
                                break;
                        }
                    }
                }
                cellValueBuild.append(analysisCell.getPrepareDataList().get(index));
                String s = cellValueBuild.toString();
                if (s.length() > 10) {
                    System.out.println(s);
                    s = s.substring(0, 10) + "\n" + s.substring(10, s.length());
                }
                cell.setCellValue(s);
                CellStyle cellStyle = cell.getCellStyle();
                cellStyle.setWrapText(true);
                WriteHandlerUtils.afterCellDispose(writeContext, cellDataList, cell, null, relativeRowIndex,
                    Boolean.FALSE);
            }
        }
    }

image.gif

但这玩意,我后面发现bug消失了,只设置最开始说的内容就完美了。

记录一下,over!

相关文章
|
7月前
|
Java
Springboot 导出word,动态填充表格数据
Springboot 导出word,动态填充表格数据
|
算法 Python
Python 技术篇 - 操作excel实现单元格合并并居中实例演示,用openpyxl库为指定区域的单元格设置对齐样式和字体样式方法
Python 技术篇 - 操作excel实现单元格合并并居中实例演示,用openpyxl库为指定区域的单元格设置对齐样式和字体样式方法
1075 0
Python 技术篇 - 操作excel实现单元格合并并居中实例演示,用openpyxl库为指定区域的单元格设置对齐样式和字体样式方法
|
7月前
LabVIEW 调整Table表格行高列宽的方法与例程
LabVIEW 调整Table表格行高列宽的方法与例程
413 1
|
7月前
|
Java Apache 索引
POI操作大全(动态合并单元格,为单元格生成一个自定义的数据显示格式,自定义公式计算结果生成,读取excel,word文件在生成图片,word指定位置生成图片)
POI操作大全(动态合并单元格,为单元格生成一个自定义的数据显示格式,自定义公式计算结果生成,读取excel,word文件在生成图片,word指定位置生成图片)
1001 0
|
7月前
LabVIEW在运行时调整表控件列宽
LabVIEW在运行时调整表控件列宽
95 0
|
7月前
|
前端开发 Java Maven
springboot优雅的实现excel的导出(自适应列宽实现,中文也行),复制可用
springboot优雅的实现excel的导出(自适应列宽实现,中文也行),复制可用
278 0
|
人工智能 测试技术
ChatExcel--自动处理表格
ChatExcel--自动处理表格
336 1
ChatExcel--自动处理表格
|
敏捷开发 前端开发 开发者
【RaETable】🚀🚀🚀告别Form,RaETable表格列宽度支持拖动调整了,附带原理说明
【RaETable】🚀🚀🚀告别Form,RaETable表格列宽度支持拖动调整了,附带原理说明
Echarts参数属性学习:x轴标签文本过长自动缩减并替换成缩略号...
Echarts参数属性学习:x轴标签文本过长自动缩减并替换成缩略号...
144 0
【Excel自动化办公Part5】:设置行高和列宽、合并单元格、取消合并单元格
【Excel自动化办公Part5】:设置行高和列宽、合并单元格、取消合并单元格
224 0
【Excel自动化办公Part5】:设置行高和列宽、合并单元格、取消合并单元格