easyexcel合计列合并问题

2 篇文章 0 订阅

近期需要做一个导出,模板的样子如下

有4行是表头,最后一行是合计

使用的 easyexcel 的版本为

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.2.1</version>
        </dependency>

经过试错了几次后,最终处理结果如下

// 合计单元格样式
        WriteCellStyle summaryCellStyle = new WriteCellStyle();
        summaryCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);// 水平居中
        summaryCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 垂直居中

        HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy();
        horizontalCellStyleStrategy.setContentWriteCellStyleList(CustomArrayUtis.toList(summaryCellStyle));

        ExcelWriter excelWriter = EasyExcel.write(xlsFilePath, IncomeTuanPlatform.class)
                .registerWriteHandler(new CustomCellWeightWeightConfig2())
                // 合并策略
                .registerWriteHandler(new ColumnMergeStrategy(list.size()))
                .registerWriteHandler(horizontalCellStyleStrategy)
                .build();

        WriteSheet writeSheet = EasyExcel.writerSheet(1, sheetName).needHead(Boolean.FALSE).build();

        WriteTable writeTable = EasyExcel.writerTable(1).needHead(Boolean.TRUE).build();
        excelWriter.write(list, writeSheet, writeTable);

        int settledAmountSum = 0;
        int taxSum = 0;
        int excludeTaxAmountSum = 0;
        String taxRate = null;

        for (IncomeTuanPlatform data : list) {
            settledAmountSum += CustomMathUtils.yuan2fen(data.getSettledAmount());
            taxRate = data.getTaxRate();
            taxSum += CustomMathUtils.yuan2fen(data.getTax());
            excludeTaxAmountSum = CustomMathUtils.yuan2fen(data.getExcludeTaxAmount());
        }

        // 合计
        excelWriter.write(createIncomeData(settledAmountSum, taxSum, excludeTaxAmountSum, taxRate), writeSheet);

        excelWriter.finish();

public class ColumnMergeStrategy implements RowWriteHandler {

    private static final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());

    // 数据总数
    private int dataCount;

    public ColumnMergeStrategy(int dataCount) {
        this.dataCount = dataCount;
    }

    @Override
    public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) {
        // logger.info("afterRowDispose");

        // 经过多次测试,发现不同的数据量处理的方式不同,难道是跟合并列的数量有关系?

        boolean flag = dataCount <= 3;
        if (flag) {
            int summaryRowIndex = dataCount + 4;
            if (relativeRowIndex.intValue() == dataCount) {
                logger.info("relativeRowIndex:{}", relativeRowIndex);

                CellRangeAddress mergeRange = new CellRangeAddress(summaryRowIndex, summaryRowIndex, 0, 2);
                writeSheetHolder.getSheet().addMergedRegionUnsafe(mergeRange);
            }
        } else {
            int totalIndex = dataCount - 1;

            // 由于表头是4行,所以需要处理一下
            int summaryRowIndex = dataCount + 4;
            if (relativeRowIndex.intValue() == totalIndex) {
                logger.info("relativeRowIndex:{}, summaryRowIndex:{}", relativeRowIndex, summaryRowIndex);
                CellRangeAddress mergeRange = new CellRangeAddress(summaryRowIndex, summaryRowIndex, 0, 2);
                writeSheetHolder.getSheet().addMergedRegion(mergeRange);
            }
        }

    }
}

最终结果

有一个问题是所有的行都居中了,这个问题目前没找到可以单独设置合计行的样式的api,后面看一下。

参考链接

https://blog.csdn.net/qq_20426717/article/details/121040243

https://blog.csdn.net/weixin_46114883/article/details/129031331 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EasyExcel合并可以通过 `merge` 方法实现。具体步骤如下: 1. 创建一个 `WriteSheet` 对象,定义表格的基本信息。 ```java WriteSheet writeSheet = EasyExcel.writerSheet("合并示例").build(); ``` 2. 定义表头信息,并添加到 `WriteSheet` 对象中。 ```java List<List<String>> head = new ArrayList<>(); head.add(Arrays.asList("姓名", "性别", "年龄")); writeSheet.setHead(head); ``` 3. 定义要写入的数据,并添加到 `WriteSheet` 对象中。 ```java List<DemoData> data = new ArrayList<>(); data.add(new DemoData("张三", "男", 20)); data.add(new DemoData("李四", "女", 22)); data.add(new DemoData("王五", "男", 25)); writeSheet.setClazz(DemoData.class); EasyExcel.write(fileName).sheet().doWrite(data); ``` 4. 使用 `merge` 方法合并指定的单元格。 ```java // 合并第一中姓名相同的单元格 int firstRow = 1; int lastRow = 1; String lastName = data.get(0).getName(); for (int i = 1; i < data.size(); i++) { if (data.get(i).getName().equals(lastName)) { lastRow++; } else { if (lastRow > firstRow) { writeSheet.merge(firstRow, lastRow, 0, 0); } firstRow = i + 1; lastRow = firstRow; lastName = data.get(i).getName(); } } if (lastRow > firstRow) { writeSheet.merge(firstRow, lastRow, 0, 0); } ``` 上面的代码中,我们首先定义了要合并的单元格的行和的起始和结束位置,然后使用 `merge` 方法将这些单元格合并起来。其中,`merge` 方法接受 4 个参数,分别表示要合并的单元格的行和的起始和结束位置。在本例中,我们将第一中姓名相同的单元格进行了合并
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值