ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelListener.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-common/src/main/java/com/ruoyi/common/excel/DefautExcelResult.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-common/src/main/java/com/ruoyi/common/excel/ExcelResult.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelListener.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelResult.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestDemoImportVo.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
ruoyi-ui/src/views/demo/demo/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
ruoyi-common/src/main/java/com/ruoyi/common/excel/DefaultExcelListener.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,101 @@ package com.ruoyi.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.alibaba.fastjson.JSON; import com.ruoyi.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; import java.util.stream.Collectors; /** * Excel å¯¼å ¥çå¬ * * @author Yjoioooo * @author Lion Li */ @Slf4j @NoArgsConstructor public class DefaultExcelListener<T> extends AnalysisEventListener<T> { /** * æ¯å¦Validatoræ£éªï¼é»è®¤ä¸ºæ¯ */ private Boolean isValidate = Boolean.TRUE; /** * å¯¼å ¥åæ§ */ private ExcelResult<T> excelResult; public DefaultExcelListener(boolean isValidate) { this.excelResult = new DefautExcelResult<>(); 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) { // å¦ææ¯æä¸ä¸ªåå æ ¼ç转æ¢å¼å¸¸ è½è·åå°å ·ä½è¡å· // 妿è¦è·å头çä¿¡æ¯ é ådoAfterAllAnalysedHeadMapä½¿ç¨ ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException) exception; errMsg = StrUtil.format("第{}è¡-第{}åè§£æå¼å¸¸<br/>", excelDataConvertException.getRowIndex() + 1, excelDataConvertException.getColumnIndex() + 1); if (log.isDebugEnabled()) { log.error(errMsg); } } if (exception instanceof ConstraintViolationException) { ConstraintViolationException constraintViolationException = (ConstraintViolationException) exception; Set<ConstraintViolation<?>> constraintViolations = constraintViolationException.getConstraintViolations(); String constraintViolationsMsg = constraintViolations.stream() .map(ConstraintViolation::getMessage) .collect(Collectors.joining(", ")); 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<Integer, String> headMap, AnalysisContext context) { log.debug("è§£æå°ä¸æ¡å¤´æ°æ®: {}", JSON.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("æææ°æ®è§£æå®æï¼"); } public ExcelResult<T> getExcelResult() { return excelResult; } } ruoyi-common/src/main/java/com/ruoyi/common/excel/DefautExcelResult.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,78 @@ package com.ruoyi.common.excel; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import lombok.Setter; import java.util.ArrayList; import java.util.List; /** * é»è®¤excelè¿å对象 * * @author Yjoioooo * @author Lion Li */ public class DefautExcelResult<T> implements ExcelResult<T> { /** * æ°æ®å¯¹è±¡list */ @Setter private List<T> list; /** * é误信æ¯å表 */ @Setter private List<String> errorList; public DefautExcelResult() { this.list = new ArrayList<>(); this.errorList = new ArrayList<>(); } public DefautExcelResult(List<T> list, List<String> errorList) { this.list = list; this.errorList = errorList; } public DefautExcelResult(ExcelResult<T> excelResult) { this.list = excelResult.getList(); this.errorList = excelResult.getErrorList(); } @Override public List<T> getList() { return list; } @Override public List<String> getErrorList() { return errorList; } /** * è·åå¯¼å ¥åæ§ * * @return å¯¼å ¥åæ§ */ @Override 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("é¨å读åæåï¼å ¶ä¸æå{}æ¡ï¼å¤±è´¥{}æ¡ï¼é误信æ¯å¦ä¸ï¼<br/>{}", successCount, errorCount, CollUtil.join(errorList, "<br/>")); } } } } ruoyi-common/src/main/java/com/ruoyi/common/excel/ExcelResult.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,26 @@ package com.ruoyi.common.excel; import java.util.List; /** * excelè¿å对象 * * @author Lion Li */ public interface ExcelResult<T> { /** * 对象å表 */ List<T> getList(); /** * é误å表 */ List<String> getErrorList(); /** * å¯¼å ¥åæ§ */ String getAnalysis(); } ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelListener.java
ÎļþÒÑɾ³ý ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelResult.java
ÎļþÒÑɾ³ý ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
@@ -4,9 +4,10 @@ import com.alibaba.excel.EasyExcel; import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; import com.ruoyi.common.convert.ExcelBigNumberConvert; import com.ruoyi.common.excel.DefaultExcelListener; import com.ruoyi.common.excel.ExcelResult; 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; @@ -21,118 +22,133 @@ */ public class ExcelUtil { /** * 对excel表åé»è®¤ç¬¬ä¸ä¸ªç´¢å¼åè½¬æ¢ælistï¼EasyExcelï¼ * * @param is è¾å ¥æµ * @return 转æ¢åéå */ public static <T> List<T> importExcel(InputStream is, Class<T> clazz) { return EasyExcel.read(is).head(clazz).autoCloseStream(false).sheet().doReadSync(); } /** * 对excel表åé»è®¤ç¬¬ä¸ä¸ªç´¢å¼åè½¬æ¢ælistï¼EasyExcelï¼ * åæ¥å¯¼å ¥ * * @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); public static <T> List<T> importExcel(InputStream is, Class<T> clazz) { return EasyExcel.read(is).head(clazz).autoCloseStream(false).sheet().doReadSync(); } /** * ä½¿ç¨æ ¡éªçå¬å¨å¤çå¯¼å ¥ * * @param is è¾å ¥æµ * @param clazz 对象类å * @param isValidate æ¯å¦ Validator æ£éª é»è®¤ä¸ºæ¯ * @return 转æ¢åéå */ public static <T> ExcelResult<T> importExcel(InputStream is, Class<T> clazz, boolean isValidate) { DefaultExcelListener<T> listener = new DefaultExcelListener<>(isValidate); EasyExcel.read(is, clazz, listener).sheet().doRead(); return listener.getExcelResult(); } /** * 对listæ°æ®æºå°å ¶éé¢çæ°æ®å¯¼å ¥å°excel表åï¼EasyExcelï¼ * * @param list å¯¼åºæ°æ®éå * @param sheetName å·¥ä½è¡¨çåç§° * @return ç»æ */ public static <T> void exportExcel(List<T> list, String sheetName, Class<T> clazz, HttpServletResponse response) { try { String filename = encodingFilename(sheetName); response.reset(); FileUtils.setAttachmentResponseHeader(response, filename); response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8"); ServletOutputStream os = response.getOutputStream(); EasyExcel.write(os, clazz) .autoCloseStream(false) // èªå¨éé .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 大æ°å¼èªå¨è½¬æ¢ 鲿¢å¤±ç .registerConverter(new ExcelBigNumberConvert()) .sheet(sheetName).doWrite(list); } catch (IOException e) { throw new RuntimeException("导åºExcelå¼å¸¸"); } } /** * 使ç¨èªå®ä¹çå¬å¨å¯¼å ¥ * * @param is è¾å ¥æµ * @param clazz 对象类å * @param readListener èªå®ä¹çå¬å¨ * @return 转æ¢åéå */ public static <T> ExcelResult<T> importExcel(InputStream is, Class<T> clazz, DefaultExcelListener<T> readListener) { EasyExcel.read(is, clazz, readListener).sheet().doRead(); return readListener.getExcelResult(); } /** * è§£æå¯¼åºå¼ 0=ç·,1=女,2=æªç¥ * * @param propertyValue åæ°å¼ * @param converterExp ç¿»è¯æ³¨è§£ * @param separator åé符 * @return è§£æåå¼ */ public static String convertByExp(String propertyValue, String converterExp, String separator) { StringBuilder propertyString = new StringBuilder(); String[] convertSource = converterExp.split(","); for (String item : convertSource) { String[] itemArray = item.split("="); if (StringUtils.containsAny(separator, propertyValue)) { for (String value : propertyValue.split(separator)) { if (itemArray[0].equals(value)) { propertyString.append(itemArray[1] + separator); break; } } } else { if (itemArray[0].equals(propertyValue)) { return itemArray[1]; } } } return StringUtils.stripEnd(propertyString.toString(), separator); } /** * 导åºexcel * * @param list å¯¼åºæ°æ®éå * @param sheetName å·¥ä½è¡¨çåç§° * @return ç»æ */ public static <T> void exportExcel(List<T> list, String sheetName, Class<T> clazz, HttpServletResponse response) { try { String filename = encodingFilename(sheetName); response.reset(); FileUtils.setAttachmentResponseHeader(response, filename); response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8"); ServletOutputStream os = response.getOutputStream(); EasyExcel.write(os, clazz) .autoCloseStream(false) // èªå¨éé .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 大æ°å¼èªå¨è½¬æ¢ 鲿¢å¤±ç .registerConverter(new ExcelBigNumberConvert()) .sheet(sheetName).doWrite(list); } catch (IOException e) { throw new RuntimeException("导åºExcelå¼å¸¸"); } } /** * ååè§£æå¼ ç·=0,女=1,æªç¥=2 * * @param propertyValue åæ°å¼ * @param converterExp ç¿»è¯æ³¨è§£ * @param separator åé符 * @return è§£æåå¼ */ public static String reverseByExp(String propertyValue, String converterExp, String separator) { StringBuilder propertyString = new StringBuilder(); String[] convertSource = converterExp.split(","); for (String item : convertSource) { String[] itemArray = item.split("="); if (StringUtils.containsAny(separator, propertyValue)) { for (String value : propertyValue.split(separator)) { if (itemArray[1].equals(value)) { propertyString.append(itemArray[0] + separator); break; } } } else { if (itemArray[1].equals(propertyValue)) { return itemArray[0]; } } } return StringUtils.stripEnd(propertyString.toString(), separator); } /** * è§£æå¯¼åºå¼ 0=ç·,1=女,2=æªç¥ * * @param propertyValue åæ°å¼ * @param converterExp ç¿»è¯æ³¨è§£ * @param separator åé符 * @return è§£æåå¼ */ public static String convertByExp(String propertyValue, String converterExp, String separator) { StringBuilder propertyString = new StringBuilder(); String[] convertSource = converterExp.split(","); for (String item : convertSource) { String[] itemArray = item.split("="); if (StringUtils.containsAny(separator, propertyValue)) { for (String value : propertyValue.split(separator)) { if (itemArray[0].equals(value)) { propertyString.append(itemArray[1] + separator); break; } } } else { if (itemArray[0].equals(propertyValue)) { return itemArray[1]; } } } return StringUtils.stripEnd(propertyString.toString(), separator); } /** * ç¼ç æä»¶å */ public static String encodingFilename(String filename) { return IdUtil.fastSimpleUUID() + "_" + filename + ".xlsx"; } /** * ååè§£æå¼ ç·=0,女=1,æªç¥=2 * * @param propertyValue åæ°å¼ * @param converterExp ç¿»è¯æ³¨è§£ * @param separator åé符 * @return è§£æåå¼ */ public static String reverseByExp(String propertyValue, String converterExp, String separator) { StringBuilder propertyString = new StringBuilder(); String[] convertSource = converterExp.split(","); for (String item : convertSource) { String[] itemArray = item.split("="); if (StringUtils.containsAny(separator, propertyValue)) { for (String value : propertyValue.split(separator)) { if (itemArray[1].equals(value)) { propertyString.append(itemArray[0] + separator); break; } } } else { if (itemArray[1].equals(propertyValue)) { return itemArray[0]; } } } return StringUtils.stripEnd(propertyString.toString(), separator); } /** * ç¼ç æä»¶å */ public static String encodingFilename(String filename) { return IdUtil.fastSimpleUUID() + "_" + filename + ".xlsx"; } } ruoyi-demo/src/main/java/com/ruoyi/demo/controller/TestDemoController.java
@@ -5,14 +5,13 @@ import com.ruoyi.common.annotation.RepeatSubmit; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.core.validate.AddGroup; import com.ruoyi.common.core.validate.EditGroup; import com.ruoyi.common.core.validate.QueryGroup; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.ValidatorUtils; import com.ruoyi.common.utils.poi.ExcelResult; import com.ruoyi.common.excel.ExcelResult; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.demo.domain.TestDemo; import com.ruoyi.demo.domain.bo.TestDemoBo; @@ -69,7 +68,7 @@ return iTestDemoService.customPageList(bo); } @ApiOperation("å¯¼å ¥æµè¯å表") @ApiOperation("å¯¼å ¥æµè¯-æ ¡éª") @ApiImplicitParams({ @ApiImplicitParam(name = "file", value = "å¯¼å ¥æä»¶", dataType = "java.io.File", required = true), }) @@ -77,7 +76,7 @@ @PreAuthorize("@ss.hasPermi('demo:demo:import')") @PostMapping("/importData") public AjaxResult<Void> importData(@RequestPart("file") MultipartFile file) throws Exception { ExcelResult<TestDemoImportVo> excelResult = ExcelUtil.importExcel(file.getInputStream(), TestDemoImportVo.class, true, true); ExcelResult<TestDemoImportVo> excelResult = ExcelUtil.importExcel(file.getInputStream(), TestDemoImportVo.class, true); List<TestDemoImportVo> volist = excelResult.getList(); List<TestDemo> list = BeanUtil.copyToList(volist, TestDemo.class); iTestDemoService.saveAll(list); ruoyi-demo/src/main/java/com/ruoyi/demo/domain/bo/TestDemoImportVo.java
@@ -1,13 +1,9 @@ package com.ruoyi.demo.domain.bo; import com.alibaba.excel.annotation.ExcelProperty; import com.ruoyi.common.core.domain.BaseEntity; import com.ruoyi.common.core.validate.AddGroup; import com.ruoyi.common.core.validate.EditGroup; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @@ -18,16 +14,14 @@ * @author Lion Li * @date 2021-07-26 */ @Data @ApiModel("æµè¯å表ä¸å¡å¯¹è±¡") public class TestDemoImportVo { /** * é¨é¨id */ @ApiModelProperty("é¨é¨id") @ApiModelProperty("é¨é¨id") @NotNull(message = "é¨é¨idä¸è½ä¸ºç©º") @ExcelProperty(value = "é¨é¨id") private Long deptId; @@ -35,7 +29,7 @@ /** * ç¨æ·id */ @ApiModelProperty("ç¨æ·id") @ApiModelProperty("ç¨æ·id") @NotNull(message = "ç¨æ·idä¸è½ä¸ºç©º") @ExcelProperty(value = "ç¨æ·id") private Long userId; @@ -43,7 +37,7 @@ /** * æåºå· */ @ApiModelProperty("æåºå·") @ApiModelProperty("æåºå·") @NotNull(message = "æåºå·ä¸è½ä¸ºç©º") @ExcelProperty(value = "æåºå·") private Long orderNum; @@ -51,7 +45,7 @@ /** * keyé® */ @ApiModelProperty("keyé®") @ApiModelProperty("keyé®") @NotBlank(message = "keyé®ä¸è½ä¸ºç©º") @ExcelProperty(value = "keyé®") private String testKey; @@ -59,8 +53,9 @@ /** * å¼ */ @ApiModelProperty("å¼") @ApiModelProperty("å¼") @NotBlank(message = "å¼ä¸è½ä¸ºç©º") @ExcelProperty(value = "å¼") private String value; } ruoyi-ui/src/views/demo/demo/index.vue
@@ -79,7 +79,7 @@ size="mini" @click="handleImport" v-hasPermi="['demo:demo:import']" >å¯¼å ¥</el-button> >å¯¼å ¥(æ ¡éª)</el-button> </el-col> <el-col :span="1.5"> <el-button