[alibaba/easyexcel]无模型读取Excel怎么判断是否有行或者列合并

2024-05-24 949 views
4

异常代码

   这里写你的代码

异常提示 请提供完整的异常提示,记住是全部异常! 建议描述

回答

8

百度关键字:POI判断某个单元格是否是合并单元格

private Result isMergedRegion(Sheet sheet,int row ,int column) {   
       int sheetMergeCount = sheet.getNumMergedRegions();   
       for (int i = 0; i < sheetMergeCount; i++) {   
             CellRangeAddress range = sheet.getMergedRegion(i);   
             int firstColumn = range.getFirstColumn(); 
             int lastColumn = range.getLastColumn();   
             int firstRow = range.getFirstRow();   
             int lastRow = range.getLastRow();   
             if(row >= firstRow && row <= lastRow){ 
                 if(column >= firstColumn && column <= lastColumn){ 
                return new Result(true,firstRow+1,lastRow+1,firstColumn+1,lastColumn+1);   
                 } 
             }
       } 
       return new Result(false,0,0,0,0);  
     } 
4

可能是我描述不准确,easyExcel读取行合并的情况,例如 2,3,4行的前三列行合并,利用无模型读取到的第二行数据前三列有值,第三列、第四列的前三行为空,我想第3,4行的前三列同样反回数据。 代码如下: NoModleDataListener noModleDataListener = new NoModleDataListener(cols); ReadSheet build = EasyExcel.readSheet(i).registerReadListener(noModleDataListener).headRowNumber(1).build(); excelReader.read(build); `public class NoModleDataListener extends AnalysisEventListener<Map<Integer, String>> {

private static final Logger LOGGER = LoggerFactory.getLogger(NoModleDataListener.class);

private  List<String> dataList = Lists.newArrayList();

private Integer headLineMun;

public NoModleDataListener() {
    super();
}

public NoModleDataListener(Integer headLineMun) {
    this.headLineMun = headLineMun;
}

@Override
public void invoke(Map<Integer, String> data, AnalysisContext analysisContext) {
    LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data));
    if(!CollectionUtils.isEmpty(data)){
        StringBuffer sb = new StringBuffer();
        for(int i=0;i<headLineMun;i++){
            sb.append(StringUtils.isEmpty(data.get(i))?"":data.get(i));
            sb.append(",");
        }
        String s = sb.toString();
        s = s.substring(0,s.length()-1)+";";
        dataList.add(s);
    }
}

@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    LOGGER.info("所有数据解析完成!");
}

public List<String> getDataList() {
    return dataList;
}

 public void setDataList(List<String> dataList) {
    this.dataList = dataList;
}

public void clear(){
    dataList.clear();
}

}` 您以上代码用POI可以做,如果用EasyExcel不知道怎么写。 image

2

我翻了下代码,easyExcel是以单元格为单元处理的,对这种需求可能不太好处理

  • 看能不能在数据层面处理下
  • 或者换用POI读取,合并单元格比较复杂
6

目前 不支持合并行列。后续会考虑支持