整篇文章都比较抽象,项目用到了上百张excel模板,并且基于这些模板做数据采集、输出。单次导出文件的大小,平均是8G。性能要求较高。只能自己做一个工具,封装底层实现。
这篇文章,只是解决的一个小模块。因为百度、google都没有找到案例,所以,特别记录下
1 场景描述
自定义的Annotation如何使用?如果不设定默认值,那么所有的属性都需要声明,怎么设定默认值?
2 自定义Annotation
Write/Read Excel时,使用注解建立model、Excel模板、数据(数据库)之间的关系
为了简化问题,只考虑前两个节点,且,只考虑write。后面的内容都省略。
第一种情况,由于不需要填充数据,所以,也没必要建模,直接通过annotation,交由工具创建即可。
第二种情况,需要建模,具体的注解,要在模型上标注。
所以,只有第一种情况需要在annotation里直接声明。
2.1 Module
/**
* 一个业务模块,包含多张视图View<br/>
* 这些视图都在同一个文件夹里,不考虑Path
* @author Yuri
*
*/
public @interface Module {
String id();
String name();
View[] srcView() default {};
}
2.2 View
/**
* write时的视图。<br/>
* 逻辑上对应一个Excel,包含完整的业务逻辑。<br/>
* 如果数据量较大,需要拆分workbook/sheet,那么,view就特指理论上的一个Excel,不存在实体。<br/>
* 在回读Excel时,怎么确定sheet对应于模板中的哪一个?隐藏单元格?标题?sheet name?<br/>
* 都有缺陷,作为一个实际的功能,需要强制约束!<br/>
* 单独创建一个sheet“参数表”,将sheet id/name/标题等信息记录下来,回读时,根据参数表,即可确定对应的sheet<br/>
* write批次等数据也可以放在参数表里
*
* @author Yuri
*
*/
public @interface View {
String id();
/**
* excel name
* @return
*/
String name();
/**
* 原表
* @return
*/
//Sheet[] srcSheet() default {};
/**
* 顺序<br/>
* 虽然,windows下,文件默认是按照名称排序的。但,显示在界面上(项目),这些文件名,肯定是有顺序的
* @return
*/
int order();
}
2.3 默认值
基础类型Integer/String/Class…的默认值在网上有示例,略
自定义类型的默认值,有两种写法:
两种写法都有缺陷,但后者,实际上并不能确定view的值,这种注解,本身就是错误的。
推荐使用第一种写法,
3 使用Annotation
@Module(id="001",name="001",srcView={@View(id="excel001",name="excel001",order=1),
@View(id="excel002",name="excel002",order=2)})
public class MyModule {
}
当然,annotation,还有作用域、生命周期、是否可继承等。在示例里,都忽略了。
4 附录--解析Annotation
解析annotation可以借鉴lombok,直接在项目编译时,修改class;也可以通过反射读取设置的annotation。
推荐,使用后者。