From fc935b71ee86afc261e4774bb153399567fa6f05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8F=8F=E8=BF=B0=E4=B8=8D=E7=AC=A6?= <826801306@qq.com> Date: Tue, 25 Nov 2025 07:01:37 +0000 Subject: [PATCH 1/2] =?UTF-8?q?=E4=B8=80=E5=AF=B9=E5=A4=9A=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=90=88=E5=B9=B6=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 描述不符 <826801306@qq.com> --- .../excel/handler/OneToManyMergeStrategy.java | 127 ++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/OneToManyMergeStrategy.java diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/OneToManyMergeStrategy.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/OneToManyMergeStrategy.java new file mode 100644 index 000000000..05acf6c51 --- /dev/null +++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/handler/OneToManyMergeStrategy.java @@ -0,0 +1,127 @@ +package org.dromara.common.excel.handler; + +import cn.hutool.core.util.ObjectUtil; +import cn.idev.excel.metadata.Head; +import cn.idev.excel.metadata.data.WriteCellData; +import cn.idev.excel.write.handler.CellWriteHandler; +import cn.idev.excel.write.handler.context.CellWriteHandlerContext; +import cn.idev.excel.write.metadata.holder.WriteSheetHolder; +import cn.idev.excel.write.metadata.holder.WriteTableHolder; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.util.CellRangeAddress; + +import java.util.List; + +/** + * 一对多数据合并策略 + * @author 描述不符 + */ +public class OneToManyMergeStrategy implements CellWriteHandler { + + /** + * 判断是否合并的字段 + */ + private String mergeFieldName; + + /** + * 待合并列index + */ + private List mergeColumnIndexList; + + + public OneToManyMergeStrategy(String mergeFieldName, List mergeColumnIndexList) { + this.mergeFieldName = mergeFieldName; + this.mergeColumnIndexList = mergeColumnIndexList; + } + + @Override + public void beforeCellCreate(CellWriteHandlerContext context) { + CellWriteHandler.super.beforeCellCreate(context); + } + + @Override + public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) { + CellWriteHandler.super.beforeCellCreate(writeSheetHolder, writeTableHolder, row, head, columnIndex, relativeRowIndex, isHead); + } + + @Override + public void afterCellCreate(CellWriteHandlerContext context) { + CellWriteHandler.super.afterCellCreate(context); + } + + @Override + public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { + CellWriteHandler.super.afterCellCreate(writeSheetHolder, writeTableHolder, cell, head, relativeRowIndex, isHead); + } + + @Override + public void afterCellDataConverted(CellWriteHandlerContext context) { + CellWriteHandler.super.afterCellDataConverted(context); + } + + @Override + public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, WriteCellData cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { + CellWriteHandler.super.afterCellDataConverted(writeSheetHolder, writeTableHolder, cellData, cell, head, relativeRowIndex, isHead); + } + + @Override + public void afterCellDispose(CellWriteHandlerContext context) { + CellWriteHandler.super.afterCellDispose(context); + } + + @Override + public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) { + if(isHead) return; + if(ObjectUtil.isNull(relativeRowIndex) || relativeRowIndex == 0) return; + + if(!this.mergeFieldName.equals(head.getFieldName())) return; + + Sheet sheet = cell.getSheet(); + int rowIndexCurrent = cell.getRowIndex(); + int rowIndexPrev = rowIndexCurrent - 1; + Row rowPrev = sheet.getRow(rowIndexPrev); + Cell cellPrev = rowPrev.getCell(cell.getColumnIndex()); + + Object cellValueCurrent = cell.getCellType() == CellType.STRING? cell.getStringCellValue() : cell.getNumericCellValue(); + Object cellValuePrev = cellPrev.getCellType() == CellType.STRING? cellPrev.getStringCellValue() : cellPrev.getNumericCellValue(); + + if(!cellValueCurrent.equals(cellValuePrev)) return; + List mergedRegions = sheet.getMergedRegions(); + boolean isMerged = false; + for (int i = 0; i < mergedRegions.size(); i++) { + CellRangeAddress cellRangeAddress = mergedRegions.get(i); + for (int k = 0; k < mergeColumnIndexList.size(); k++) { + if(cellRangeAddress.isInRange(rowIndexPrev, mergeColumnIndexList.get(k))){ + sheet.removeMergedRegion(i); + cellRangeAddress.setLastRow(rowIndexCurrent); + sheet.addMergedRegion(cellRangeAddress); + isMerged = true; + } + + } +// for(int j = this.columnIndexStart; j <= columnIndexEnd; j++){ +// if(cellRangeAddress.isInRange(rowIndexPrev, j)){ +// sheet.removeMergedRegion(i); +// cellRangeAddress.setLastRow(rowIndexCurrent); +// sheet.addMergedRegion(cellRangeAddress); +// isMerged = true; +// } +// +// } + + } + + if(!isMerged) { + for (int k = 0; k < mergeColumnIndexList.size(); k++) { + CellRangeAddress cellRangeAddress = new CellRangeAddress(rowIndexPrev, rowIndexCurrent, mergeColumnIndexList.get(k), mergeColumnIndexList.get(k)); + sheet.addMergedRegion(cellRangeAddress); + } + } + + } + +} + -- Gitee From ed8fb611795c6a39f7798d2d31ff508c6574d36b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8F=8F=E8=BF=B0=E4=B8=8D=E7=AC=A6?= <826801306@qq.com> Date: Tue, 25 Nov 2025 07:04:06 +0000 Subject: [PATCH 2/2] =?UTF-8?q?update=20=E5=A2=9E=E5=8A=A0=E4=B8=80?= =?UTF-8?q?=E5=AF=B9=E5=A4=9A=E5=AF=BC=E5=87=BA=E7=AD=96=E7=95=A5demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 描述不符 <826801306@qq.com> --- .../org/dromara/demo/service/impl/ExportExcelServiceImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java index 2813cc287..4ee0b5214 100644 --- a/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java +++ b/ruoyi-modules/ruoyi-demo/src/main/java/org/dromara/demo/service/impl/ExportExcelServiceImpl.java @@ -260,12 +260,14 @@ public class ExportExcelServiceImpl implements IExportExcelService { everyRowData.setCityId(i); everyRowData.setAreaId(i); excelDataList.add(everyRowData); + // excelDataList.add(everyRowData); } // 创建表格 WriteSheet sheet = ExcelWriterWrapper.sheetBuilder("自定义导出demo") // 合并单元格 // .registerWriteHandler(new CellMergeStrategy(excelDataList, true)) + // .registerWriteHandler(new OneToManyMergeStrategy("nickName", List.of(0, 1))) .build(); -- Gitee