package com.dl.common.excel; import cn.hutool.core.util.StrUtil; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.exception.ExcelAnalysisException; import com.alibaba.excel.exception.ExcelDataConvertException; import com.dl.common.utils.JsonUtils; import com.dl.common.utils.StreamUtils; import com.dl.common.utils.ValidatorUtils; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import javax.validation.ConstraintViolation; import javax.validation.ConstraintViolationException; import java.util.Map; import java.util.Set; /** * Excel 导入监听 * * @author Yjoioooo * @author Lion Li */ @Slf4j @NoArgsConstructor public class DefaultExcelListener extends AnalysisEventListener implements ExcelListener { /** * 是否Validator检验,默认为是 */ private Boolean isValidate = Boolean.TRUE; /** * excel 表头数据 */ private Map headMap; /** * 导入回执 */ private ExcelResult excelResult; public DefaultExcelListener(boolean isValidate) { this.excelResult = new DefaultExcelResult<>(); this.isValidate = isValidate; } /** * 处理异常 * * @param exception ExcelDataConvertException * @param context Excel 上下文 */ @Override public void onException(Exception exception, AnalysisContext context) throws Exception { String errMsg = null; if (exception instanceof ExcelDataConvertException) { // 如果是某一个单元格的转换异常 能获取到具体行号 ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) exception; Integer rowIndex = excelDataConvertException.getRowIndex(); Integer columnIndex = excelDataConvertException.getColumnIndex(); errMsg = StrUtil.format("第{}行-第{}列-表头{}: 解析异常
", rowIndex + 1, columnIndex + 1, headMap.get(columnIndex)); if (log.isDebugEnabled()) { log.error(errMsg); } } if (exception instanceof ConstraintViolationException) { ConstraintViolationException constraintViolationException = (ConstraintViolationException) exception; Set> constraintViolations = constraintViolationException.getConstraintViolations(); String constraintViolationsMsg = StreamUtils.join(constraintViolations, ConstraintViolation::getMessage, ", "); errMsg = StrUtil.format("第{}行数据校验异常: {}", context.readRowHolder().getRowIndex() + 1, constraintViolationsMsg); if (log.isDebugEnabled()) { log.error(errMsg); } } excelResult.getErrorList().add(errMsg); throw new ExcelAnalysisException(errMsg); } @Override public void invokeHeadMap(Map headMap, AnalysisContext context) { this.headMap = headMap; log.debug("解析到一条表头数据: {}", JsonUtils.toJsonString(headMap)); } @Override public void invoke(T data, AnalysisContext context) { if (isValidate) { ValidatorUtils.validate(data); } excelResult.getList().add(data); } @Override public void doAfterAllAnalysed(AnalysisContext context) { log.debug("所有数据解析完成!"); } @Override public ExcelResult getExcelResult() { return excelResult; } }