package net.maku.framework.common.utils;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.fhs.common.utils.ConverterUtils;
import com.fhs.core.trans.anno.Trans;
import com.fhs.core.trans.constant.TransType;
import com.fhs.core.trans.util.ReflectUtils;
import com.fhs.core.trans.vo.TransPojo;
import com.fhs.trans.service.impl.DictionaryTransService;
import jakarta.servlet.http.HttpServletResponse;
import lombok.SneakyThrows;
import net.maku.framework.common.excel.ExcelDataListener;
import net.maku.framework.common.excel.ExcelFinishCallBack;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.stream.Collectors;
/**
* The type Excel utils.
* {@link <a href="https://easyexcel.opensource.alibaba.com/"></a>}
*
* @author eden
*/
public class ExcelUtils {
/**
* 读取excel文件
*
* @param <T> 数据类型
* @param file excel文件
* @param head 列名
* @param callBack 回调 导入时传入定义好的回调接口,excel数据解析完毕之后监听器将数据传入回调函数
* 这样调用工具类时可以通过回调函数获取导入的数据,如果数据量过大可根据实际情况进行分配入库
*/
public static <T> void readAnalysis(MultipartFile file, Class<T> head, ExcelFinishCallBack<T> callBack) {
try {
EasyExcel.read(file.getInputStream(), head, new ExcelDataListener<>(callBack)).sheet().doRead();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 读取excel文件
*
* @param <T> 数据类型
* @param file excel文件
* @param head 列名
* @param callBack 回调 导入时传入定义好的回调接口,excel数据解析完毕之后监听器将数据传入回调函数
* 这样调用工具类时可以通过回调函数获取导入的数据,如果数据量过大可根据实际情况进行分配入库
*/
public static <T> void readAnalysis(File file, Class<T> head, ExcelFinishCallBack<T> callBack) {
try {
EasyExcel.read(new FileInputStream(file), head, new ExcelDataListener<>(callBack)).sheet().doRead();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 读取excel文件 同步
*
* @param <T> 数据类型
* @param file 文件
* @param clazz 模板类
* @return java.util.List
*/
public static <T> List<T> readSync(File file, Class<T> clazz) {
return readSync(file, clazz, 1, 0, ExcelTypeEnum.XLSX);
}
/**
* 读取excel文件 同步
*
* @param <T> 数据类型
* @param file 文件
* @param clazz 模板类
* @param rowNum 数据开始行 1
* @param sheetNo 第几张表
* @param excelType 数据表格式类型
* @return java.util.List list
*/
public static <T> List<T> readSync(File file, Class<T> clazz, Integer rowNum, Integer sheetNo, ExcelTypeEnum excelType) {
return EasyExcel.read(file).headRowNumber(rowNum).excelType(excelType).head(clazz).sheet(sheetNo).doReadSync();
}
/**
* 导出数据到文件
*
* @param <T> 数据类型
* @param head 类名
* @param file 导入到文件
* @param data 数据
*/
public static <T> void excelExport(Class<T> head, File file, List<T> data) {
excelExport(head, file, "sheet1", data);
}
/**
* 导出数据到文件
*
* @param <T> 写入格式
* @param head 类名
* @param file 写入到文件
* @param sheetName sheet名称
* @param data 数据列表
*/
public static <T> void excelExport(Class<T> head, File file, String sheetName, List<T> data) {
try {
EasyExcel.write(file, head).sheet(sheetName).doWrite(data);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 导出数据到web
* 文件下载(失败了会返回一个有部分数据的Excel)
*
* @param head 类名
* @param excelName excel名字
* @param sheetName sheet名称
* @param data 数据
*/
public static <T> void excelExport(Class<T> head, String excelName, String sheetName, List<T> data) {
try {
HttpServletResponse response = getExportResponse(excelName);
EasyExcel.write(response.getOutputStream(), head).sheet(StringUtils.isBlank(sheetName) ? "sheet1" : sheetName).doWrite(data);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 导出数据到web
* 文件下载(失败了会返回一个有部分数据的Excel)
*
* @param head 类名
* @param excelName excel名字
* @param sheetName sheet名称
* @param data 数据
*/
public static <T> void excelExport(List<List<String>> head, String excelName, String sheetName, List<T> data) {
try {
HttpServletResponse response = getExportResponse(excelName);
EasyExcel.write(response.getOutputStream()).head(head).sheet(StringUtils.isBlank(sheetName) ? "sheet1" : sheetName).doWrite(data);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private static HttpServletResponse getExportResponse(String excelName) {
HttpServletResponse response = HttpContextUtils.getHttpServletResponse();
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
response.setCharacterEncoding("UTF-8");
String fileName = URLUtil.encode(excelName, StandardCharsets.UTF_8);
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
return response;
}
/**
* 解析字典数据到字段上
* 比如 T中有 genderLabel字段 为男 需要给 gender 字段自动设置为0
*
* @param dataList 需要被反向解析的数据
*/
@SneakyThrows
public static <T extends TransPojo> void parseDict(List<T> dataList) {
//没有数据就不需要初始化
if (CollectionUtil.isEmpty(dataList)) {
return;
}
Class<? extends TransPojo> clazz = dataList.get(0).getClass();
//拿到所有需要反向翻译的字段
List<Field> fields = ReflectUtils.getAnnotationField(clazz, Trans.class);
//过滤出字典翻译
fields = fields.stream().filter(field -> TransType.DICTIONARY.equals(field.getAnnotation(Trans.class).type())).collect(Collectors.toList());
DictionaryTransService dictionaryTransService = SpringUtil.getBean(DictionaryTransService.class);
for (T data : dataList) {
for (Field field : fields) {
Trans trans = field.getAnnotation(Trans.class);
// key不能为空并且ref不为空的才自动处理
if (StrUtil.isAllNotBlank(trans.key(), trans.ref())) {
Field ref = ReflectUtils.getDeclaredField(clazz, trans.ref());
ref.setAccessible(true);
// 获取字典反向值
String value = dictionaryTransService.getDictionaryTransMap().get(trans.key() + "_" + ref.get(data));
if (StringUtils.isBlank(value)) {
continue;
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
采用SpringBoot3.1、SpringSecurity6.1、Mybatis-Plus等框架,开发的一套企业级低代码开发平台,使用门槛极低,且采用MIT开源协议,完全免费开源,可免费用于商业项目等场景,采用组件模式,扩展不同的业务功能,可以很方便的实现各种业务需求,且不会导致系统臃肿,若想使用某个组件,按需引入即可,反之亦然。支持Online在线表单开发,可快速开发业务,无需部署及重启服务等优点
资源推荐
资源详情
资源评论
收起资源包目录
基于SpringBoot3.1SpringSecurity6.1Mybatis-Plus等框架,开发的一套企业级低代码开发平台 (371个子文件)
Dockerfile 418B
add-or-update.vue.ftl 5KB
index.vue.ftl 4KB
Controller.java.ftl 3KB
ServiceImpl.java.ftl 2KB
menu.sql.ftl 2KB
Entity.java.ftl 1KB
VO.java.ftl 798B
Service.java.ftl 686B
Query.java.ftl 661B
Convert.java.ftl 637B
Dao.xml.ftl 464B
api.ts.ftl 386B
Dao.java.ftl 359B
.gitignore 304B
ExcelUtils.java 8KB
HuaweiSmsStrategy.java 7KB
SysUserServiceImpl.java 7KB
OperateLogAspect.java 6KB
IpUtils.java 6KB
SysDictTypeServiceImpl.java 6KB
SysUserTokenServiceImpl.java 6KB
SysUserController.java 6KB
SysRoleController.java 5KB
ScheduleUtils.java 5KB
SysParamsServiceImpl.java 5KB
SysAuthServiceImpl.java 5KB
SecurityConfig.java 5KB
SysRoleServiceImpl.java 4KB
ScheduleJobServiceImpl.java 4KB
ScheduleJobController.java 4KB
CacheController.java 4KB
SmsPlatformController.java 4KB
MobileAuthenticationProvider.java 4KB
RedisCache.java 4KB
SysMenuController.java 4KB
SysOrgServiceImpl.java 4KB
SysMenuServiceImpl.java 4KB
SysDictTypeController.java 4KB
SysLogOperateServiceImpl.java 3KB
BaseServiceImpl.java 3KB
SysUserRoleServiceImpl.java 3KB
ArityUtil.java 3KB
SysLogLoginServiceImpl.java 3KB
SysUserDetailsServiceImpl.java 3KB
SmsService.java 3KB
XssRequestWrapper.java 3KB
SmsPlatformServiceImpl.java 3KB
Server.java 3KB
AbstractScheduleJob.java 3KB
DataScopeInnerInterceptor.java 3KB
SysPostServiceImpl.java 3KB
UserOnlineController.java 3KB
SysPostController.java 3KB
TencentSmsStrategy.java 3KB
SysUserVO.java 3KB
SysDictDataController.java 3KB
SysParamsController.java 3KB
SysOrgController.java 3KB
ScheduleConfig.java 3KB
SysAuthController.java 3KB
StorageProperties.java 2KB
HttpContextUtils.java 2KB
MinioStorageService.java 2KB
SysRoleDataScopeServiceImpl.java 2KB
SysAttachmentServiceImpl.java 2KB
SysUserPostServiceImpl.java 2KB
SysRoleMenuServiceImpl.java 2KB
SysCaptchaServiceImpl.java 2KB
JacksonConfig.java 2KB
Jvm.java 2KB
EasyExcelTest.java 2KB
SysDictDataServiceImpl.java 2KB
TencentStorageService.java 2KB
StorageService.java 2KB
AuthenticationTokenFilter.java 2KB
UserDetail.java 2KB
JsonUtils.java 2KB
AliyunSmsStrategy.java 2KB
SysLogLoginVO.java 2KB
SysAttachmentController.java 2KB
ServerController.java 2KB
PermitResource.java 2KB
FieldMetaObjectHandler.java 2KB
ScheduleJobLogServiceImpl.java 2KB
ScheduleJobLogController.java 2KB
TreeUtils.java 2KB
SysFileUploadController.java 2KB
TokenStoreCache.java 2KB
QiniuStorageService.java 2KB
SmsLogController.java 2KB
SysUserExcelVO.java 2KB
MobileAuthenticationToken.java 2KB
SysLogLoginController.java 2KB
SysMenuVO.java 2KB
SysLogOperateVO.java 2KB
StorageConfiguration.java 2KB
SmsLogServiceImpl.java 2KB
ExcelDataListener.java 2KB
SysLogOperateEntity.java 2KB
共 371 条
- 1
- 2
- 3
- 4
资源评论
- we12341232024-01-02资源很不错,内容和描述一致,值得借鉴,赶紧学起来!
- msb00072024-01-11资源中能够借鉴的内容很多,值得学习的地方也很多,大家一起进步!
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6656
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功