use of com.alibaba.excel.read.listener.ModelBuildEventListener in project diboot by dibo-software.
the class ReadExcelListener method onException.
/**
* <h3>异常处理</h3>
* 修补数据,回写错误
*/
@Override
public void onException(Exception exception, AnalysisContext context) throws Exception {
// 数据类型转化异常
if (exception instanceof ExcelDataConvertException) {
ExcelDataConvertException dataConvertException = (ExcelDataConvertException) exception;
Map<Integer, ReadCellData<?>> cellMap = new HashMap<>((Map) context.readRowHolder().getCellMap());
Map<String, String> errorDataMap = new HashMap<>();
Map<String, String> errorMsgMap = new HashMap<>();
Consumer<ExcelDataConvertException> addErrorData = e -> {
Integer columnIndex = e.getColumnIndex();
String key = fieldNameMap.get(columnIndex);
errorDataMap.put(key, cellMap.remove(columnIndex).getStringValue());
errorMsgMap.put(key, "数据格式转换异常,非期望的数据类型[" + e.getExcelContentProperty().getField().getType().getSimpleName() + "]");
};
addErrorData.accept(dataConvertException);
ReadListener<?> readListener = context.readWorkbookHolder().getReadListenerList().get(0);
if (readListener instanceof ModelBuildEventListener) {
while (true) {
try {
((ModelBuildEventListener) readListener).invoke(cellMap, context);
break;
} catch (ExcelDataConvertException convertException) {
addErrorData.accept(convertException);
}
}
} else {
log.error("数据转换异常", exception);
StringBuilder errorMsg = new StringBuilder().append("第 ").append(context.readRowHolder().getRowIndex() + 1).append(" 行,");
errorMsgMap.forEach((fieldName, msg) -> errorMsg.append(fieldHeadMap.get(fieldName)).append(":").append(msg));
addExceptionMsg(errorMsg.toString());
return;
}
T currentRowAnalysisResult = (T) context.readRowHolder().getCurrentRowAnalysisResult();
currentRowAnalysisResult.setRowIndex(context.readRowHolder().getRowIndex());
errorDataMap.forEach(currentRowAnalysisResult::addInvalidValue);
errorMsgMap.forEach(currentRowAnalysisResult::addComment);
// 校验异常
Set<ConstraintViolation<T>> constraintViolations = V.validateBean(currentRowAnalysisResult);
if (V.notEmpty(constraintViolations)) {
for (ConstraintViolation<T> violation : constraintViolations) {
String propertyName = violation.getPropertyPath().toString();
// 剔除解析识别的数据校验
if (!errorDataMap.containsKey(propertyName)) {
currentRowAnalysisResult.addComment(propertyName, violation.getMessage());
}
}
}
this.cachedData(currentRowAnalysisResult);
} else {
log.error("出现未预知的异常:", exception);
addExceptionMsg("第 " + (context.readRowHolder().getRowIndex() + 1) + " 行,解析异常: " + exception.getMessage());
}
}
Aggregations