开发中遇到需求:1、查询一组单元格是否是一个合并单元格 2、判断指定的单元格是否属于合并单元格区域
之前用了POI的原生方法,但是excel太大,频繁的循环导致时间花费太长,因此打算改用easyExcel看看时间会不会少点。上网看了一下,easyExcel没有直接判断合并的方法,需要自己写。
以下是我写的方法:
1 public static class CellPosition { 2 int row; 3 int column; 4 5 public CellPosition(int row, int column) { 6 this.row = row; 7 this.column = column; 8 } 9 10 public int getRow() { 11 return row; 12 } 13 14 public int getColumn() { 15 return column; 16 } 17 } 18 19 /* 20 * @description:查询一组单元格是否是一个合并单元格 21 * @author: * 22 * @date: 2024/6/7 13:38 23 * @param: [cellPositions 要查询的一组单元格地址(必须两个及以上), mergedList 所有合并单元格] 24 * @return: boolean 是一个合并单元格返回true 否则返回false 25 **/ 26 public boolean areCellsMergedIntoOne(List<CellPosition> cellPositions, List<CellExtra> mergedList){ 27 boolean isMergerd = false; 28 CellExtra tmp = null; 29 for(CellPosition cellPosition:cellPositions){ 30 if(tmp!=null){ 31 if(!isInRange(tmp, cellPosition.getRow()-1, cellPosition.getColumn())){ 32 isMergerd = false; 33 break; 34 } 35 }else{ 36 for(CellExtra cellExtra:mergedList){ 37 isMergerd = isInRange(cellExtra, cellPosition.getRow()-1, cellPosition.getColumn()); 38 if(isMergerd){ 39 //查询到合并单元格,赋值给tmp,下次查询无需循环 40 isMergerd=true; 41 tmp = cellExtra; 42 break; 43 } 44 } 45 //第一轮寻找下来如果tmp为空,代表查询的单元格不是一个合并单元格,直接返回 46 if(tmp==null) { 47 isMergerd = false; 48 break; 49 } 50 } 51 } 52 if(isMergerd) 53 return true; 54 else 55 return false; 56 } 57 /** 58 * 判断指定的单元格是否属于合并单元格区域。 59 * 60 * @param cellExtras 所有合并单元格 61 * @param row 单元格所在的行索引 62 * @param column 单元格所在的列索引 63 * @return 如果单元格是合并单元格的一部分则返回true,否则返回false 64 */ 65 public boolean isMergedRegion(List<CellExtra> cellExtras,int row, int column) { 66 for (CellExtra extra:cellExtras) { 67 if (isInRange(extra,row-1,column)) { 68 return true; 69 } 70 } 71 return false; 72 } 73 /* 74 * @description:判断rowInd,colInd范围是否在当前的合并单元格范围之内,是返回true,否返回false 75 * @author: * 76 * @date: 2024/6/7 15:18 77 * @param: [extra 合并单元格的范围, rowInd 要查询单元格的行位置, colInd 要查询单元格的列位置] 78 * @return: boolean 79 **/ 80 private boolean isInRange(CellExtra extra,int rowInd, int colInd) { 81 return extra.getFirstRowIndex() <= rowInd && rowInd <= extra.getLastRowIndex() && extra.getFirstColumnIndex() <= colInd && colInd <= extra.getLastColumnIndex(); 82 }