Browse Source

合箱合并单元格

java8
han\hanst 1 month ago
parent
commit
03798ad81d
  1. 44
      src/main/java/com/xujie/sys/common/utils/ExcelTemplate.java
  2. 29
      src/main/java/com/xujie/sys/modules/ecss/service/impl/CoDelServiceImpl.java

44
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.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*; import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.*; import java.util.*;
@ -19,6 +21,8 @@ public class ExcelTemplate {
private XSSFWorkbook workbook; private XSSFWorkbook workbook;
private Map<String, Object> variables = new HashMap<>(); private Map<String, Object> variables = new HashMap<>();
private List<Map<String, Object>> listVariables = new ArrayList<>(); private List<Map<String, Object>> listVariables = new ArrayList<>();
// 存储需要合并的单元格区域信息[列表起始索引, 列表结束索引, 列索引]
private List<int[]> mergeRegions = new ArrayList<>();
// 是否下移形状格式 // 是否下移形状格式
@Setter @Setter
private boolean moveShape = false; private boolean moveShape = false;
@ -74,9 +78,22 @@ public class ExcelTemplate {
listVariables.addAll(rows); 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(){ public void clearAll(){
variables.clear(); variables.clear();
listVariables.clear(); listVariables.clear();
mergeRegions.clear();
moveShape = false; moveShape = false;
moveSeal = false; moveSeal = false;
cellStyle = 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; return workbook;
} }
} }

29
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++) { 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():"")); boxData.setSeqNo(Integer.valueOf(list.get(m).get("item_no")!=null?list.get(m).get("item_no").toString():""));
List<Map> checkList = coDelMapper.selectPalletDetailList(boxData); List<Map> 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++) { for (int i = 0; i < checkList.size(); i++) {
Map eorder = checkList.get(i); Map eorder = checkList.get(i);
String partNo = (String) eorder.get("part_no"); String partNo = (String) eorder.get("part_no");
@ -3153,10 +3147,11 @@ public class CoDelServiceImpl implements CoDelService {
totalQty = totalQty + qty; totalQty = totalQty + qty;
BigDecimal noCartons = list.get(m).get("box_qty")!=null?(BigDecimal) list.get(m).get("box_qty"):BigDecimal.ZERO; 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()); 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); BigDecimal cuRolls = eorder.get("rolls") !=null?((BigDecimal)eorder.get("rolls")).setScale(0, RoundingMode.HALF_UP):BigDecimal.valueOf(0.0);
eorder.put("rolls", cuRolls); eorder.put("rolls", cuRolls);
rolls = rolls.add(cuRolls); rolls = rolls.add(cuRolls);
@ -3185,6 +3180,16 @@ public class CoDelServiceImpl implements CoDelService {
+ (data.getSo()!=null && data.getSo()?"\n" + "SO:"+eorder.get("so"):"")); + (data.getSo()!=null && data.getSo()?"\n" + "SO:"+eorder.get("so"):""));
exportList.add(eorder); 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)); 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)); 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)); netWeight = netWeight.add(list.get(m).get("net_weight") !=null?new BigDecimal(list.get(m).get("net_weight").toString()):BigDecimal.valueOf(0.0));

Loading…
Cancel
Save