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