EasyExcel解析包含單元格合併的表格

1,引入依賴

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.7</version>
        </dependency>

2,實現代碼

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.enums.CellExtraTypeEnum;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelDataConvertException;
import com.alibaba.excel.metadata.CellExtra;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.FileNotFoundException;
import java.util.*;

/**
 * @Description 注意:空白的單元格不會被讀取
 * @Author dsf
 * @Date 2020/12/14 15:30
 * @Version V1.0
 **/
public class NoModelDataListener extends AnalysisEventListener<Map<Integer, String>> {

    private static final Logger log = LoggerFactory.getLogger(UploadDataListener.class);
    /**
     * 全部列到字段名的映射
     * */
    private Map<Integer,String> index2FieldMap ;
    /**
     * 解析出的數據
     */
    private LinkedHashMap<Integer,Map<Integer, String>> row2DataMap = new LinkedHashMap<>();
    /**
     * 合併單元格
     */
    private List<CellExtra> extraMergeInfoList = new ArrayList<>();

    public NoModelDataListener(){}

    public NoModelDataListener(Map<Integer,String> index2FieldMap){
        this.index2FieldMap = index2FieldMap ;
    }

    @Override
    public void invoke(Map<Integer, String> rowData, AnalysisContext analysisContext) {
        //讀取到的每行數據,其key是以0開始的索引
        row2DataMap.put(analysisContext.readRowHolder().getRowIndex(),rowData) ;
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        //全部行都解析完成
        this.explainMergeData(row2DataMap, extraMergeInfoList) ;
    }

    /**
     * 某行的數據解析失敗
     * */
    @Override
    public void onException(Exception exception, AnalysisContext context) {
        System.err.println("解析失敗,可是繼續解析下一行: " + exception.getMessage());
        // 若是是某一個單元格的轉換異常 能獲取到具體行號
        if (exception instanceof ExcelDataConvertException) {
            ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception;
            System.err.println("第{}行,第{}列解析異常" + excelDataConvertException.getRowIndex() +
                    excelDataConvertException.getColumnIndex());
        }
    }

    @Override
    public void extra(CellExtra extra, AnalysisContext context) {
        switch (extra.getType()){
            case MERGE:{
                extraMergeInfoList.add(extra);
                break;
            }
            case HYPERLINK:{
                break;
            }
            case COMMENT:{
            }
            default: {
            }
        }
    }

    /**
     * 處理合並單元格
     * @param data               解析數據
     * @param extraMergeInfoList 合併單元格信息
     * @return 填充好的解析數據
     */
    private void explainMergeData(Map<Integer,Map<Integer, String>> data, List<CellExtra> extraMergeInfoList) {
        //循環全部合併單元格信息
        extraMergeInfoList.forEach(cellExtra -> {
            int firstRowIndex = cellExtra.getFirstRowIndex();
            int lastRowIndex = cellExtra.getLastRowIndex();
            int firstColumnIndex = cellExtra.getFirstColumnIndex();
            int lastColumnIndex = cellExtra.getLastColumnIndex();

            Map<Integer,String> rdata = data.get(cellExtra.getRowIndex()) ;
            String val = null ;
            if(rdata != null){
                val = rdata.get(cellExtra.getColumnIndex()) ;
            }
            //遍歷每行
            Map<Integer, String> rowData = null ;
            for(int i=firstRowIndex;i<=lastRowIndex;i++){
                rowData = data.get(i) ;
                if(rowData == null){
                    continue;
                }
                for(int c = firstColumnIndex;c<=lastColumnIndex;c++){
                    rowData.put(c,val) ;
                }
            }
        });
    }

    public static void main(String[] args) throws FileNotFoundException {
        //讀取的表格名
        String fileName = "C:\\Users\\dsf\\Desktop\\解析的\\2020年2季度電子渠道新業務開發需求-評估數據(數據導入模板).xlsx";
        String fileName2 = "C:\\Users\\dsf\\Desktop\\解析的\\非COSMIC評估工做量彙總模板.xlsx" ;
        String fileName3 = "C:\\Users\\dsf\\Desktop\\解析的\\test.xlsx" ;
        EasyExcel.read(fileName3,new NoModelDataListener())
                .extraRead(CellExtraTypeEnum.MERGE)  // 須要讀取合併單元格信息 默認不讀取
                //.registerConverter(new EmptyConverter()) //默認:DefaultConverterLoader#loadDefaultReadConverter()
                .ignoreEmptyRow(true)
                .autoTrim(true)
                .headRowNumber(1)
                .autoCloseStream(true)
                //.sheet("二、功能點拆分表")
                //.sheet("四、結果計算")
                .sheet()
                .doRead();

    }
}
相關文章
相關標籤/搜索