From 03798ad81d5720b9c32173b4566e5df1cabb3197 Mon Sep 17 00:00:00 2001 From: "han\\hanst" Date: Fri, 5 Dec 2025 09:15:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E7=AE=B1=E5=90=88=E5=B9=B6=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xujie/sys/common/utils/ExcelTemplate.java | 44 +++++++++++++++++++ .../ecss/service/impl/CoDelServiceImpl.java | 29 +++++++----- 2 files changed, 61 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/xujie/sys/common/utils/ExcelTemplate.java b/src/main/java/com/xujie/sys/common/utils/ExcelTemplate.java index 24260eab..183db426 100644 --- a/src/main/java/com/xujie/sys/common/utils/ExcelTemplate.java +++ b/src/main/java/com/xujie/sys/common/utils/ExcelTemplate.java @@ -5,6 +5,8 @@ import org.apache.poi.ooxml.POIXMLDocumentPart; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; + import java.io.IOException; import java.io.InputStream; import java.util.*; @@ -19,6 +21,8 @@ public class ExcelTemplate { private XSSFWorkbook workbook; private Map variables = new HashMap<>(); private List> listVariables = new ArrayList<>(); + // 存储需要合并的单元格区域信息:[列表起始索引, 列表结束索引, 列索引] + private List mergeRegions = new ArrayList<>(); // 是否下移形状格式 @Setter private boolean moveShape = false; @@ -74,9 +78,22 @@ public class ExcelTemplate { listVariables.addAll(rows); } + /** + * 添加需要合并的单元格区域(基于列表索引) + * @param startListIndex 列表起始索引(相对于listVariables) + * @param endListIndex 列表结束索引(相对于listVariables) + * @param colIndex 列索引 + */ + public void addMergeRegion(int startListIndex, int endListIndex, int colIndex) { + if (startListIndex < endListIndex) { + mergeRegions.add(new int[]{startListIndex, endListIndex, colIndex}); + } + } + public void clearAll(){ variables.clear(); listVariables.clear(); + mergeRegions.clear(); moveShape = false; moveSeal = false; cellStyle = false; @@ -516,6 +533,33 @@ public class ExcelTemplate { } } } + + // 处理合并单元格 - 将列表索引转换为实际行号并合并 + if (dtlRowIndex >= 0 && !mergeRegions.isEmpty()) { + for (int[] region : mergeRegions) { + int startRow = dtlRowIndex + region[0]; + int endRow = dtlRowIndex + region[1]; + int col = region[2]; + + // 添加合并区域 + CellRangeAddress mergeRange = new CellRangeAddress(startRow, endRow, col, col); + sheet.addMergedRegion(mergeRange); + + // 设置合并区域内第一个单元格的样式为垂直居中 + XSSFRow row = sheet.getRow(startRow); + if (row != null) { + XSSFCell cell = row.getCell(col); + if (cell != null) { + XSSFCellStyle mergeStyle = workbook.createCellStyle(); + mergeStyle.cloneStyleFrom(cell.getCellStyle()); + mergeStyle.setVerticalAlignment(VerticalAlignment.CENTER); + mergeStyle.setAlignment(HorizontalAlignment.RIGHT); + cell.setCellStyle(mergeStyle); + } + } + } + } + return workbook; } } diff --git a/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelServiceImpl.java b/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelServiceImpl.java index 976c2dfa..4d1eb560 100644 --- a/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelServiceImpl.java +++ b/src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelServiceImpl.java @@ -3138,14 +3138,8 @@ public class CoDelServiceImpl implements CoDelService { for (int m = 0; m < list.size(); m++) { boxData.setSeqNo(Integer.valueOf(list.get(m).get("item_no")!=null?list.get(m).get("item_no").toString():"")); List checkList = coDelMapper.selectPalletDetailList(boxData); - int middleIndex; - if (checkList.size() == 1) { - middleIndex = 0; // 第一行 - } else if (checkList.size() == 2) { - middleIndex = 0; // 特殊:两行时也是第一行 - } else { - middleIndex = checkList.size() / 2; // 其他情况按规则 - } + // 记录当前箱子对应的exportList起始索引 + int boxStartIndex = exportList.size(); for (int i = 0; i < checkList.size(); i++) { Map eorder = checkList.get(i); String partNo = (String) eorder.get("part_no"); @@ -3153,10 +3147,11 @@ public class CoDelServiceImpl implements CoDelService { totalQty = totalQty + qty; BigDecimal noCartons = list.get(m).get("box_qty")!=null?(BigDecimal) list.get(m).get("box_qty"):BigDecimal.ZERO; eorder.put("total_qty", ((BigDecimal)eorder.get("qty")).setScale(0, RoundingMode.HALF_UP).intValue()); - boolean isMiddleRow = (i == middleIndex); - eorder.put("noCartons", isMiddleRow ? noCartons.setScale(0, RoundingMode.HALF_UP) : ""); - eorder.put("gross_weight", isMiddleRow ? ((BigDecimal) list.get(m).get("gross_weight")).setScale(2, RoundingMode.HALF_UP) : ""); - eorder.put("net_weight", isMiddleRow ? ((BigDecimal) list.get(m).get("net_weight")).setScale(2, RoundingMode.HALF_UP) : ""); + // 合箱时:第一行显示数值,用于合并单元格居中显示 + boolean isFirstRow = (i == 0); + eorder.put("noCartons", isFirstRow ? noCartons.setScale(0, RoundingMode.HALF_UP) : ""); + eorder.put("gross_weight", isFirstRow ? ((BigDecimal) list.get(m).get("gross_weight")).setScale(2, RoundingMode.HALF_UP) : ""); + eorder.put("net_weight", isFirstRow ? ((BigDecimal) list.get(m).get("net_weight")).setScale(2, RoundingMode.HALF_UP) : ""); BigDecimal cuRolls = eorder.get("rolls") !=null?((BigDecimal)eorder.get("rolls")).setScale(0, RoundingMode.HALF_UP):BigDecimal.valueOf(0.0); eorder.put("rolls", cuRolls); rolls = rolls.add(cuRolls); @@ -3185,6 +3180,16 @@ public class CoDelServiceImpl implements CoDelService { + (data.getSo()!=null && data.getSo()?"\n" + "SO:"+eorder.get("so"):"")); exportList.add(eorder); } + // 如果当前箱子对应多个物料(合箱),添加合并单元格区域 + int boxEndIndex = exportList.size() - 1; + if (checkList.size() > 1) { + // 合并箱数列(第4列,索引4) + template.addMergeRegion(boxStartIndex, boxEndIndex, 4); + // 合并净重列(第6列,索引6) + template.addMergeRegion(boxStartIndex, boxEndIndex, 6); + // 合并毛重列(第7列,索引7) + template.addMergeRegion(boxStartIndex, boxEndIndex, 7); + } totalCartons = totalCartons.add(list.get(m).get("box_qty") !=null? new BigDecimal(list.get(m).get("box_qty").toString()) : BigDecimal.valueOf(0.0)); grossWeight = grossWeight.add(list.get(m).get("gross_weight") !=null?new BigDecimal(list.get(m).get("gross_weight").toString()):BigDecimal.valueOf(0.0)); netWeight = netWeight.add(list.get(m).get("net_weight") !=null?new BigDecimal(list.get(m).get("net_weight").toString()):BigDecimal.valueOf(0.0));