写这个东西的初衷是因为在我们的系统中有一个报表导出功能,在报表导出时,会定义三个列表的数据,如下图所示:
和明显,上面这种定义参数的形式,现在看起来还好,如果有十几个,二十几个参数,而且这种情况在报表中是非常常见的,十几个列一般都是会有的,那写起来就会非常乱,所以我定义了以下的规则来约束这种比较乱的参数定义方式。代码如下:
<dependency>
<groupId>com.google.guavagroupId>
<artifactId>guavaartifactId>
<version>31.0.1-jreversion>
dependency>
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;
}
@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);
}
}