keys = SpringUtils.getBean(RedisCache.class).keys(Constants.SYS_DICT_KEY + "*");
+ SpringUtils.getBean(RedisCache.class).deleteObject(keys);
+ }
+
+ /**
+ * 设置cache key
+ *
+ * @param configKey 参数键
+ * @return 缓存键key
+ */
+ public static String getCacheKey(String configKey)
+ {
+ return Constants.SYS_DICT_KEY + configKey;
+ }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/IDGenerator.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/IDGenerator.java
new file mode 100644
index 000000000..0406748df
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/IDGenerator.java
@@ -0,0 +1,104 @@
+package org.dromara.common.core.utils;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Created by yangyincong on 15/8/16.
+ * ID生成器 workId (1~4)
+ */
+public class IDGenerator {
+ private final static Logger logger = LoggerFactory.getLogger(IDGenerator.class);
+ private final static long twepoch = 1361753741828L;
+ private final static long workerIdBits = 4L;
+ private final static long maxWorkerId = -1L ^ -1L << workerIdBits;
+ private final static long sequenceBits = 10L;
+ private long workerId;
+ private long sequence = 0L;
+
+ private final static long workerIdShift = sequenceBits;
+ private final static long timestampLeftShift = sequenceBits + workerIdBits;
+ private final static long sequenceMask = -1L ^ -1L << sequenceBits;
+
+ private long lastTimestamp = -1L;
+
+ private IDGenerator(final long workerId) {
+ super();
+ this.workerId = workerId;
+ }
+
+ public static long generateMinId(int wid, long time) {
+ return (time - twepoch << timestampLeftShift) | (wid << workerIdShift);
+ }
+
+ public synchronized long nextId() {
+ long timestamp = this.timeGen();
+ if (this.lastTimestamp == timestamp) {
+ this.sequence = (this.sequence + 1) & sequenceMask;
+ if (this.sequence == 0) {
+ timestamp = this.tilNextMillis(this.lastTimestamp);
+ }
+ } else {
+ this.sequence = 0;
+ }
+ if (timestamp < this.lastTimestamp) {
+ try {
+ throw new Exception(
+ String.format(
+ "Clock moved backwards. Refusing to generate id for %d milliseconds",
+ this.lastTimestamp - timestamp));
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ this.lastTimestamp = timestamp;
+ long nextId = ((timestamp - twepoch << timestampLeftShift))
+ | (this.workerId << workerIdShift) | (this.sequence);
+ return nextId;
+ }
+
+ public static long generateMaxId(long wid, long time) {
+ return (time - twepoch << timestampLeftShift) | (wid << workerIdShift) | sequenceMask;
+ }
+
+ private long tilNextMillis(final long lastTimestamp) {
+ long timestamp = this.timeGen();
+ while (timestamp <= lastTimestamp) {
+ timestamp = this.timeGen();
+ }
+ return timestamp;
+ }
+
+ private long timeGen() {
+ return System.currentTimeMillis();
+ }
+
+ private static IDGenerator generator;
+
+ public static synchronized void init(Long workerId) throws Exception {
+ workerId = workerId % maxWorkerId;
+ logger.info("程序中init的workid为:{}", workerId);
+ if (workerId > maxWorkerId || workerId < 0) {
+ throw new IllegalArgumentException(String.format(
+ "worker Id can't be greater than %d or less than 0",
+ IDGenerator.maxWorkerId));
+ }
+ generator = new IDGenerator(workerId);
+ }
+
+ public static Long generateId() {
+ if (null == generator) {
+ synchronized (IDGenerator.class) {
+ if (null == generator) {
+ try {
+ init(2L);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ return generator.nextId();
+ }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ImageUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ImageUtils.java
new file mode 100644
index 000000000..db9cb481c
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/ImageUtils.java
@@ -0,0 +1,101 @@
+package org.dromara.common.core.utils;
+
+import org.apache.poi.util.IOUtils;
+import org.dromara.common.core.config.RuoYiConfig;
+import org.dromara.common.core.domain.event.Constants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Arrays;
+
+/**
+ * 图片处理工具类
+ *
+ * @author ruoyi
+ */
+public class ImageUtils
+{
+ private static final Logger log = LoggerFactory.getLogger(ImageUtils.class);
+
+ public static byte[] getImage(String imagePath)
+ {
+ InputStream is = getFile(imagePath);
+ try
+ {
+ return IOUtils.toByteArray(is);
+ }
+ catch (Exception e)
+ {
+ log.error("图片加载异常 {}", e);
+ return null;
+ }
+ finally
+ {
+ IOUtils.closeQuietly(is);
+ }
+ }
+
+ public static InputStream getFile(String imagePath)
+ {
+ try
+ {
+ byte[] result = readFile(imagePath);
+ result = Arrays.copyOf(result, result.length);
+ return new ByteArrayInputStream(result);
+ }
+ catch (Exception e)
+ {
+ log.error("获取图片异常 {}", e);
+ }
+ return null;
+ }
+
+ /**
+ * 读取文件为字节数据
+ *
+ * @param key 地址
+ * @return 字节数据
+ */
+ public static byte[] readFile(String url)
+ {
+ InputStream in = null;
+ ByteArrayOutputStream baos = null;
+ try
+ {
+ if (url.startsWith("http"))
+ {
+ // 网络地址
+ URL urlObj = new URL(url);
+ URLConnection urlConnection = urlObj.openConnection();
+ urlConnection.setConnectTimeout(30 * 1000);
+ urlConnection.setReadTimeout(60 * 1000);
+ urlConnection.setDoInput(true);
+ in = urlConnection.getInputStream();
+ }
+ else
+ {
+ // 本机地址
+ String localPath = RuoYiConfig.getProfile();
+ String downloadPath = localPath + StringUtils.substringAfter(url, Constants.RESOURCE_PREFIX);
+ in = new FileInputStream(downloadPath);
+ }
+ return IOUtils.toByteArray(in);
+ }
+ catch (Exception e)
+ {
+ log.error("获取文件路径异常 {}", e);
+ return null;
+ }
+ finally
+ {
+ IOUtils.closeQuietly(in);
+ IOUtils.closeQuietly(baos);
+ }
+ }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/PhoneUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/PhoneUtils.java
new file mode 100644
index 000000000..5530c9796
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/PhoneUtils.java
@@ -0,0 +1,14 @@
+package org.dromara.common.core.utils;
+
+/**
+ * 手机号工具类
+ */
+public class PhoneUtils {
+
+ public static String hidePhone(String phone){
+ if (StringUtils.isEmpty(phone) || phone.length() < 11){
+ throw new RuntimeException("手机号格式错误");
+ }
+ return phone.substring(0, 3) + "****" + phone.substring(7, 11);
+ }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SecurityUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SecurityUtils.java
new file mode 100644
index 000000000..693147004
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/SecurityUtils.java
@@ -0,0 +1,119 @@
+package org.dromara.common.core.utils;
+
+import org.dromara.common.core.constant.HttpStatus;
+import org.dromara.common.core.domain.model.LoginUser;
+import org.dromara.common.core.exception.ServiceException;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+
+/**
+ * 安全服务工具类
+ *
+ * @author ruoyi
+ */
+public class SecurityUtils
+{
+ private static BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
+ /**
+ * 用户ID
+ **/
+ public static Long getUserId()
+ {
+ try
+ {
+ return getLoginUser().getUserId();
+ }
+ catch (Exception e)
+ {
+ throw new ServiceException("获取用户ID异常", HttpStatus.UNAUTHORIZED);
+ }
+ }
+
+ /**
+ * 获取部门ID
+ **/
+ public static Long getDeptId()
+ {
+ try
+ {
+ return getLoginUser().getDeptId();
+ }
+ catch (Exception e)
+ {
+ throw new ServiceException("获取部门ID异常", HttpStatus.UNAUTHORIZED);
+ }
+ }
+
+ /**
+ * 获取用户账户
+ **/
+ public static String getUsername()
+ {
+ try
+ {
+ return getLoginUser().getUsername();
+ }
+ catch (Exception e)
+ {
+ throw new ServiceException("获取用户账户异常", HttpStatus.UNAUTHORIZED);
+ }
+ }
+
+ /**
+ * 获取用户
+ **/
+ public static LoginUser getLoginUser()
+ {
+ try
+ {
+ return (LoginUser) getAuthentication().getPrincipal();
+ }
+ catch (Exception e)
+ {
+ throw new ServiceException("获取用户信息异常", HttpStatus.UNAUTHORIZED);
+ }
+ }
+
+ /**
+ * 获取Authentication
+ */
+ public static Authentication getAuthentication()
+ {
+ return SecurityContextHolder.getContext().getAuthentication();
+ }
+
+ /**
+ * 生成BCryptPasswordEncoder密码
+ *
+ * @param password 密码
+ * @return 加密字符串
+ */
+ public static String encryptPassword(String password) {
+ return passwordEncoder.encode(password);
+ }
+
+ /**
+ * 判断密码是否相同
+ *
+ * @param rawPassword 真实密码
+ * @param encodedPassword 加密后字符
+ * @return 结果
+ */
+ public static boolean matchesPassword(String rawPassword, String encodedPassword)
+ {
+ BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
+ return passwordEncoder.matches(rawPassword, encodedPassword);
+ }
+
+ /**
+ * 是否为管理员
+ *
+ * @param userId 用户ID
+ * @return 结果
+ */
+ public static boolean isAdmin(Long userId)
+ {
+ return userId != null && 1L == userId;
+ }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java
index 0363ad4b5..90998a4ba 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/StringUtils.java
@@ -62,6 +62,40 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
return StrUtil.trim(str);
}
+
+ /**
+ * * 判断一个对象是否为空
+ *
+ * @param object Object
+ * @return true:为空 false:非空
+ */
+ public static boolean isNull(Object object)
+ {
+ return object == null;
+ }
+
+ /**
+ * * 判断一个对象是否非空
+ *
+ * @param object Object
+ * @return true:非空 false:空
+ */
+ public static boolean isNotNull(Object object)
+ {
+ return !isNull(object);
+ }
+
+ /**
+ * * 判断一个对象是否是数组类型(Java基本型别的数组)
+ *
+ * @param object 对象
+ * @return true:是数组 false:不是数组
+ */
+ public static boolean isArray(Object object)
+ {
+ return isNotNull(object) && object.getClass().isArray();
+ }
+
/**
* 截取字符串
*
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/FileTypeUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/FileTypeUtils.java
new file mode 100644
index 000000000..3a5246cc6
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/utils/file/FileTypeUtils.java
@@ -0,0 +1,77 @@
+package org.dromara.common.core.utils.file;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.File;
+
+/**
+ * 文件类型工具类
+ *
+ * @author ruoyi
+ */
+public class FileTypeUtils
+{
+ /**
+ * 获取文件类型
+ *
+ * 例如: ruoyi.txt, 返回: txt
+ *
+ * @param file 文件名
+ * @return 后缀(不含".")
+ */
+ public static String getFileType(File file)
+ {
+ if (null == file)
+ {
+ return StringUtils.EMPTY;
+ }
+ return getFileType(file.getName());
+ }
+
+ /**
+ * 获取文件类型
+ *
+ * 例如: ruoyi.txt, 返回: txt
+ *
+ * @param fileName 文件名
+ * @return 后缀(不含".")
+ */
+ public static String getFileType(String fileName)
+ {
+ int separatorIndex = fileName.lastIndexOf(".");
+ if (separatorIndex < 0)
+ {
+ return "";
+ }
+ return fileName.substring(separatorIndex + 1).toLowerCase();
+ }
+
+ /**
+ * 获取文件类型
+ *
+ * @param photoByte 文件字节码
+ * @return 后缀(不含".")
+ */
+ public static String getFileExtendName(byte[] photoByte)
+ {
+ String strFileExtendName = "JPG";
+ if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56)
+ && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97))
+ {
+ strFileExtendName = "GIF";
+ }
+ else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70))
+ {
+ strFileExtendName = "JPG";
+ }
+ else if ((photoByte[0] == 66) && (photoByte[1] == 77))
+ {
+ strFileExtendName = "BMP";
+ }
+ else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71))
+ {
+ strFileExtendName = "PNG";
+ }
+ return strFileExtendName;
+ }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/wechat/WechatPayData.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/wechat/WechatPayData.java
new file mode 100644
index 000000000..cdf98dd36
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/wechat/WechatPayData.java
@@ -0,0 +1,62 @@
+package org.dromara.common.core.wechat;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Data
+@ConfigurationProperties(prefix = "wechat")
+@Component("WechatPayData")
+public class WechatPayData {
+
+ /** 商户号 */
+ public static String appId;
+ public static String secret;
+ public static String merchantId;
+ /** 商户API私钥路径 */
+ public static String privateKeyPath;
+ /** 商户证书序列号 */
+ public static String merchantSerialNumber;
+ /** 商户APIV3密钥 */
+ public static String apiV3key;
+ public static String notifyUrl;
+
+ public static String miniProgramAppId;
+ public static String miniProgramSecret;
+
+ public void setAppId(String appId) {
+ WechatPayData.appId = appId;
+ }
+
+ public void setSecret(String secret) {
+ WechatPayData.secret = secret;
+ }
+
+ public void setMerchantId(String merchantId) {
+ WechatPayData.merchantId = merchantId;
+ }
+
+ public void setPrivateKeyPath(String privateKeyPath) {
+ WechatPayData.privateKeyPath = privateKeyPath;
+ }
+
+ public void setMerchantSerialNumber(String merchantSerialNumber) {
+ WechatPayData.merchantSerialNumber = merchantSerialNumber;
+ }
+
+ public void setApiV3key(String apiV3key) {
+ WechatPayData.apiV3key = apiV3key;
+ }
+
+ public void setNotifyUrl(String notifyUrl) {
+ WechatPayData.notifyUrl = notifyUrl;
+ }
+
+ public void setMiniProgramAppId(String miniProgramAppId) {
+ WechatPayData.miniProgramAppId = miniProgramAppId;
+ }
+
+ public void setMiniProgramSecret(String miniProgramSecret) {
+ WechatPayData.miniProgramSecret = miniProgramSecret;
+ }
+}
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/wechat/WechatPayService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/wechat/WechatPayService.java
new file mode 100644
index 000000000..790130469
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/wechat/WechatPayService.java
@@ -0,0 +1,75 @@
+package org.dromara.common.core.wechat;
+
+import com.wechat.pay.java.service.payments.jsapi.JsapiService;
+import com.wechat.pay.java.service.payments.jsapi.model.Amount;
+import com.wechat.pay.java.service.payments.jsapi.model.Payer;
+import com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest;
+import com.wechat.pay.java.service.payments.jsapi.model.PrepayResponse;
+import com.wechat.pay.java.service.refund.RefundService;
+import com.wechat.pay.java.service.refund.model.AmountReq;
+import com.wechat.pay.java.service.refund.model.CreateRequest;
+import com.wechat.pay.java.service.refund.model.Refund;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.stereotype.Service;
+
+
+@Service
+@Slf4j
+@ConditionalOnProperty(prefix = "wechat", name = "enabled", havingValue = "true")
+public class WechatPayService {
+
+ @Autowired
+ private JsapiService service;
+
+ @Autowired
+ private RefundService refundService;
+
+ /**
+ * jsapi下单
+ * @param orderNo 订单号
+ * @param desc 订单描述
+ * @param totalAmount 总金额,单位:分
+ * @param openId 用户openid
+ * @return prepay_id
+ */
+ public String jsapiPay(String orderNo,String desc,Integer totalAmount,String openId, Long memberId,String appId){
+ PrepayRequest prepayRequest = new PrepayRequest();
+ prepayRequest.setAppid(appId);
+ prepayRequest.setMchid(WechatPayData.merchantId);
+ prepayRequest.setDescription(desc);
+ prepayRequest.setOutTradeNo(orderNo);
+ prepayRequest.setAttach(String.valueOf(memberId));
+ prepayRequest.setNotifyUrl(WechatPayData.notifyUrl);
+ Amount amount = new Amount();
+ amount.setTotal(totalAmount);
+ prepayRequest.setAmount(amount);
+ Payer payer = new Payer();
+ payer.setOpenid(openId);
+ prepayRequest.setPayer(payer);
+ PrepayResponse response = service.prepay(prepayRequest);
+ return response.getPrepayId();
+ }
+
+ public Refund refundPay(String refundId,String payId,String notifyUrl,Long refundAmount, Long totalAmount,String reason) {
+ //请求参数
+ CreateRequest request = new CreateRequest();
+ request.setReason(reason);
+ //设置退款金额 根据自己的实际业务自行填写
+ AmountReq amountReq = new AmountReq();
+ amountReq.setRefund(refundAmount);
+ amountReq.setTotal(totalAmount);
+ amountReq.setCurrency("CNY");
+ request.setAmount(amountReq);
+ //支付成功后回调回来的transactionId 按照实际情况填写
+ request.setOutTradeNo(payId);
+ //支付成功后回调回来的transactionId 按照实际情况填写
+ request.setOutRefundNo(refundId);
+ //退款成功的回调地址
+ request.setNotifyUrl(notifyUrl);
+ //发起请求,申请退款
+ return refundService.create(request);
+ }
+}
diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/Excel.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/Excel.java
index 0d8695302..25c8183fc 100644
--- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/Excel.java
+++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/annotation/Excel.java
@@ -1,6 +1,7 @@
package org.dromara.common.excel.annotation;
-import com.ruoyi.common.utils.poi.ExcelHandlerAdapter;
+
+import org.dromara.common.excel.utils.ExcelHandlerAdapter;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelHandlerAdapter.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelHandlerAdapter.java
new file mode 100644
index 000000000..3611d34ff
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelHandlerAdapter.java
@@ -0,0 +1,19 @@
+package org.dromara.common.excel.utils;
+
+/**
+ * Excel数据格式处理适配器
+ *
+ * @author ruoyi
+ */
+public interface ExcelHandlerAdapter
+{
+ /**
+ * 格式化
+ *
+ * @param value 单元格数据值
+ * @param args excel注解args参数组
+ *
+ * @return 处理后的值
+ */
+ Object format(Object value, String[] args);
+}
diff --git a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java
index 0e9569677..42cc27055 100644
--- a/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java
+++ b/ruoyi-common/ruoyi-common-excel/src/main/java/org/dromara/common/excel/utils/ExcelUtil.java
@@ -1,6 +1,8 @@
package org.dromara.common.excel.utils;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.exceptions.UtilException;
import cn.hutool.core.io.resource.ClassPathResource;
import cn.hutool.core.util.IdUtil;
import com.alibaba.excel.EasyExcel;
@@ -14,27 +16,122 @@ import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.formula.functions.T;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.ss.util.CellRangeAddressList;
+import org.apache.poi.util.IOUtils;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
+import org.apache.poi.xssf.usermodel.XSSFDataValidation;
+import org.dromara.common.core.config.RuoYiConfig;
+import org.dromara.common.core.utils.DateUtils;
+import org.dromara.common.core.utils.DictUtils;
+import org.dromara.common.core.utils.ImageUtils;
import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.core.utils.file.FileTypeUtils;
import org.dromara.common.core.utils.file.FileUtils;
+import org.dromara.common.excel.annotation.Excel;
+import org.dromara.common.excel.annotation.Excels;
import org.dromara.common.excel.convert.ExcelBigNumberConvert;
import org.dromara.common.excel.core.*;
import org.dromara.common.excel.handler.DataWriteHandler;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
+import java.io.*;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.util.*;
+import java.util.stream.Collectors;
/**
* Excel相关处理
*
* @author Lion Li
*/
-@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public class ExcelUtil {
+@Slf4j
+//@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public class ExcelUtil {
+
+ /**
+ * Excel sheet最大行数,默认65536
+ */
+ public static final int sheetSize = 65536;
+
+ /**
+ * 统计列表
+ */
+ private Map statistics = new HashMap();
+
+ /**
+ * 数字格式
+ */
+ private static final DecimalFormat DOUBLE_FORMAT = new DecimalFormat("######0.00");
+ /**
+ * 导入导出数据列表
+ */
+ private List list;
+
+ /**
+ * 工作表名称
+ */
+ private String sheetName;
+
+ /**
+ * 导出类型(EXPORT:导出数据;IMPORT:导入模板)
+ */
+ private Excel.Type type;
+
+ /**
+ * 标题
+ */
+ private String title;
+
+ /**
+ * 注解列表
+ */
+ private List