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();
}
}