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