forked from rongchao/epmet-cloud-rizhao
				
			
				 2 changed files with 110 additions and 3 deletions
			
			
		@ -0,0 +1,106 @@ | 
				
			|||||
 | 
					package com.epmet.commons.tools.utils.poi.excel.handler; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					import com.alibaba.excel.write.handler.RowWriteHandler; | 
				
			||||
 | 
					import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; | 
				
			||||
 | 
					import com.alibaba.excel.write.metadata.holder.WriteTableHolder; | 
				
			||||
 | 
					import lombok.extern.slf4j.Slf4j; | 
				
			||||
 | 
					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; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					/** | 
				
			||||
 | 
					 * desc:按行对单元格合并策略 依据是第一列的值 | 
				
			||||
 | 
					 * | 
				
			||||
 | 
					 * @author liujianjun | 
				
			||||
 | 
					 */ | 
				
			||||
 | 
					@Slf4j | 
				
			||||
 | 
					public class ExcelFillRowMergeStrategy implements RowWriteHandler { | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    /** | 
				
			||||
 | 
					     * 需要合并的列 下标 | 
				
			||||
 | 
					     */ | 
				
			||||
 | 
					    private int[] mergeColumnIndexArr; | 
				
			||||
 | 
					    /** | 
				
			||||
 | 
					     * 从下标n行开始合并 | 
				
			||||
 | 
					     */ | 
				
			||||
 | 
					    private int mergeRowIndex; | 
				
			||||
 | 
					    /** | 
				
			||||
 | 
					     * 默认隐藏第一列 用于合并数据 | 
				
			||||
 | 
					     */ | 
				
			||||
 | 
					    private boolean hiddenFirst = true; | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    public ExcelFillRowMergeStrategy(int mergeRowIndex, int[] mergeColumnIndexArr) { | 
				
			||||
 | 
					        this.mergeRowIndex = mergeRowIndex; | 
				
			||||
 | 
					        this.mergeColumnIndexArr = mergeColumnIndexArr; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    public ExcelFillRowMergeStrategy(int mergeRowIndex, int[] mergeColumnIndexArr, boolean hiddenFirst) { | 
				
			||||
 | 
					        this.mergeRowIndex = mergeRowIndex; | 
				
			||||
 | 
					        this.mergeColumnIndexArr = mergeColumnIndexArr; | 
				
			||||
 | 
					        this.hiddenFirst = hiddenFirst; | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @Override | 
				
			||||
 | 
					    public void beforeRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Integer rowIndex, Integer relativeRowIndex, Boolean isHead) { | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @Override | 
				
			||||
 | 
					    public void afterRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) { | 
				
			||||
 | 
					        // 隐藏id列
 | 
				
			||||
 | 
					        if (hiddenFirst) { | 
				
			||||
 | 
					            writeSheetHolder.getSheet().setColumnHidden(0, true); | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @Override | 
				
			||||
 | 
					    public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) { | 
				
			||||
 | 
					        //当前行索引
 | 
				
			||||
 | 
					        int curRowNum = row.getRowNum(); | 
				
			||||
 | 
					        if (mergeColumnIndexArr != null && mergeColumnIndexArr.length > 0 && !isHead) { | 
				
			||||
 | 
					            //当前行第一列单元格
 | 
				
			||||
 | 
					            Cell curA1Cell = row.getCell(0); | 
				
			||||
 | 
					            Object curA1Data = curA1Cell.getCellType() == CellType.STRING ? curA1Cell.getStringCellValue() : curA1Cell.getNumericCellValue(); | 
				
			||||
 | 
					            //上一行第一列单元格
 | 
				
			||||
 | 
					            Cell preA1Cell = row.getSheet().getRow(curRowNum - 1).getCell(0); | 
				
			||||
 | 
					            Object preA1Data = preA1Cell.getCellType() == CellType.STRING ? preA1Cell.getStringCellValue() : preA1Cell.getNumericCellValue(); | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					            if (curA1Data.equals(preA1Data)) { | 
				
			||||
 | 
					                for (int value : mergeColumnIndexArr) { | 
				
			||||
 | 
					                    mergeSameRow(writeSheetHolder, curRowNum, value); | 
				
			||||
 | 
					                } | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    private void mergeSameRow(WriteSheetHolder writeSheetHolder, int curRowIndex, int curColIndex) { | 
				
			||||
 | 
					        Sheet sheet = writeSheetHolder.getSheet(); | 
				
			||||
 | 
					        List<CellRangeAddress> mergeRegions = sheet.getMergedRegions(); | 
				
			||||
 | 
					        boolean isMerged = false; | 
				
			||||
 | 
					        for (int i = 0; i < mergeRegions.size() && !isMerged; i++) { | 
				
			||||
 | 
					            CellRangeAddress cellRangeAddr = mergeRegions.get(i); | 
				
			||||
 | 
					            // 若上一个单元格已经被合并,则先移出原有的合并单元,再重新添加合并单元
 | 
				
			||||
 | 
					            if (cellRangeAddr.isInRange(curRowIndex - 1, curColIndex)) { | 
				
			||||
 | 
					                sheet.removeMergedRegion(i); | 
				
			||||
 | 
					                cellRangeAddr.setLastRow(curRowIndex); | 
				
			||||
 | 
					                sheet.addMergedRegionUnsafe(cellRangeAddr); | 
				
			||||
 | 
					                isMerged = true; | 
				
			||||
 | 
					            } | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					        // 若上一个单元格未被合并,则新增合并单元
 | 
				
			||||
 | 
					        if (!isMerged) { | 
				
			||||
 | 
					            CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex, curColIndex); | 
				
			||||
 | 
					            sheet.addMergedRegionUnsafe(cellRangeAddress); | 
				
			||||
 | 
					        } | 
				
			||||
 | 
					    } | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue