Explorar el Código

feat:
导出时自动合并单元格

18339543638 hace 2 años
padre
commit
5ac74f3208

+ 32 - 8
tr-modules/tr-module-export/src/main/java/cn/tr/module/excel/core/handler/write/CustomCellWriteHandler.java

@@ -2,6 +2,7 @@ package cn.tr.module.excel.core.handler.write;
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.*;
+import cn.hutool.poi.excel.ExcelUtil;
 import cn.tr.module.export.annotation.ExcelCellMerge;
 import cn.tr.module.export.annotation.ExcelSelect;
 import cn.tr.module.export.annotation.ExcelPropertySupport;
@@ -48,9 +49,9 @@ public class CustomCellWriteHandler implements CellWriteHandler {
     public void afterCellDispose(CellWriteHandlerContext context) {
         Cell cell = context.getCell();
         boolean head = Boolean.TRUE.equals(context.getHead());
+        Field field = context.getExcelContentProperty().getField();
         //冻结表头
         if(head){
-            Field field = context.getExcelContentProperty().getField();
             markNotNull(field,cell);
             //进行数字校验
             createNumColumn(field,cell);
@@ -62,7 +63,7 @@ public class CustomCellWriteHandler implements CellWriteHandler {
         }else {
 
             //合并单元格
-
+            mergeCell(field,cell);
         }
     }
 
@@ -79,10 +80,6 @@ public class CustomCellWriteHandler implements CellWriteHandler {
             return;
         }
         int rowIndex = cell.getRowIndex();
-        //不与头部合并
-        if(rowIndex==2){
-            return;
-        }
         Row row = sheet.getRow(rowIndex - 1);
         Cell rowCell = row.getCell(cell.getColumnIndex());
         String lastCellValue = rowCell.getStringCellValue();
@@ -90,8 +87,35 @@ public class CustomCellWriteHandler implements CellWriteHandler {
             return;
         }
         if(StrUtil.equals(lastCellValue,cellValue)){
-            //单元格值相同,进行合并操作
-            sheet.addMergedRegion(new CellRangeAddress(rowIndex-1,rowIndex,cell.getColumnIndex(),cell.getColumnIndex()));
+            List<CellRangeAddress> mergedRegions = sheet.getMergedRegions();
+            if(CollectionUtil.isNotEmpty(mergedRegions)){
+                //修改原有的合并记录
+                CellRangeAddress exist=null;
+                for (int i = 0; i < CollectionUtil.size(mergedRegions); i++) {
+                    CellRangeAddress cellRangeAddress = mergedRegions.get(i);
+                    if(ObjectUtil.equals(cellRangeAddress.getFirstColumn(),cell.getColumnIndex())&&ObjectUtil.equals(cellRangeAddress.getLastRow(),rowIndex-1)){
+                        exist=cellRangeAddress;
+                        break;
+                    }
+                }
+                if(exist!=null){
+                    exist.setLastColumn(cell.getColumnIndex());
+                }else {
+                    sheet.addMergedRegion(new CellRangeAddress(rowIndex-1,rowIndex,cell.getColumnIndex(),cell.getColumnIndex()));
+                }
+            }else {
+                //单元格值相同,进行合并操作
+                sheet.addMergedRegion(new CellRangeAddress(rowIndex-1,rowIndex,cell.getColumnIndex(),cell.getColumnIndex()));
+            }
+            //查看原有单元格是否已合并
+            CellRangeAddress oldRange = rowCell.getArrayFormulaRange();
+            if(oldRange==null){
+
+
+            }else {
+                oldRange.setLastRow(rowIndex);
+            }
+
         }
 
     }