From c3bb4d2a6181e27b58cca56def0f392d6df7d7a1 Mon Sep 17 00:00:00 2001 From: zhujie <693337446@qq.com> Date: Fri, 26 Nov 2021 13:01:00 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E6=96=B0=E5=A2=9E=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=BC=80=E5=90=AFValidator=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=EF=BC=8C=E6=94=AF=E6=8C=81=E5=BC=80=E5=90=AF?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=BC=82=E5=B8=B8=E8=A1=8C=E7=BB=A7=E7=BB=AD?= =?UTF-8?q?=E8=AF=BB=E5=8F=96=EF=BC=8C=E6=94=AF=E6=8C=81=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=9B=9E=E6=89=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/common/utils/poi/ExcelListener.java | 116 ++++++++++++++++++ .../ruoyi/common/utils/poi/ExcelResult.java | 40 ++++++ .../com/ruoyi/common/utils/poi/ExcelUtil.java | 14 +++ 3 files changed, 170 insertions(+) create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelListener.java create mode 100644 ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelResult.java diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelListener.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelListener.java new file mode 100644 index 000000000..5705e94da --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelListener.java @@ -0,0 +1,116 @@ +package com.ruoyi.common.utils.poi; + +import cn.hutool.core.collection.CollUtil; +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.alibaba.fastjson.JSON; +import com.ruoyi.common.utils.ValidatorUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import javax.validation.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * 公共excel监听类 + * @param + */ +public class ExcelListener extends AnalysisEventListener { + + private static final Logger LOGGER = LoggerFactory.getLogger(ExcelListener.class); + /** 数据对象list */ + private final List list = new ArrayList<>(); + /** 错误信息列表 */ + private final List errorList = new ArrayList<>(); + /** 遇到异常是否跳出导入,默认为是 */ + private Boolean skipException = Boolean.TRUE; + /** 是否Validator检验,默认为是 */ + private Boolean isValidate = Boolean.TRUE; + /** + * 导入回执 + */ + private final ExcelResult excelResult = new ExcelResult<>(); + + public ExcelListener() { + + } + + public ExcelListener(boolean isValidate, boolean skipException) { + this.isValidate = isValidate; + this.skipException = skipException; + } + + /** + * 处理异常 + * + * @param exception ExcelDataConvertException + * @param context excel上下文 + */ + @Override + public void onException(Exception exception, AnalysisContext context) throws Exception { + // 如果是某一个单元格的转换异常 能获取到具体行号 + // 如果要获取头的信息 配合doAfterAllAnalysedHeadMap使用 + String errMsg = null; + if (exception instanceof ExcelDataConvertException) { + ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception; + errMsg = StrUtil.format("第{}行-第{}列解析异常
", excelDataConvertException.getRowIndex() + 1, + excelDataConvertException.getColumnIndex() + 1); + LOGGER.error(errMsg); + } + if (exception instanceof ConstraintViolationException) { + ConstraintViolationException constraintViolationException = (ConstraintViolationException)exception; + Set> constraintViolations = constraintViolationException.getConstraintViolations(); + String constraintViolationsMsg= CollUtil.join(constraintViolations + .stream() + .map(ConstraintViolation::getMessage) + .collect(Collectors.toList()), + ","); + errMsg = StrUtil.format("第{}行数据校验异常:{}", context.readRowHolder().getRowIndex() + 1, + constraintViolationsMsg); + LOGGER.error(errMsg); + } + errorList.add(errMsg); + if (!skipException){ + throw new ExcelAnalysisException(errMsg); + } + } + + @Override + public void invokeHeadMap(Map headMap, AnalysisContext context) { + LOGGER.debug("解析到一条头数据:{}", JSON.toJSONString(headMap)); + } + + @Override + public void invoke(T data, AnalysisContext context) { + if (isValidate) { + ValidatorUtils.validate(data); + } + list.add(data); + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + excelResult.setList(list); + excelResult.setErrorList(errorList); + LOGGER.debug("所有数据解析完成!"); + } + + /** + * 获取导入数据 + * @return 导入数据 + */ + public List getList() { + return list; + } + + public ExcelResult getExcelResult() { + return excelResult; + } + +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelResult.java new file mode 100644 index 000000000..3e17548ad --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelResult.java @@ -0,0 +1,40 @@ +package com.ruoyi.common.utils.poi; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +public class ExcelResult { + + /** 数据对象list + */ + private List list; + /** 错误信息列表 */ + private List errorList; + + /** + * 获取导入回执 + * @return 导入回执 + */ + public String getAnalysis() { + int successCount = list.size(); + int errorCount = errorList.size(); + if (successCount == 0) { + return "读取失败,未解析到数据"; + } else { + if (errorList.size() == 0) { + return StrUtil.format("恭喜您,全部读取成功!共{}条", successCount); + } else { + return StrUtil.format("部分读取成功,其中成功{}条,失败{}条,错误信息如下:
{}", + successCount, + errorCount, + CollUtil.join(errorList, "
")); + } + + } + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java index 0775ce57c..8802a546a 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java @@ -6,6 +6,7 @@ import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy import com.ruoyi.common.convert.ExcelBigNumberConvert; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.file.FileUtils; +import org.apache.poi.ss.formula.functions.T; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; @@ -30,6 +31,19 @@ public class ExcelUtil { return EasyExcel.read(is).head(clazz).autoCloseStream(false).sheet().doReadSync(); } + + /** + * 对excel表单默认第一个索引名转换成list(EasyExcel) + * + * @param is 输入流 + * @return 转换后集合 + */ + public static ExcelResult importExcel(InputStream is, Class clazz, boolean isValidate, boolean skipException) { + ExcelListener listener = new ExcelListener<>(isValidate, skipException); + EasyExcel.read(is, clazz, listener).sheet().doRead(); + return listener.getExcelResult(); + } + /** * 对list数据源将其里面的数据导入到excel表单(EasyExcel) *