From fbd31387721424c65b173cbb23b03202f3e7dce6 Mon Sep 17 00:00:00 2001 From: zhoushihao <zsh19950802@163.com> Date: 星期一, 12 五月 2025 21:13:47 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- hangzhoumesParent/common/servicebase/src/main/java/com/mes/utils/excel/ExcelMergeStrategy.java | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 118 insertions(+), 0 deletions(-) diff --git a/hangzhoumesParent/common/servicebase/src/main/java/com/mes/utils/excel/ExcelMergeStrategy.java b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/utils/excel/ExcelMergeStrategy.java new file mode 100644 index 0000000..dab4d9f --- /dev/null +++ b/hangzhoumesParent/common/servicebase/src/main/java/com/mes/utils/excel/ExcelMergeStrategy.java @@ -0,0 +1,118 @@ +package com.mes.utils.excel; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.write.handler.RowWriteHandler; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.holder.WriteTableHolder; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.util.CellRangeAddress; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +/** + * @Author : zhoush + * @Date: 2025/5/12 16:55 + * @Description: + */ +public class ExcelMergeStrategy implements RowWriteHandler { + + /** + * 涓婚敭涓嬫爣 + */ + private Integer primaryKeyIndex; + + /** + * 闇�瑕佸悎骞剁殑鍒楃殑涓嬫爣闆嗗悎 + */ + private final List<Integer> mergeColumnIndexList = new ArrayList<>(); + + /** + * 鏁版嵁绫诲瀷 + */ + private final Class<?> elementType; + + public ExcelMergeStrategy(Class<?> elementType) { + this.elementType = elementType; + } + + @Override + public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) { + // 鍒ゆ柇鏄惁涓烘爣棰� + if (isHead) { + return; + } + // 鑾峰彇褰撳墠宸ヤ綔琛� + Sheet sheet = writeSheetHolder.getSheet(); + // 鍒濆鍖栦富閿笅鏍囧拰闇�瑕佸悎骞跺瓧娈电殑涓嬫爣 + if (primaryKeyIndex == null) { + this.initPrimaryIndexAndMergeIndex(writeSheetHolder); + } + // 鍒ゆ柇鏄惁闇�瑕佸拰涓婁竴琛岃繘琛屽悎骞� + // 涓嶈兘鍜屾爣棰樺悎骞讹紝鍙兘鏁版嵁琛屼箣闂村悎骞� + if (row.getRowNum() <= 1) { + return; + } + // 鑾峰彇涓婁竴琛屾暟鎹� + Row lastRow = sheet.getRow(row.getRowNum() - 1); + // 灏嗘湰琛屽拰涓婁竴琛屾槸鍚屼竴绫诲瀷鐨勬暟鎹紙閫氳繃涓婚敭瀛楁杩涜鍒ゆ柇锛夛紝鍒欓渶瑕佸悎骞� + if (lastRow.getCell(primaryKeyIndex).getStringCellValue().equalsIgnoreCase(row.getCell(primaryKeyIndex).getStringCellValue())) { + for (Integer mergeIndex : mergeColumnIndexList) { + CellRangeAddress cellRangeAddress = new CellRangeAddress(row.getRowNum() - 1, row.getRowNum(), mergeIndex, mergeIndex); + sheet.addMergedRegionUnsafe(cellRangeAddress); + } + } + } + + /** + * 鍒濆鍖栦富閿笅鏍囧拰闇�瑕佸悎骞跺瓧娈电殑涓嬫爣 + * + * @param writeSheetHolder WriteSheetHolder + */ + private void initPrimaryIndexAndMergeIndex(WriteSheetHolder writeSheetHolder) { + // 鑾峰彇褰撳墠宸ヤ綔琛� + Sheet sheet = writeSheetHolder.getSheet(); + // 鑾峰彇鏍囬琛� + Row titleRow = sheet.getRow(0); + // 鑾峰彇鎵�鏈夊睘鎬у瓧娈� + Field[] fields = this.elementType.getDeclaredFields(); + // 閬嶅巻鎵�鏈夊瓧娈� + for (Field field : fields) { + // 鑾峰彇@ExcelProperty娉ㄨВ锛岀敤浜庤幏鍙栬瀛楁瀵瑰簲鍒楃殑涓嬫爣 + ExcelProperty excelProperty = field.getAnnotation(ExcelProperty.class); + // 鍒ゆ柇鏄惁涓虹┖ + if (null == excelProperty) { + continue; + } + // 鑾峰彇鑷畾涔夋敞瑙o紝鐢ㄤ簬鍚堝苟鍗曞厓鏍� + ExcelMerge excelMerge = field.getAnnotation(ExcelMerge.class); + // 鍒ゆ柇鏄惁闇�瑕佸悎骞� + if (null == excelMerge) { + continue; + } + for (int i = 0; i < fields.length; i++) { + Cell cell = titleRow.getCell(i); + if (null == cell) { + continue; + } + // 灏嗗瓧娈靛拰琛ㄥご鍖归厤涓� + if (excelProperty.value()[0].equalsIgnoreCase(cell.getStringCellValue())) { + if (excelMerge.isPrimaryKey()) { + primaryKeyIndex = i; + } + if (excelMerge.merge()) { + mergeColumnIndexList.add(i); + } + } + } + } + + // 娌℃湁鎸囧畾涓婚敭锛屽垯寮傚父 + if (null == this.primaryKeyIndex) { + throw new IllegalStateException("浣跨敤@ExcelMerge娉ㄨВ蹇呴』鎸囧畾涓婚敭"); + } + } +} -- Gitblit v1.8.0