如上圖中的#DIV/0!,屬于公式計(jì)算的時(shí)候把跨,分母為0的情況谁鳍,我們想將這些異常值讀取的時(shí)候轉(zhuǎn)成空或者0
上面這種異常的情況,我們使用easyexcel讀取的時(shí)候稍途,讀取到的cellData是阁吝,可以看到type=CellDataTypeEnum是ERROR,讀取到的值是#VALUE!
針對(duì)上面這種械拍,我們可以自定義一個(gè)easyexcel的Converter
@Slf4j
public class BigDecimalWrongDataConvert implements Converter<BigDecimal> {
@Override
public Class<BigDecimal> supportJavaTypeKey() {
return BigDecimal.class;
}
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.ERROR;
}
@Override
public BigDecimal convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) {
Class<?> type = contentProperty.getField().getType();
if(type==BigDecimal.class){
return BigDecimal.ZERO;
}
return null;
}
}
然后在讀取的時(shí)候?qū)⑦@個(gè)自定義convert注冊(cè)進(jìn)去
public static void main(String[] args) throws FileNotFoundException {
String filePath= "aaa.xlsx";
File file = new File(filePath);
DefaultExcelListener<ExploitData> listener = new DefaultExcelListener<>(false);
//#VALUE!
ExcelReader excelReader = EasyExcel.read(FileUtil.getInputStream(file)).registerReadListener(listener).
registerConverter(new BigDecimalWrongDataConvert()).
headRowNumber(5).head(ExploitData.class).build();
List<ReadSheet> readSheets = excelReader.excelExecutor().sheetList();
Optional<ReadSheet> first = readSheets.stream().filter(sheet -> "YYYsheet".equals(sheet.getSheetName())).findFirst();
if(first.isPresent()){
excelReader.read(first.get());
excelReader.finish();
System.out.println(listener.getExcelResult().getList());
}
}
}