From afb2b6c414fda385368fbe31d58eafcfc6aa48b6 Mon Sep 17 00:00:00 2001 From: wangwei Date: Mon, 10 Mar 2025 16:31:52 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4log=E6=97=A5=E5=BF=97=20?= =?UTF-8?q?=E9=9B=86=E6=88=90easyexcel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 13 + .../monitor/SysOperlogController.java | 2 +- ruoyi-admin/src/main/resources/logback.xml | 18 +- ruoyi-common/pom.xml | 5 + .../com/ruoyi/common/utils/poi/ExcelUtil.java | 32 +++ .../service/impl/DhcCountryServiceImpl.java | 4 +- .../ruoyi/dhc/domain/EnumFiledConvert.java | 35 +++ .../java/com/ruoyi/dhc/domain/SysOperLog.java | 253 ++++++++++-------- .../dhc/domain/read/EasyExcelConvert.java | 138 ++++++++++ 9 files changed, 384 insertions(+), 116 deletions(-) create mode 100644 ruoyi-system/src/main/java/com/ruoyi/dhc/domain/EnumFiledConvert.java create mode 100644 ruoyi-system/src/main/java/com/ruoyi/dhc/domain/read/EasyExcelConvert.java diff --git a/pom.xml b/pom.xml index 5a85a01..ac93e82 100644 --- a/pom.xml +++ b/pom.xml @@ -33,6 +33,7 @@ 0.9.1 3.0.3 3.5.2 + 3.3.2 @@ -201,6 +202,18 @@ ${ruoyi.version} + + + com.alibaba + easyexcel + ${easyexcel.version} + + + + org.springframework.boot + spring-boot-starter-test + test + diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java index dd1a73e..dad62fd 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java @@ -48,7 +48,7 @@ public class SysOperlogController extends BaseController { List list = operLogService.selectOperLogList(operLog); ExcelUtil util = new ExcelUtil(SysOperLog.class); - util.exportExcel(response, list, "操作日志"); + util.exportEasyExcel(response, list, "操作日志"); } @Log(title = "操作日志", businessType = BusinessType.DELETE) diff --git a/ruoyi-admin/src/main/resources/logback.xml b/ruoyi-admin/src/main/resources/logback.xml index 461f1c4..724a80f 100644 --- a/ruoyi-admin/src/main/resources/logback.xml +++ b/ruoyi-admin/src/main/resources/logback.xml @@ -5,11 +5,23 @@ + + + + + + + - - ${log.pattern} - + + + ${logging.pattern.console} + + diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 4f0f8c6..3bdcd82 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -128,6 +128,11 @@ com.baomidou mybatis-plus-boot-starter + + + com.alibaba + easyexcel + \ No newline at end of file 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 49dea95..6989316 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 @@ -24,6 +24,8 @@ import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; import javax.servlet.http.HttpServletResponse; + +import com.alibaba.excel.EasyExcel; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.RegExUtils; import org.apache.commons.lang3.reflect.FieldUtils; @@ -1809,4 +1811,34 @@ public class ExcelUtil } return method; } + + /** + * 对excel表单默认第一个索引名转换成list(EasyExcel) + * + * @param is 输入流 + * @return 转换后集合 + */ + public List importEasyExcel(InputStream is) throws Exception + { + return EasyExcel.read(is).head(clazz).sheet().doReadSync(); + } + + /** + * 对list数据源将其里面的数据导入到excel表单(EasyExcel) + * + * @param list 导出数据集合 + * @param sheetName 工作表的名称 + * @return 结果 + */ + public void exportEasyExcel(HttpServletResponse response, List list, String sheetName) + { + try + { + EasyExcel.write(response.getOutputStream(), clazz).sheet(sheetName).doWrite(list); + } + catch (IOException e) + { + log.error("导出EasyExcel异常{}", e.getMessage()); + } + } } diff --git a/ruoyi-plan/src/main/java/com/ruoyi/dhc/service/impl/DhcCountryServiceImpl.java b/ruoyi-plan/src/main/java/com/ruoyi/dhc/service/impl/DhcCountryServiceImpl.java index 8dd6599..00611ee 100644 --- a/ruoyi-plan/src/main/java/com/ruoyi/dhc/service/impl/DhcCountryServiceImpl.java +++ b/ruoyi-plan/src/main/java/com/ruoyi/dhc/service/impl/DhcCountryServiceImpl.java @@ -44,9 +44,7 @@ public class DhcCountryServiceImpl implements IDhcCountryService public List selectDhcCountryList(DhcCountry dhcCountry) { dhcCountry.setDelFlag("0"); -// return dhcCountryMapper.selectDhcCountryList(dhcCountry); - LambdaQueryWrapper eq = new LambdaQueryWrapper(); - return dhcCountryMapper.selectList(eq); + return dhcCountryMapper.selectDhcCountryList(dhcCountry); } /** diff --git a/ruoyi-system/src/main/java/com/ruoyi/dhc/domain/EnumFiledConvert.java b/ruoyi-system/src/main/java/com/ruoyi/dhc/domain/EnumFiledConvert.java new file mode 100644 index 0000000..7680c73 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/dhc/domain/EnumFiledConvert.java @@ -0,0 +1,35 @@ +package com.ruoyi.dhc.domain; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 对excel导入时,处理枚举转化 + * @Author 996 + * @Date 2024/3/13 + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface EnumFiledConvert { + + + /** + * 枚举映射map key-value,key-value,key-value,key-value + * @return + */ + String enumMap() default ""; + + /** + * 枚举类导入、导出在excel中的分隔符号 + * @return + */ + String spiteChar() default ","; + + /** + * 单选 or 多选 + * @return + */ + boolean single() default true; +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/dhc/domain/SysOperLog.java b/ruoyi-system/src/main/java/com/ruoyi/dhc/domain/SysOperLog.java index 95ae47a..76f9581 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/dhc/domain/SysOperLog.java +++ b/ruoyi-system/src/main/java/com/ruoyi/dhc/domain/SysOperLog.java @@ -1,269 +1,304 @@ package com.ruoyi.dhc.domain; import java.util.Date; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.HeadFontStyle; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.annotation.Excel; -import com.ruoyi.common.annotation.Excel.ColumnType; import com.ruoyi.common.core.domain.BaseEntity; +import com.ruoyi.dhc.domain.read.EasyExcelConvert; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; /** * 操作日志记录表 oper_log - * + * * @author ruoyi */ -public class SysOperLog extends BaseEntity -{ +@ExcelIgnoreUnannotated +@ColumnWidth(16) +@HeadRowHeight(14) +@HeadFontStyle(fontHeightInPoints = 11) +public class SysOperLog extends BaseEntity { private static final long serialVersionUID = 1L; - /** 日志主键 */ - @Excel(name = "操作序号", cellType = ColumnType.NUMERIC) + /** + * 日志主键 + */ + @ExcelProperty(value = "操作序号") private Long operId; - /** 操作模块 */ - @Excel(name = "操作模块") + /** + * 操作模块 + */ + @ExcelProperty(value = "操作模块") private String title; - /** 业务类型(0其它 1新增 2修改 3删除) */ - @Excel(name = "业务类型", readConverterExp = "0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据") + /** + * 业务类型(0其它 1新增 2修改 3删除) + */ + @ExcelProperty(value = "业务类型", converter = EasyExcelConvert.class) + @EnumFiledConvert(enumMap = "0-其它,1-新增,2-修改,3-删除,4-授权,5-导出,6-导入,7-强退,8-生成代码,9-清空数据") private Integer businessType; - /** 业务类型数组 */ + /** + * 业务类型数组 + */ private Integer[] businessTypes; - /** 请求方法 */ - @Excel(name = "请求方法") + /** + * 请求方法 + */ + @ExcelProperty(value = "请求方法") private String method; - /** 请求方式 */ - @Excel(name = "请求方式") + /** + * 请求方式 + */ + @ExcelProperty(value = "请求方式") private String requestMethod; - /** 操作类别(0其它 1后台用户 2手机端用户) */ - @Excel(name = "操作类别", readConverterExp = "0=其它,1=后台用户,2=手机端用户") + /** + * 操作类别(0其它 1后台用户 2手机端用户) + */ + @ExcelProperty(value = "操作类别", converter = EasyExcelConvert.class) + @EnumFiledConvert(enumMap = "0-其它,1-后台用户,2-手机端用户") + private Integer operatorType; - /** 操作人员 */ - @Excel(name = "操作人员") + /** + * 操作人员 + */ + @ExcelProperty(value = "操作人员") private String operName; - /** 部门名称 */ - @Excel(name = "部门名称") + /** + * 部门名称 + */ + @ExcelProperty(value = "部门名称") private String deptName; - /** 请求url */ - @Excel(name = "请求地址") + /** + * 请求url + */ + @ExcelProperty(value = "请求地址") private String operUrl; - /** 操作地址 */ - @Excel(name = "操作地址") + /** + * 操作地址 + */ + @ExcelProperty(value = "操作地址") private String operIp; - /** 操作地点 */ - @Excel(name = "操作地点") + /** + * 操作地点 + */ + @ExcelProperty(value = "操作地点") private String operLocation; - /** 请求参数 */ - @Excel(name = "请求参数") + /** + * 请求参数 + */ + @ExcelProperty(value = "请求参数") private String operParam; - /** 返回参数 */ - @Excel(name = "返回参数") + /** + * 返回参数 + */ + @ExcelProperty(value = "返回参数") private String jsonResult; - /** 操作状态(0正常 1异常) */ - @Excel(name = "状态", readConverterExp = "0=正常,1=异常") + /** + * 操作状态(0正常 1异常) + */ + @ExcelProperty(value = "状态", converter = EasyExcelConvert.class) + @EnumFiledConvert(enumMap = "0-正常,1-异常") private Integer status; - /** 错误消息 */ - @Excel(name = "错误消息") + /** + * 错误消息 + */ + @ExcelProperty(value = "错误消息") private String errorMsg; - /** 操作时间 */ + /** + * 操作时间 + */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - @Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + @ExcelProperty(value = "操作时间") private Date operTime; /** 消耗时间 */ @Excel(name = "消耗时间", suffix = "毫秒") private Long costTime; - public Long getOperId() - { + public Long getOperId() { return operId; } - public void setOperId(Long operId) - { + public void setOperId(Long operId) { this.operId = operId; } - public String getTitle() - { + public String getTitle() { return title; } - public void setTitle(String title) - { + public void setTitle(String title) { this.title = title; } - public Integer getBusinessType() - { + public Integer getBusinessType() { return businessType; } - public void setBusinessType(Integer businessType) - { + public void setBusinessType(Integer businessType) { this.businessType = businessType; } - public Integer[] getBusinessTypes() - { + public Integer[] getBusinessTypes() { return businessTypes; } - public void setBusinessTypes(Integer[] businessTypes) - { + public void setBusinessTypes(Integer[] businessTypes) { this.businessTypes = businessTypes; } - public String getMethod() - { + public String getMethod() { return method; } - public void setMethod(String method) - { + public void setMethod(String method) { this.method = method; } - public String getRequestMethod() - { + public String getRequestMethod() { return requestMethod; } - public void setRequestMethod(String requestMethod) - { + public void setRequestMethod(String requestMethod) { this.requestMethod = requestMethod; } - public Integer getOperatorType() - { + public Integer getOperatorType() { return operatorType; } - public void setOperatorType(Integer operatorType) - { + public void setOperatorType(Integer operatorType) { this.operatorType = operatorType; } - public String getOperName() - { + public String getOperName() { return operName; } - public void setOperName(String operName) - { + public void setOperName(String operName) { this.operName = operName; } - public String getDeptName() - { + public String getDeptName() { return deptName; } - public void setDeptName(String deptName) - { + public void setDeptName(String deptName) { this.deptName = deptName; } - public String getOperUrl() - { + public String getOperUrl() { return operUrl; } - public void setOperUrl(String operUrl) - { + public void setOperUrl(String operUrl) { this.operUrl = operUrl; } - public String getOperIp() - { + public String getOperIp() { return operIp; } - public void setOperIp(String operIp) - { + public void setOperIp(String operIp) { this.operIp = operIp; } - public String getOperLocation() - { + public String getOperLocation() { return operLocation; } - public void setOperLocation(String operLocation) - { + public void setOperLocation(String operLocation) { this.operLocation = operLocation; } - public String getOperParam() - { + public String getOperParam() { return operParam; } - public void setOperParam(String operParam) - { + public void setOperParam(String operParam) { this.operParam = operParam; } - public String getJsonResult() - { + public String getJsonResult() { return jsonResult; } - public void setJsonResult(String jsonResult) - { + public void setJsonResult(String jsonResult) { this.jsonResult = jsonResult; } - public Integer getStatus() - { + public Integer getStatus() { return status; } - public void setStatus(Integer status) - { + public void setStatus(Integer status) { this.status = status; } - public String getErrorMsg() - { + public String getErrorMsg() { return errorMsg; } - public void setErrorMsg(String errorMsg) - { + public void setErrorMsg(String errorMsg) { this.errorMsg = errorMsg; } - public Date getOperTime() - { + public Date getOperTime() { return operTime; } - public void setOperTime(Date operTime) - { + public void setOperTime(Date operTime) { this.operTime = operTime; } - public Long getCostTime() - { + public Long getCostTime() { return costTime; } - public void setCostTime(Long costTime) - { + public void setCostTime(Long costTime) { this.costTime = costTime; } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("operId", getOperId()) + .append("title", getTitle()) + .append("businessType", getBusinessType()) + .append("businessTypes", getBusinessTypes()) + .append("method", getMethod()) + .append("requestMethod", getRequestMethod()) + .append("operatorType", getOperatorType()) + .append("operName", getOperName()) + .append("deptName", getDeptName()) + .append("operUrl", getOperUrl()) + .append("operIp", getOperIp()) + .append("operLocation", getOperLocation()) + .append("operParam", getOperParam()) + .append("status", getStatus()) + .append("errorMsg", getErrorMsg()) + .append("operTime", getOperTime()) + .toString(); + } } diff --git a/ruoyi-system/src/main/java/com/ruoyi/dhc/domain/read/EasyExcelConvert.java b/ruoyi-system/src/main/java/com/ruoyi/dhc/domain/read/EasyExcelConvert.java new file mode 100644 index 0000000..8e9ac14 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/dhc/domain/read/EasyExcelConvert.java @@ -0,0 +1,138 @@ +package com.ruoyi.dhc.domain.read; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.data.ReadCellData; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import com.ruoyi.dhc.domain.EnumFiledConvert; +import org.springframework.util.StringUtils; + +import java.lang.reflect.Field; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * excel导入导出针对枚举类型的转换器 + * + * @Author 996 + * @Date 2024/3/13 + */ +public class EasyExcelConvert implements Converter { + /** + * 枚举列表 + */ + private Map enumMap = new HashMap<>(); + + + /** + * excel转化后的类型 + * + * @return + */ + @Override + public Class supportJavaTypeKey() { + return Object.class; + } + + /** + * excel中的数据类型,统一设置字符串 + * + * @return + */ + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + /** + * 导入转换 + * @param cellData 当前单元格对象 + * @param contentProperty 当前单元格属性 + * @param globalConfiguration + * @return + * @throws Exception + */ + @Override + public Object convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { + String cellMsg = cellData.getStringValue(); + Field field = contentProperty.getField(); + EnumFiledConvert enumFiledConvert = field.getAnnotation(EnumFiledConvert.class); + if (enumFiledConvert == null) { + return null; + } + String enumStr = enumFiledConvert.enumMap(); + // 解析枚举映射关系 + getEnumMap(enumStr, true); + // 是否为单选 + boolean single = enumFiledConvert.single(); + // 如果是单选,默认Java属性为integer + if (single) { + String res = enumMap.get(cellMsg); + return StringUtils.hasText(res) ? Integer.valueOf(res) : null; + } else { + // 多选分隔符 + String spiteChar = enumFiledConvert.spiteChar(); + // 多选枚举,默认Java属性为字符串,格式为 key1,key2,key3 + List strStr = Arrays.asList(cellMsg.split(spiteChar)).stream().map(s -> String.valueOf(enumMap.get(s))).collect(Collectors.toList()); + String str = String.join(spiteChar, strStr); + return str; + } + } + + /** + * 导出转化 + * @param value 当前值 + * @param contentProperty 当前单元格属性 + * @param globalConfiguration + * @return + * @throws Exception + */ + @Override + public WriteCellData convertToExcelData(Object value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { + Field field = contentProperty.getField(); + EnumFiledConvert enumFiledConvert = field.getAnnotation(EnumFiledConvert.class); + if (enumFiledConvert == null) { + return new WriteCellData(); + } + // 解析枚举字符串 + String enumStr = enumFiledConvert.enumMap(); + getEnumMap(enumStr, false); + // 是否为单选 + boolean single = enumFiledConvert.single(); + // 如果是单选,默认Java属性为integer + if (single) { + return new WriteCellData(enumMap.getOrDefault(String.valueOf(value), "")); + } else { + // 多选分隔符 + String spiteChar = enumFiledConvert.spiteChar(); + // 多选枚举,默认Java属性为字符串,格式为 key1,key2,key3 + List strStr = Arrays.asList(String.valueOf(value).split(spiteChar)).stream().map(s -> String.valueOf(enumMap.get(s))).collect(Collectors.toList()); + String str = String.join(spiteChar, strStr); + return new WriteCellData(str); + } + } + + /** + * 根据注解配置的枚举映射字符串进行解析到map中 + * @param mapStr + * @param readOrWrite 读excel 、 写excel + */ + private void getEnumMap(String mapStr, boolean readOrWrite) { + String[] enumS = mapStr.split(","); + for (String anEnum : enumS) { + String[] data = anEnum.split("-"); + if (readOrWrite) { + // 读excel excel中的数据都是value,转换成key + enumMap.put(data[1], data[0]); + } else { + // 写excel Java中的数据都是key,转换成value + enumMap.put(data[0], data[1]); + } + } + } +} \ No newline at end of file