若依系统中实体类导出字段使用了@Execl 如不是若依系统 最后附有excel接口
普通导出:
@Excel(name = "单位")
private String unit;
带字典解析导出:
@Excel(name = "状态", dictType = "sys_true_false")
private Integer attributeCategory;
系统后台字典配置:
新增的字典也会存在redis缓存中(直接查询缓存或mysql都行)
带上注解导出后 通过实体类即可获取要导出的字段 无需再写导出的string数组
目录
获取导出字段
导出样式
//Test为你的实体类
//提前取表头 和引用字典
List<String> chineseNameList = new ArrayList<>();
List<String> englishNameList = new ArrayList<>();
//英文字段 字典名
Map<String, String> dictTypeMap = new HashMap<>();
Field[] fs = Test.class.getDeclaredFields();
for (Field f : fs) {
Excel excel = f.getAnnotation(Excel.class);
if (excel != null) {
chineseNameList.add(excel.name());
englishNameList.add(f.getName());
String dictType = excel.dictType();
//获取配置dictType的字段
if (StringUtils.isNotEmpty(dictType)) {
dictTypeMap.put(f.getName(), dictType);
}
}
}
//用到字典的字段及解析
Map<String, List<SysDictData>> dictMap = new HashMap();
for (String key : dictTypeMap.keySet()) {
//字典值解析
List<SysDictData> sysDictData = DictUtils.getDictCache(dictTypeMap.get(key));
//key 英文字段名 value 这个字段的解析
dictMap.put(key, sysDictData);
}
//中文表头
String[] chineseTitle = chineseNameList.toArray(new String[chineseNameList.size()]);
//英文表头(字典解析使用)
String[] englishTitle = englishNameList.toArray(new String[englishNameList.size()]);
//使用方法 拿到数据list后 循环每行数据 对比每个字段
实例使用方法
/**
* 塞入数据+字典处理
*
* @param cyclesList 你的数据list
* @param fieldNameList 英文表头
* @param dictMap 字典map
* @return
*/
public List<List<String>> dictData(List<BasicFarmer> cyclesList, String[] fieldNameList, Map<String, List<SysDictData>> dictMap) {
List<Map> maps = JSON.parseArray(JSON.toJSONString(cyclesList), Map.class);
List<List<String>> exportData = new ArrayList<>();
//循环查询出的数据
for (Map map : maps) {
List<String> value = new ArrayList<>();
//根据需要的字段塞入数据
for (String s : fieldNameList) {
if (map.get(s) != null) {
String parseValue = map.get(s).toString();
//如果字典中包含了这个字段
if (dictMap.containsKey(s)) {
List<SysDictData> sysDictData = dictMap.get(s);
for (SysDictData sysDictDatum : sysDictData) {
//判断数据和字典值
if (map.get(s).toString().equals(sysDictDatum.getDictValue())) {
parseValue = sysDictDatum.getDictLabel();
}
}
value.add(parseValue);
continue;
}
value.add(parseValue);
} else {
value.add(null);
}
}
exportData.add(value);
}
return exportData;
}
其他方法
/**
* 获取字典缓存
*
* @param key 参数键
* @return dictDatas 字典数据列表
*/
public static List<SysDictData> getDictCache(String key) {
Object cacheObj = SpringUtils.getBean(RedisCache.class).getCacheObject(getCacheKey(key));
if (StringUtils.isNotNull(cacheObj)) {
return StringUtils.cast(cacheObj);
}
return null;
}
/**
* 获取类型为requiredType的对象
*
* @param clz
* @return
* @throws BeansException
*
*/
public static <T> T getBean(Class<T> clz) throws BeansException
{
T result = (T) beanFactory.getBean(clz);
return result;
}
/**
* 获得缓存的基本对象。
*
* @param key 缓存键值
* @return 缓存键值对应的数据
*/
public <T> T getCacheObject(final String key) {
ValueOperations<String, T> operation = redisTemplate.opsForValue();
return operation.get(key);
}
Excel接口
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.math.BigDecimal;
import com.hnxr.dsp.common.utils.poi.ExcelHandlerAdapter;
/**
* 自定义导出Excel数据注解
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Excel
{
/**
* 导出时在excel中排序
*/
public int sort() default Integer.MAX_VALUE;
/**
* 导出到Excel中的名字.
*/
public String name() default "";
/**
* 日期格式, 如: yyyy-MM-dd
*/
public String dateFormat() default "";
/**
* 如果是字典类型,请设置字典的type值 (如: sys_user_sex)
*/
public String dictType() default "";
/**
* 读取内容转表达式 (如: 0=男,1=女,2=未知)
*/
public String readConverterExp() default "";
/**
* 分隔符,读取字符串组内容
*/
public String separator() default ",";
/**
* BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化)
*/
public int scale() default -1;
/**
* BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN
*/
public int roundingMode() default BigDecimal.ROUND_HALF_EVEN;
/**
* 导出类型(0数字 1字符串)
*/
public ColumnType cellType() default ColumnType.STRING;
/**
* 导出时在excel中每个列的高度 单位为字符
*/
public double height() default 14;
/**
* 导出时在excel中每个列的宽 单位为字符
*/
public double width() default 16;
/**
* 文字后缀,如% 90 变成90%
*/
public String suffix() default "";
/**
* 当值为空时,字段的默认值
*/
public String defaultValue() default "";
/**
* 提示信息
*/
public String prompt() default "";
/**
* 设置只能选择不能输入的列内容.
*/
public String[] combo() default {};
/**
* 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写.
*/
public boolean isExport() default true;
/**
* 另一个类中的属性名称,支持多级获取,以小数点隔开
*/
public String targetAttr() default "";
/**
* 是否自动统计数据,在最后追加一行统计数据总和
*/
public boolean isStatistics() default false;
/**
* 导出字段对齐方式(0:默认;1:靠左;2:居中;3:靠右)
*/
public Align align() default Align.AUTO;
/**
* 自定义数据处理器
*/
public Class<?> handler() default ExcelHandlerAdapter.class;
/**
* 自定义数据处理器参数
*/
public String[] args() default {};
public enum Align
{
AUTO(0), LEFT(1), CENTER(2), RIGHT(3);
private final int value;
Align(int value)
{
this.value = value;
}
public int value()
{
return this.value;
}
}
/**
* 字段类型(0:导出导入;1:仅导出;2:仅导入)
*/
Type type() default Type.ALL;
public enum Type
{
ALL(0), EXPORT(1), IMPORT(2);
private final int value;
Type(int value)
{
this.value = value;
}
public int value()
{
return this.value;
}
}
public enum ColumnType
{
NUMERIC(0), STRING(1), IMAGE(2);
private final int value;
ColumnType(int value)
{
this.value = value;
}
public int value()
{
return this.value;
}
}
}
方法适用若依系统 和内部的@Excel方法
大家根据需求调整代码
有遇到什么问题可以留言告诉我哦 欢迎评论区讨论😪