JAVA poi 按模板导出excel数据时列合并问题

问题:按模板导出excel数据时 当最后两行的A列合并不成功;

excel模板:

运输明细表
托运人:{shipperName}承运人:{carrierName}
序号委托单号派车单号发货人地址收货人地址装货时间卸货时间车牌号货物名称装货重量
(吨)
卸货重量
(吨)
费用项目税率
(增)
单价
(元)
结算数量单位金额
(元)
备注
{.rowNum}{.entrustOrderNo}{.dispatchNo}{.consignerAddress}{.receiverAddress}{.loadTime}{.unloadTime}{.vehicleNo}{.goodsName}{.loadCost}{.unloadCost}{.feeType}{.rate}{.price}{.settlementNum}{.unit}{.amount}{.remark}
合计{loadCostTotal}{unloadCostTotal}{amountTotal}


代码示例:

private static void downReceivableStatement() {
        ReceivableStatementDTO receivableStatementDTO = new ReceivableStatementDTO();
        Map<String, Object> sheet2Map = new HashMap<>();
        sheet2Map.put("shipperName", "张三");
        sheet2Map.put("carrierName", "李四");
        sheet2Map.put("loadCostTotal", "123");
        sheet2Map.put("unloadCostTotal", "321");
        sheet2Map.put("amountTotal", "999");
        receivableStatementDTO.setSheet2Map(sheet2Map);
        List<Map<String, Integer>> mergeCellRangeList = new ArrayList<>();
        Map<String, Integer> mergeCellRangeMap = new HashMap<>();
        mergeCellRangeMap.put(ReceivableBillStatementCellWriteHandler.FIRST_ROW, 2);
        mergeCellRangeMap.put(ReceivableBillStatementCellWriteHandler.LAST_ROW, 3);
        mergeCellRangeList.add(mergeCellRangeMap);
        receivableStatementDTO.setMergeCellRangeList(mergeCellRangeList);
        List<ReceivableBillStatementDetailExcelItem> receivableBillStatementDetailList = new ArrayList<>();
        ReceivableBillStatementDetailExcelItem item = new ReceivableBillStatementDetailExcelItem();
        item.setRowNum(1);
        item.setEntrustOrderNo("111");
        item.setDispatchNo("111-1");
        receivableBillStatementDetailList.add(item);
        ReceivableBillStatementDetailExcelItem item1 = new ReceivableBillStatementDetailExcelItem();
        item1.setRowNum(2);
        item1.setEntrustOrderNo("222");
        item1.setDispatchNo("222-2");
        receivableBillStatementDetailList.add(item1);
        ReceivableBillStatementDetailExcelItem item2 = new ReceivableBillStatementDetailExcelItem();
        item2.setRowNum(0);
        item2.setDispatchNo("222");
        receivableBillStatementDetailList.add(item2);
        receivableStatementDTO.setReceivableBillStatementDetailList(receivableBillStatementDetailList);
        //模板文件
        String templateFileName = "receivableStatementTemplate.xlsx";
        String fileName = "receivableStatementTemplate.xlsx";
        String filePath = "D:\\" + fileName;


        OutputStream out = null;
        InputStream inputStreamTemplateFile = null;
        InputStream inputStream = null;
        try {
            out = new FileOutputStream(filePath);
            inputStreamTemplateFile = new FileInputStream("D:\\template\\" + templateFileName);
            ExcelWriter excelWriter = EasyExcel.write(out).withTemplate(inputStreamTemplateFile).build();

            //2-发票明细信息
            ReceivableBillStatementCellWriteHandler writeHandler = new ReceivableBillStatementCellWriteHandler(receivableStatementDTO.getMergeCellRangeList());
            WriteSheet writeSheet2 = EasyExcel.writerSheet("运输明细表").registerWriteHandler(writeHandler).build();

            FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.VERTICAL).forceNewRow(Boolean.TRUE).build();
            excelWriter.fill(receivableStatementDTO.getSheet2Map(), writeSheet2);
            excelWriter.fill(receivableStatementDTO.getReceivableBillStatementDetailList(), fillConfig, writeSheet2);
            excelWriter.finish();
            inputStream = new FileInputStream(filePath);

        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            IoUtil.close(out);
            IoUtil.close(inputStreamTemplateFile);
            IoUtil.close(inputStream);
        }
    }

导出效果(异常):

可见最后两行A列未按要求合并;

分析结果:ExcelWriter.fill 填充数据时要优先填充行数据,再填充其他变量数据,否则会导致上述问题;

解决方法:将填充顺序调整成先填充行数据,再填充变量。如下图

导出效果(正常):

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值