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 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 jakarta.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Field;
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 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 = HttpContextUtils.getHttpServletResponse();
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
// 这里URLEncoder.encode可以防止中文乱码 当然和easy excel没有关系
String fileName = URLUtil.encode(excelName).replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
EasyExcel.write(response.getOutputStream(), head).sheet(StringUtils.isBlank(sheetName) ? "sheet1" : sheetName).doWrite(data);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* 解析字典数据到字段上
* 比如 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.getUnTransMap().get(trans.key() + "_" + ref.get(data));
if (StringUtils.isBlank(value)) {
continue;
}
// 一般目标字段是int或者string字段 后面有添加单独抽离方法
if (Integer.class.equals(field.getType())) {
field.setAccessible(true);
field.set(data, ConverterUtils.toInteger(value));
} else {
field.setAccessible(true);
field.set(data, ConverterUtils.toString(value));
}
}
}
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
maku-cloud 微服务 是采用SpringCloud 2022、SpringBoot 3.0、SpringSecurity 6.0、Nacos、Mybatis-Plus、Redis等框架,开发的一套微服务快速开发系统,使用门槛极低,且采用MIT开源协议,完全免费开源,可免费用于商业项目等场景。
资源推荐
资源详情
资源评论
收起资源包目录
一套SpringCloud低代码开发平台,使用门槛极低,且采用MIT开源协议,完全免费开源 (361个子文件)
Dockerfile 416B
app.env 54B
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 298B
ExcelUtils.java 7KB
HuaweiSmsStrategy.java 7KB
SysUserServiceImpl.java 7KB
IpUtils.java 6KB
SysDictTypeServiceImpl.java 6KB
ScheduleUtils.java 5KB
SysUserController.java 5KB
SysParamsServiceImpl.java 5KB
SysRoleController.java 5KB
SysAuthServiceImpl.java 4KB
ScheduleJobServiceImpl.java 4KB
CacheController.java 4KB
MobileAuthenticationProvider.java 4KB
ScheduleJobController.java 4KB
SysRoleServiceImpl.java 4KB
SmsPlatformController.java 4KB
RedisCache.java 4KB
BaseServiceImpl.java 3KB
SysMenuServiceImpl.java 3KB
SysOrgServiceImpl.java 3KB
ArityUtil.java 3KB
SysLogLoginServiceImpl.java 3KB
SysMenuController.java 3KB
SysUserDetailsServiceImpl.java 3KB
SmsService.java 3KB
XssRequestWrapper.java 3KB
SmsPlatformServiceImpl.java 3KB
SysUserRoleServiceImpl.java 3KB
SysDictTypeController.java 3KB
Server.java 3KB
DataScopeInnerInterceptor.java 3KB
AbstractScheduleJob.java 3KB
SysPostServiceImpl.java 3KB
TencentSmsStrategy.java 3KB
SysUserVO.java 3KB
ScheduleConfig.java 3KB
SecurityConfig.java 3KB
SysPostController.java 2KB
StorageProperties.java 2KB
SysCaptchaServiceImpl.java 2KB
MinioStorageService.java 2KB
SysRoleDataScopeServiceImpl.java 2KB
SysDictDataController.java 2KB
SysAttachmentServiceImpl.java 2KB
SysUserPostServiceImpl.java 2KB
SysRoleMenuServiceImpl.java 2KB
SysParamsController.java 2KB
SecurityFilterConfig.java 2KB
Jvm.java 2KB
SysDictDataServiceImpl.java 2KB
SysOrgController.java 2KB
CorsConfig.java 2KB
TencentStorageService.java 2KB
StorageService.java 2KB
AuthenticationTokenFilter.java 2KB
UserDetail.java 2KB
AliyunSmsStrategy.java 2KB
SysAuthController.java 2KB
JsonUtils.java 2KB
SysLogLoginVO.java 2KB
HttpContextUtils.java 2KB
RedisConfig.java 2KB
ServerController.java 2KB
PermitResource.java 2KB
FieldMetaObjectHandler.java 2KB
SysParamsCache.java 2KB
ScheduleJobLogServiceImpl.java 2KB
ScheduleJobLogController.java 2KB
TreeUtils.java 2KB
SysAttachmentController.java 2KB
SwaggerConfig.java 2KB
QiniuStorageService.java 2KB
SysUserExcelVO.java 2KB
MobileAuthenticationToken.java 2KB
SmsLogController.java 2KB
StorageConfiguration.java 2KB
SysMenuVO.java 2KB
SmsLogServiceImpl.java 2KB
SysFileUploadController.java 2KB
ExcelDataListener.java 2KB
SmsApiImpl.java 2KB
MybatisPlusConfig.java 2KB
SysDictTypeVO.java 2KB
SysLogLoginController.java 2KB
共 361 条
- 1
- 2
- 3
- 4
资源评论
- niuyongzljtoo2023-06-21感谢资源主的分享,这个资源对我来说很有用,内容描述详尽,值得借鉴。
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6832
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功