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 0000000000000000000000000000000000000000..05acf6c514431f2b6e5c4bf771132c49eddf4da0 --- /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); + } + } + + } + +} + 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 2813cc287f4a273bfaeca4dc4383b55faa083c00..4ee0b5214bc88f307d7276eff32b83bf125757f9 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();