From c3bb4d2a6181e27b58cca56def0f392d6df7d7a1 Mon Sep 17 00:00:00 2001 From: zhujie <693337446@qq.com> Date: 星期五, 26 十一月 2021 13:01:00 +0800 Subject: [PATCH] add 新增导入支持开启Validator数据验证,支持开启导入异常行继续读取,支持返回导入回执 --- ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java | 14 ++++ ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelListener.java | 116 ++++++++++++++++++++++++++++++++++++++ ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelResult.java | 40 +++++++++++++ 3 files changed, 170 insertions(+), 0 deletions(-) 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 0000000..5705e94 --- /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 <T> + */ +public class ExcelListener<T> extends AnalysisEventListener<T> { + + private static final Logger LOGGER = LoggerFactory.getLogger(ExcelListener.class); + /** 鏁版嵁瀵硅薄list */ + private final List<T> list = new ArrayList<>(); + /** 閿欒淇℃伅鍒楄〃 */ + private final List<String> errorList = new ArrayList<>(); + /** 閬囧埌寮傚父鏄惁璺冲嚭瀵煎叆锛岄粯璁や负鏄� */ + private Boolean skipException = Boolean.TRUE; + /** 鏄惁Validator妫�楠岋紝榛樿涓烘槸 */ + private Boolean isValidate = Boolean.TRUE; + /** + * 瀵煎叆鍥炴墽 + */ + private final ExcelResult<T> 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("绗瑊}琛�-绗瑊}鍒楄В鏋愬紓甯�<br/>", excelDataConvertException.getRowIndex() + 1, + excelDataConvertException.getColumnIndex() + 1); + LOGGER.error(errMsg); + } + if (exception instanceof ConstraintViolationException) { + ConstraintViolationException constraintViolationException = (ConstraintViolationException)exception; + Set<ConstraintViolation<?>> 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<Integer, String> headMap, AnalysisContext context) { + LOGGER.debug("瑙f瀽鍒颁竴鏉″ご鏁版嵁:{}", 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<T> getList() { + return list; + } + + public ExcelResult<T> 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 0000000..3e17548 --- /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<T> { + + /** 鏁版嵁瀵硅薄list + */ + private List<T> list; + /** 閿欒淇℃伅鍒楄〃 */ + private List<String> errorList; + + /** + * 鑾峰彇瀵煎叆鍥炴墽 + * @return 瀵煎叆鍥炴墽 + */ + public String getAnalysis() { + int successCount = list.size(); + int errorCount = errorList.size(); + if (successCount == 0) { + return "璇诲彇澶辫触锛屾湭瑙f瀽鍒版暟鎹�"; + } else { + if (errorList.size() == 0) { + return StrUtil.format("鎭枩鎮紝鍏ㄩ儴璇诲彇鎴愬姛锛佸叡{}鏉�", successCount); + } else { + return StrUtil.format("閮ㄥ垎璇诲彇鎴愬姛锛屽叾涓垚鍔焮}鏉★紝澶辫触{}鏉★紝閿欒淇℃伅濡備笅锛�<br/>{}", + successCount, + errorCount, + CollUtil.join(errorList, "<br/>")); + } + + } + } +} 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 0775ce5..8802a54 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.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 @@ return EasyExcel.read(is).head(clazz).autoCloseStream(false).sheet().doReadSync(); } + + /** + * 瀵筫xcel琛ㄥ崟榛樿绗竴涓储寮曞悕杞崲鎴恖ist锛圗asyExcel锛� + * + * @param is 杈撳叆娴� + * @return 杞崲鍚庨泦鍚� + */ + public static <T> ExcelResult<T> importExcel(InputStream is, Class<T> clazz, boolean isValidate, boolean skipException) { + ExcelListener<T> listener = new ExcelListener<>(isValidate, skipException); + EasyExcel.read(is, clazz, listener).sheet().doRead(); + return listener.getExcelResult(); + } + /** * 瀵筶ist鏁版嵁婧愬皢鍏堕噷闈㈢殑鏁版嵁瀵煎叆鍒癳xcel琛ㄥ崟锛圗asyExcel锛� * -- Gitblit v1.9.3