多个列表参数一一对应使用枚举

1、业务背景

写这个东西的初衷是因为在我们的系统中有一个报表导出功能,在报表导出时,会定义三个列表的数据,如下图所示:

在这里插入图片描述

和明显,上面这种定义参数的形式,现在看起来还好,如果有十几个,二十几个参数,而且这种情况在报表中是非常常见的,十几个列一般都是会有的,那写起来就会非常乱,所以我定义了以下的规则来约束这种比较乱的参数定义方式。代码如下:

2、代码

2.1、pom文件

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

2.2、工具类

public interface ReportTitle {
    /**
     * 报表的数据列名称
     * @return 返回报表的数据列名称
     */
    String getColumn();

    /**
     * 报表的列中文名称
     * @return 返回报表的列中文名称
     */
    String getName();

    /**
     * 报表的每列占excel尺寸
     * @return 返回报表的每列占屏尺寸
     */
    Integer getSize();
}
/**
 * 报表枚举工具类
 *
 * @author 杜佳乐
 * @date 2022/11/03  20:39:52
 */
@Slf4j
public class ReportUtil {

    /**
     * 导出头部分类
     * 将枚举类转换成两个数组,为了使得报表的中文列名、英文列名、列尺寸相互对应
     * @param enumModel 枚举实体类class
     * @return 返回转换之后的两列名称
     */
    public static ReportTitleDTO exportTitleSort(Object enumModel) {
        // 定义返回的头列表模型 
        ReportTitleDTO reportTitleDTO = new ReportTitleDTO();
        // 定义解析出来的枚举类数据临时变量 
        ReportTitle[] reportTitles = null;
        try {
            Method valuesMethod = ((Class) enumModel).getDeclaredMethod("values");
            // 通过反射取出对应的属性列表 
            reportTitles = (ReportTitle[]) valuesMethod.invoke(enumModel);
        } catch (Exception e) {
            log.error("枚举映射出现异常,异常信息为:{}", e);
        }
        // 如果为空,则返回 
        if (null == reportTitles) {
            return reportTitleDTO;
        }

        int exportTitleLength = reportTitles.length;
        // 定义 titleColumnList 报表的数据列名称列表 
        List<String> titleColumnList = new ArrayList<>(exportTitleLength);
        // 定义 titleNameList 报表的列中文名称列表 
        List<String> titleNameList = new ArrayList<>(exportTitleLength);
        // 定义 titleSizeList 报表的每列占excel尺寸列表 
        List<Integer> titleSizeList = new ArrayList<>(exportTitleLength);
        for (ReportTitle recordEnum : reportTitles) {
            titleColumnList.add(recordEnum.getColumn());
            titleNameList.add(recordEnum.getName());
            titleSizeList.add(recordEnum.getSize());
        }
        // 组装返回模型并返回 
        reportTitleDTO.setTitleColumnList(titleColumnList.toArray(new String[0]));
        reportTitleDTO.setTitleNameList(titleNameList.toArray(new String[0]));
        reportTitleDTO.setTitleSizeList(Ints.toArray(titleSizeList));
        return reportTitleDTO;
    }

}

@Data
public class ReportTitleDTO {
    /**
     * 报表的数据列名称
     */
    private String[] titleColumnList;

    /**
     * 报表的列中文名称
     */
    private String[] titleNameList;

    /**
     * 报表的每列占excel尺寸
     */
    private int[] titleSizeList;
}

2.3、测试类

@AllArgsConstructor
public enum ReportEnum implements ReportTitle {
    /**
     * ID
     */
    ID("id","唯一键",5),

    /**
     * 姓名
     */
    NAME("name","姓名",10),

    /**
     * 电话
     */
    TEL_NO("telNo","电话",15),

    ;
    /**
     * 报表的数据列名称
     */
    String column;

    /**
     * 报表的列中文名称
     */
    String name;

    /**
     * 报表的每列占excel尺寸
     */
    Integer size;

    @Override
    public String getColumn() {
        return column;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public Integer getSize() {
        return size;
    }
}
public class ReportTest {
    public static void main(String[] args) {
        ReportTitleDTO reportTitleDTO = ReportUtil.exportTitleSort(ReportEnum.class);

        System.out.println(reportTitleDTO);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值