Kaynağa Gözat

!798 fix 修复 excel 导出多 sheet 合并单元格失效问题
* fix 修复 excel 导出多 sheet 合并单元格失效问题

马铃薯头 7 ay önce
ebeveyn
işleme
39b19ac361

+ 2 - 2
ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeHandler.java

@@ -147,12 +147,12 @@ public class CellMergeHandler {
     private boolean isMerge(Object currentRow, Object preRow, CellMerge cellMerge) {
         final String[] mergeBy = cellMerge.mergeBy();
         if (StrUtil.isAllNotBlank(mergeBy)) {
-            //比对当前行和上一行的各个属性值一一比对 如果全为真 则为真
+            // 比对当前行和上一行的各个属性值一一比对 如果全为真 则为真
             for (String fieldName : mergeBy) {
                 final Object valCurrent = ReflectUtil.getFieldValue(currentRow, fieldName);
                 final Object valPre = ReflectUtil.getFieldValue(preRow, fieldName);
                 if (!Objects.equals(valPre, valCurrent)) {
-                    //依赖字段如有任一不等值,则标记为不可合并
+                    // 依赖字段如有任一不等值,则标记为不可合并
                     return false;
                 }
             }

+ 13 - 11
ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java

@@ -2,15 +2,16 @@ package org.dromara.common.excel.core;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.idev.excel.metadata.Head;
-import cn.idev.excel.write.handler.WorkbookWriteHandler;
-import cn.idev.excel.write.handler.context.WorkbookWriteHandlerContext;
+import cn.idev.excel.write.handler.SheetWriteHandler;
 import cn.idev.excel.write.merge.AbstractMergeStrategy;
+import cn.idev.excel.write.metadata.holder.WriteSheetHolder;
+import cn.idev.excel.write.metadata.holder.WriteWorkbookHolder;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.ss.usermodel.Cell;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.apache.poi.ss.util.CellRangeAddress;
 
-import java.util.*;
+import java.util.List;
 
 /**
  * 列值重复合并策略
@@ -18,7 +19,7 @@ import java.util.*;
  * @author Lion Li
  */
 @Slf4j
-public class CellMergeStrategy extends AbstractMergeStrategy implements WorkbookWriteHandler {
+public class CellMergeStrategy extends AbstractMergeStrategy implements SheetWriteHandler {
 
     private final List<CellRangeAddress> cellList;
 
@@ -32,27 +33,28 @@ public class CellMergeStrategy extends AbstractMergeStrategy implements Workbook
 
     @Override
     protected void merge(Sheet sheet, Cell cell, Head head, Integer relativeRowIndex) {
-        if (CollUtil.isEmpty(cellList)){
+        if (CollUtil.isEmpty(cellList)) {
             return;
         }
-        //单元格写入了,遍历合并区域,如果该Cell在区域内,但非首行,则清空
+        // 单元格写入了,遍历合并区域,如果该Cell在区域内,但非首行,则清空
         final int rowIndex = cell.getRowIndex();
         for (CellRangeAddress cellAddresses : cellList) {
             final int firstRow = cellAddresses.getFirstRow();
-            if (cellAddresses.isInRange(cell) && rowIndex != firstRow){
+            if (cellAddresses.isInRange(cell) && rowIndex != firstRow) {
                 cell.setBlank();
             }
         }
     }
 
     @Override
-    public void afterWorkbookDispose(final WorkbookWriteHandlerContext context) {
-        if (CollUtil.isEmpty(cellList)){
+    public void afterSheetCreate(final WriteWorkbookHolder writeWorkbookHolder, final WriteSheetHolder writeSheetHolder) {
+        if (CollUtil.isEmpty(cellList)) {
             return;
         }
-        //当前表格写完后,统一写入
+        // 在 Sheet 创建时提前写入合并区域;后续写入只会影响首格,不会移除合并
+        final Sheet sheet = writeSheetHolder.getSheet();
         for (CellRangeAddress item : cellList) {
-            context.getWriteContext().writeSheetHolder().getSheet().addMergedRegion(item);
+            sheet.addMergedRegion(item);
         }
     }