若依@Excel注解自动获取导出字段,字典解析

若依系统中实体类导出字段使用了@Execl 如不是若依系统 最后附有excel接口

普通导出:

@Excel(name = "单位")

private String unit;

带字典解析导出:

@Excel(name = "状态", dictType = "sys_true_false")

private Integer attributeCategory;

系统后台字典配置:

新增的字典也会存在redis缓存中(直接查询缓存或mysql都行)

带上注解导出后 通过实体类即可获取要导出的字段 无需再写导出的string数组


若依@Excel注解自动获取导出字段,字典解析_第1张图片若依@Excel注解自动获取导出字段,字典解析_第2张图片

目录

获取导出字段

实例使用方法

其他方法

Excel类

获取导出字段

 导出样式

若依@Excel注解自动获取导出字段,字典解析_第3张图片

//Test为你的实体类
//提前取表头 和引用字典
List chineseNameList = new ArrayList<>();
List englishNameList = new ArrayList<>();
//英文字段 字典名
Map 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> dictMap = new HashMap();
for (String key : dictTypeMap.keySet()) {
    //字典值解析
    List 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> dictData(List cyclesList, String[] fieldNameList, Map> dictMap) {
        List maps = JSON.parseArray(JSON.toJSONString(cyclesList), Map.class);
        List> exportData = new ArrayList<>();
        //循环查询出的数据
        for (Map map : maps) {
            List value = new ArrayList<>();
            //根据需要的字段塞入数据
            for (String s : fieldNameList) {
                if (map.get(s) != null) {
                    String parseValue = map.get(s).toString();
                    //如果字典中包含了这个字段
                    if (dictMap.containsKey(s)) {
                        List 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 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 getBean(Class clz) throws BeansException
    {
        T result = (T) beanFactory.getBean(clz);
        return result;
    }

    /**
     * 获得缓存的基本对象。
     *
     * @param key 缓存键值
     * @return 缓存键值对应的数据
     */
    public  T getCacheObject(final String key) {
        ValueOperations 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方法

大家根据需求调整代码

有遇到什么问题可以留言告诉我哦 欢迎评论区讨论

你可能感兴趣的:(开发合集,java,servlet,mybatis)