• easyExcel自动合并单元格


    来源EasyExcel(根据条件动态合并单元格的重复数据)

    package com.ustcinfo.fn.comp.complain.util;
    
    import com.alibaba.excel.metadata.CellData;
    import com.alibaba.excel.metadata.Head;
    import com.alibaba.excel.write.handler.CellWriteHandler;
    import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
    import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
    import lombok.Data;
    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 Jamin
     * @date 2020/11/9 11:35
     */
    @Data
    public class ExcelFillCellMergeStrategy implements CellWriteHandler {
    	/**
    	 * 合并字段的下标
    	 */
    	private int[] mergeColumnIndex;
    	/**
    	 * 合并几行
    	 */
    	private int mergeRowIndex;
    
    	public ExcelFillCellMergeStrategy() {
    	}
    
    	public ExcelFillCellMergeStrategy(int mergeRowIndex, int[] mergeColumnIndex) {
    		this.mergeRowIndex = mergeRowIndex;
    		this.mergeColumnIndex = mergeColumnIndex;
    	}
    
    	@Override
    	public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,
    	                             Head head, Integer integer, Integer integer1, Boolean aBoolean) {
    
    	}
    
    	@Override
    	public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell,
    	                            Head head, Integer integer, Boolean aBoolean) {
    
    	}
    
    	@Override
    	public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
    	                                   CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) {
    
    	}
    
    	@Override
    	public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder,
    	                             List<CellData> list, Cell cell, Head head, Integer integer, Boolean aBoolean) {
    //当前行
    		int curRowIndex = cell.getRowIndex();
    		//当前列
    		int curColIndex = cell.getColumnIndex();
    
    		if (curRowIndex > mergeRowIndex) {
    			for (int i = 0; i < mergeColumnIndex.length; i++) {
    				if (curColIndex == mergeColumnIndex[i]) {
    					mergeWithPrevRow(writeSheetHolder, cell, curRowIndex, curColIndex);
    					break;
    				}
    			}
    		}
    	}
    
    	private void mergeWithPrevRow(WriteSheetHolder writeSheetHolder, Cell cell, int curRowIndex, int curColIndex) {
    		//获取当前行的当前列的数据和上一行的当前列列数据,通过上一行数据是否相同进行合并
    		Object curData = cell.getCellTypeEnum() == CellType.STRING ? cell.getStringCellValue() :
    				cell.getNumericCellValue();
    		Cell preCell = cell.getSheet().getRow(curRowIndex - 1).getCell(curColIndex);
    		Object preData = preCell.getCellTypeEnum() == CellType.STRING ? preCell.getStringCellValue() :
    				preCell.getNumericCellValue();
    		// 比较当前行的第一列的单元格与上一行是否相同,相同合并当前单元格与上一行
    		//
    		if (curData.equals(preData)) {
    			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.addMergedRegion(cellRangeAddr);
    					isMerged = true;
    				}
    			}
    			// 若上一个单元格未被合并,则新增合并单元
    			if (!isMerged) {
    				CellRangeAddress cellRangeAddress = new CellRangeAddress(curRowIndex - 1, curRowIndex, curColIndex,
    						curColIndex);
    				sheet.addMergedRegion(cellRangeAddress);
    			}
    		}
    	}
    }
    
    //使用
    .registerWriteHandler(new ExcelFillCellMergeStrategy([从第几行开始],[合并哪几列]))
    
    作者: JaminYe
    版权声明:本文原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
  • 相关阅读:
    第二次Soring冲刺计划第四天(团队)
    第二次Soring冲刺计划第四天(个人)
    第二次Soring冲刺计划第三天(团队)
    第二次Soring冲刺计划第三天(个人)
    第二次Soring冲刺计划第二天(团队)
    第二次Soring冲刺计划第二天(个人)
    第二次Soring冲刺计划第一天(个人)
    2018.12.6
    2108.12.5
    2018.12.4
  • 原文地址:https://www.cnblogs.com/JaminYe/p/13976861.html
Copyright © 2020-2023  润新知