EasyExcel使用模板填充多个列表数据,覆盖,合并失效,合并的单元格边框线缺失

文章讲述了在使用ExcelWriter进行数据填充时遇到的问题,如forceNewRow不起作用,以及OnceAbsoluteMergeStrategy导致的合并失效。作者提供了使用FillWrapper和自定义CellWriteHandler来解决这些问题的方法,包括添加边框和修复单元格样式。
摘要由CSDN通过智能技术生成

覆盖

填充列表时新增一行向下填充应该使用

forceNewRow(Boolean.TRUE)

代码如下:

FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
// 填充数据
excelWriter.fill(expList, fillConfig, writeSheet);
excelWriter.fill(proList, fillConfig, writeSheet);
excelWriter.fill(testList, fillConfig, writeSheet);

模板:

结果发现forceNewRow(Boolean.TRUE)不生效,数据不会新增一行,而是直接覆盖sheet页中原有内容

原因:填充多个列表时,应该使用FillWrapper来包裹前缀

FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
// 填充数据
excelWriter.fill(new FillWrapper("exp", expList), fillConfig, writeSheet);
excelWriter.fill(new FillWrapper("pro", proList), fillConfig, writeSheet);
excelWriter.fill(new FillWrapper("test", testList), fillConfig, writeSheet);

新模板:

合并失效

OnceAbsoluteMergeStrategy合并单元格时,新增的数据行合并失败,第0列合并失败

代码如下:

            int exp_size = expList.size();
            int pro_size = proList.size();
            int test_size = testList.size();
            int firstRowIndex = 22 + exp_size + pro_size;
            int lastRowIndex = firstRowIndex + test_size - 1;
            OnceAbsoluteMergeStrategy strategy1 = new OnceAbsoluteMergeStrategy(firstRowIndex, lastRowIndex, 0, 0);
            OnceAbsoluteMergeStrategy strategy2 = new OnceAbsoluteMergeStrategy(firstRowIndex, lastRowIndex, 2, 2);
            OnceAbsoluteMergeStrategy strategy3 = new OnceAbsoluteMergeStrategy(firstRowIndex, lastRowIndex, 4, 4);

            for (int i = 0; i < exp_size; i++) {
                OnceAbsoluteMergeStrategy strategy = new OnceAbsoluteMergeStrategy(8 + i, 8 + i, 2, 2);
                list.add(strategy);
            }
            list.add(strategy1);
            list.add(strategy2);
            list.add(strategy3);

            for (OnceAbsoluteMergeStrategy item : list) {
                writerBuilder.registerWriteHandler(item);
            }

下载结果:

解决方案:

重写CellWriteHandler 来合并坐标

    private CellWriteHandler CellMergeStrategy(int i, int j, int k) {
        return new CellWriteHandler() {
            @Override
            public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
                                         List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex,
                                         Boolean isHead) {
                int rowIndex = cell.getRowIndex();

                if (rowIndex >= 9 && rowIndex <= 7 + i && i != 0 && columnIndex == 2) {
                    CellRangeAddress cellAddresses = new CellRangeAddress(rowIndex, rowIndex, 2, 3);
                    writeSheetHolder.getSheet().addMergedRegionUnsafe(cellAddresses);
                }
                if (rowIndex >= 11 + i && rowIndex <= 9 + i + j && j != 0 && columnIndex == 2) {
                    CellRangeAddress cellAddresses = new CellRangeAddress(rowIndex, rowIndex, 2, 5);
                    writeSheetHolder.getSheet().addMergedRegionUnsafe(cellAddresses);
                }
                if (rowIndex == 22 + i + j && k != 0 && columnIndex == 1) {
                    CellRangeAddress cellAddresses1 = new CellRangeAddress(rowIndex, rowIndex + k - 1, 0, 0);
                    CellRangeAddress cellAddresses2 = new CellRangeAddress(rowIndex, rowIndex + k - 1, 2, 2);
                    CellRangeAddress cellAddresses3 = new CellRangeAddress(rowIndex, rowIndex + k - 1, 4, 4);
                    writeSheetHolder.getSheet().addMergedRegionUnsafe(cellAddresses1);
                    writeSheetHolder.getSheet().addMergedRegionUnsafe(cellAddresses2);
                    writeSheetHolder.getSheet().addMergedRegionUnsafe(cellAddresses3);
                }
            }
        };
    }
CellWriteHandler mergeStrategy = CellMergeStrategy(expList.size(), proList.size(), testList.size());
writerBuilder.registerWriteHandler(mergeStrategy);

下载结果:

边框线缺失

创建缺失的单元格,重新设置cellStyle

    private CellWriteHandler CellMergeStrategy(int i, int j, int k) {
        return new CellWriteHandler() {
            @Override
            public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
                                         List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex,
                                         Boolean isHead) {
                int rowIndex = cell.getRowIndex();
                int columnIndex = cell.getColumnIndex();

                // 样式
                CellStyle cellStyle = writeSheetHolder.getSheet().getWorkbook().createCellStyle();
                cellStyle.cloneStyleFrom(writeSheetHolder.getCachedSheet().getRow(1).getCell(1).getCellStyle());
                cellStyle.setBorderBottom(BorderStyle.THIN);
                cellStyle.setBorderRight(BorderStyle.THIN);
                if (rowIndex >= 9 && rowIndex <= 7 + i && i != 0 && columnIndex == 2) {
                    // 补充边框线
                    writeSheetHolder.getCachedSheet().getRow(rowIndex).createCell(3);
                    writeSheetHolder.getCachedSheet().getRow(rowIndex).getCell(3).setCellStyle(cellStyle);
                }
                if (rowIndex >= 11 + i && rowIndex <= 9 + i + j && j > 1 && columnIndex == 2) {
                    // 补充边框线
                    writeSheetHolder.getCachedSheet().getRow(rowIndex).createCell(3);
                    writeSheetHolder.getCachedSheet().getRow(rowIndex).createCell(4);
                    writeSheetHolder.getCachedSheet().getRow(rowIndex).createCell(5);
                    writeSheetHolder.getCachedSheet().getRow(rowIndex).getCell(3).setCellStyle(cellStyle);
                    writeSheetHolder.getCachedSheet().getRow(rowIndex).getCell(4).setCellStyle(cellStyle);
                    writeSheetHolder.getCachedSheet().getRow(rowIndex).getCell(5).setCellStyle(cellStyle);
                }
                if (rowIndex == 22 + i + j && k > 1 && columnIndex == 1) {
                    // 补充边框线
                    for (int m = 1; m < k; m++) {
                        writeSheetHolder.getCachedSheet().createRow(rowIndex + m);
                        writeSheetHolder.getCachedSheet().getRow(rowIndex + m).createCell(0);
                        writeSheetHolder.getCachedSheet().getRow(rowIndex + m).createCell(2);
                        writeSheetHolder.getCachedSheet().getRow(rowIndex + m).createCell(4);
                    }
                    writeSheetHolder.getCachedSheet().getRow(rowIndex + k - 1).getCell(0).setCellStyle(cellStyle);
                    writeSheetHolder.getCachedSheet().getRow(rowIndex + k - 1).getCell(2).setCellStyle(cellStyle);
                    writeSheetHolder.getCachedSheet().getRow(rowIndex + k - 1).getCell(4).setCellStyle(cellStyle);
                }
            }
        };
    }

下载结果:

  • 10
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
EasyExcel中,使用ExcelWriter基于Excel模板填充时,可以使用注解`@ExcelProperty`来指定数据在Excel模板中的位置,并使用`@ContentRowHeight`、`@HeadRowHeight`、`@HeadStyle`、`@ContentStyle`等注解来设置单元格的样式和格式。 而对于合并单元格,可以使用`@ContentLoopMerge`注解来实现。具体步骤如下: 1.在Excel模板中设置需要合并单元格。例如,我们需要将第2列的数据按照第1列的值进行合并,则可以在第1列的单元格中设置`@ContentLoopMerge(name = "name")`注解来指定需要合并单元格。如下所示: ``` | 姓名 | 年龄 | 性别 | |------|------|------| | A | 20 | 男 | | A | 25 | 女 | | B | 30 | 男 | | B | 35 | 女 | ``` 2.在实体类中使用`@ExcelProperty`注解来指定数据在Excel模板中的位置。同时,使用`@ContentLoopMerge(name = "name")`注解来指定需要合并单元格。如下所示: ```java public class User { @ExcelProperty(value = "姓名", index = 0) @ContentLoopMerge(name = "name") private String name; @ExcelProperty(value = "年龄", index = 1) private Integer age; @ExcelProperty(value = "性别", index = 2) private String gender; // getter和setter方法省略 } ``` 3.在代码中使用`ExcelWriter`对象来填充数据使用`FillConfig`对象来设置`@ContentLoopMerge`注解的参数。如下所示: ```java // 加载Excel模板 InputStream templateInputStream = new FileInputStream("template.xlsx"); Template template = TemplateUtil.loadTemplate(templateInputStream); // 创建ExcelWriter对象 ExcelWriter writer = EasyExcel.write(outputStream).withTemplate(template).build(); // 设置FillConfig对象 FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); // 填充数据 List<User> userList = getUserList(); writer.fill(userList, fillConfig, new Sheet(0)); // 关闭ExcelWriter对象 writer.finish(); ``` 在上面的示例中,我们首先加载Excel模板,然后创建`ExcelWriter`对象,设置`FillConfig`对象并填充数据。其中,`forceNewRow`参数表示是否强制创建新的行,`Sheet`对象表示填充数据的Sheet页。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值