diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeHandler.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeHandler.java index 204a88e25..1a0601479 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeHandler.java +++ b/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; } } diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java index 34bf4a42f..5576c6383 100644 --- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/core/CellMergeStrategy.java +++ b/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 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); } }