From 39b19ac361b0dfb5e75ce1b225bf0bc1028a0008 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A9=AC=E9=93=83=E8=96=AF=E5=A4=B4?= Date: Wed, 10 Dec 2025 09:22:14 +0000 Subject: [PATCH] =?UTF-8?q?!798=20fix=20=E4=BF=AE=E5=A4=8D=20excel=20?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E5=A4=9A=20sheet=20=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=A0=BC=E5=A4=B1=E6=95=88=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20*=20fix=20=E4=BF=AE=E5=A4=8D=20excel=20=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E5=A4=9A=20sheet=20=E5=90=88=E5=B9=B6=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=A0=BC=E5=A4=B1=E6=95=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/excel/core/CellMergeHandler.java | 4 ++-- .../common/excel/core/CellMergeStrategy.java | 24 ++++++++++--------- 2 files changed, 15 insertions(+), 13 deletions(-) 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); } }