问题:按模板导出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 填充数据时要优先填充行数据,再填充其他变量数据,否则会导致上述问题;
解决方法:将填充顺序调整成先填充行数据,再填充变量。如下图
导出效果(正常):