java使用@interface和反射来动态生成excel

1、对象类上搞注解

public class ReportExecuteDetailDto {

// 项目信息

private String regionCode; // 大区编号

@ExcelColumn(order = 0, title = "大区")

private String regionName; // 大区名称

@ExcelColumn(order = 14, title = "行申请金额", dataType = ExcelColumn.FieldType.Number)

private BigDecimal detailApplyAmount; // 行申请金额

}

2、创建注解类

package cn.com.ibm.portal.subject.annotation;

import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)

@Target(ElementType.FIELD)

@Documented

public @interface ExcelColumn {

/**

* 标注该属性的顺序

* @return 该属性的顺序

*/

int order();

/**

* execl标题

* @return

*/

String title();

/**

* 日期数据的格式化格式

* @return

*/

String format() default "";

/**

* 单元格宽度

* @return

*/

int width() default 30;

/**

* 是否设置默认值:字符串默认为""

* Number:0.00

* Date: now

* Percent: 0.00%

*/

boolean hasDefault() default false;

/**

* 数据类型

* @return

*/

FieldType dataType() default FieldType.String;

public static enum FieldType {

/*

字符串

*/

String,

/*

数值

*/

Number,

/*

日期

*/

Date,

/*

百分比

*/

Percent;

}

}

3、获取属性

private static List<Field> getExcelColumnAnnotation(Class clazz) {

// 用来存放所有的属性域

List<Field> fieldList = Lists.newArrayList();

// 过滤带有注解的Field

for (Field f : clazz.getDeclaredFields()) {

if (f.getAnnotation(ExcelColumn.class) != null) {

fieldList.add(f);

}

}

// 这个比较排序的语法依赖于java 1.8

fieldList.sort(Comparator.comparingInt(

m -> m.getAnnotation(ExcelColumn.class).order()

));

return fieldList;

}

4、使用

private static List<PoiCellVo> genExecuteReportTitleData(ReportExecuteDto dto, int startRow, int startCol) {

List<PoiCellVo> result = Lists.newArrayList();

//添加固定标题

int fixStartRow = startRow;

int fixStartCol = startCol;

// 根据注解获取标题

List<Field> annotationList = getExcelColumnAnnotation(ReportExecuteDetailDto.class);

PoiCellVo fixVo = null;

ExcelColumn annotation = null;

for (Field field : annotationList) {

annotation = field.getAnnotation(ExcelColumn.class);

if (annotation == null) {

continue;

}

fixVo = new PoiCellVo(annotation.title(), fixStartRow, fixStartCol, 1, 1, headerColor, (short) annotation.width(), (short) 0);

result.add(fixVo);

fixStartCol++;

}

return result;

}

相关推荐
小羊没烦恼!4 分钟前
Windows Azure Platform体验(1):Windows Azure
java·大数据·后端·python·flask·word·.net
JWASX7 分钟前
【agent 开发】agent 开发学习 - LangChain(1)
python·学习·agent
kakakahahahaha10 分钟前
Windows 10禁用自动更新:gpedit、services.msc、计划任务与风险边界
windows·驱动开发·电脑·笔记本电脑·软件需求·windows系统更新
suaizai_12 分钟前
ComputerUse:让AI真正操控桌面系统
java·前端·javascript
jason.zeng@150220712 分钟前
(五)多轮对话上下文,实现交互。
python·交互·llama
wangchunyu11413 分钟前
食韵味简 —— 免费开源的中式菜谱 API 服务
python·django·开源
znx93913 分钟前
因子分析:量化交易的底层核心与盈利逻辑基石
人工智能·python·机器学习·期魔方
jason.zeng@150220719 分钟前
(十)分层架构的多文件工程
python·架构·prompt·交互·ai编程·llama
小小张说故事19 分钟前
Python 装饰器到底是个啥?从 @ 符号到手写一个,5 个例子讲透
后端·python
fundoit23 分钟前
资源服务器如何对 JWT 进行验签
java·运维·服务器·spring boot·php·oauth2