[alibaba/easyexcel]使用模板填充列表数据,添加forceNewRow(Boolean.TRUE),依然会覆盖掉下面的行

2023-03-07 372 views
7
异常代码
   try (ExcelWriter excelWriter = EasyExcel.write(outputStream).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).direction(WriteDirectionEnum.VERTICAL).build();
excelWriter.fill(eduHistories, fillConfig, writeSheet);
                excelWriter.fill(workHistories, fillConfig, writeSheet);
                excelWriter.fill(kinships, fillConfig, writeSheet);
                excelWriter.fill(resumesVo, fillConfig, writeSheet);
}

我的模板: image

异常提示

模板里面有三个列表需要填充,但是不会新添一行,只会向下覆盖,也使用过forceNewRow(Boolean.TRUE)无效,easyexcel版本为最新 3.2.1版本

问题描述

image

回答

3

使用 2459 这个方法解决

6

使用 2459 这个方法解决

感谢关联

5

使用 2459 这个方法解决

补充, 1、如果表中有多个列表填充时填充时需要使用FillWrapper包裹,否则会覆盖掉你下面其他的填充列表。 excelWriter.fill(new FillWrapper("edu", eduHistories), fillConfig, writeSheet); 2、填充的单元格模板中有预先合并的单元格时配合forceNewRow(Boolean.TRUE) 时会出现新填充的一行没有像模板设置的一样合并,我的解决办法是添加WriteHandler 去手动将合并区域合并。 3、使用OnceAbsoluteMergeStrategy 合并单元格时,出现部分单元格合并失效,猜测可能和forceNewRow(Boolean.TRUE) 有关,合并失效的大多都是新创建的一行,解决办法是使用 2459 中提到的CellWriteHandler去替换掉 OnceAbsoluteMergeStrategy 解决。 bug 格式: image

4、合并完成后发现部分单元格边框线缺失,猜测是forceNewRow(Boolean.TRUE)新创建的一行默认没有样式,然后使用CellWriteHandler 去合并的时候相当于只是把一个单元格拉到3个单元格那么长(假如需要横向合并三个单元格形容一下,具体可能不是这样),但是其实中间缺少了两个单元格,我的解决办法是使用writeSheetHolder.getCachedSheet().getRow(rowIndex).createCell(colIndex) 去创建中间缺失的单元格,并设置新的有上下Border 的cellStyle,注意cellStyle需要重新创建(不重新创建会导致整个表的单元格格式都被修改),具体代码如下

                 * 不能直接修改单元格样式,可能所有单元格都是用的同一个样式会导致整个sheet 的单元格样式改变
                 */
                CellStyle cellStyle = writeSheetHolder.getSheet().getWorkbook().createCellStyle(); //创建新的cellStyle
                cellStyle.cloneStyleFrom(writeSheetHolder.getCachedSheet().getRow(7).getCell(6).getCellStyle()); //复制现有单元格样式
                cellStyle.setBorderBottom(BorderStyle.THIN); //设置下边框
                cellStyle.setBorderRight(BorderStyle.THIN);//设置右边框
                writeSheetHolder.getCachedSheet().getRow(6 + i).getCell(6).setCellStyle(cellStyle);
                writeSheetHolder.getCachedSheet().getRow(6 + i).createCell(7).setCellStyle(cellStyle); //创建缺少的单元格

bug格式: image

最终效果: image

希望对同样问题的朋友有帮助