因项目需求,Excel模板存在多处行合并和列合并,需要导入指定单元格的数据,并且存在多行数据相同情况;同时不知道后续Excel模板是否会变动。所以利用POI、注解和反射实现一个工具类,需要维护与单sheet页对应的Java Bean上的注解。
一、注解:
1、指定单元格注解,指定行、列、数据类型
/**
* Excel单元格
*/
@Documented
@Inherited
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelCell {
/**
* excel行数
*
* @return 行数
*/
int row() default 0;
/**
* excel列数
*
* @return 列数
*/
int col() default 0;
/**
* excel单元格对应java的数据类型
*
* @return 数据类型
*/
String type() default "String";
}
2、指定开始行和结束行
@Documented
@Inherited
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExcelRow {
/**
* excel开始行
*
* @return 开始行
*/
int startRow();
/**
* excel结束行
*
* @return 结束行
*/
int endRow();
}
二、工具类
大概思路:
利用反射获取Model的属性,根据属性上的注解(ExcelCell)得到该属性对应sheet页哪个单元格和数据类型,然后获取单元格的数据并放到Model中;如果单元格中存在某几行的数据可以抽取成一个SubModel的列表,此时根据注解(ExcelRow)得到行范围,根据SubModel和行范围获取到一个数据集并放到Model中。
public class ExcelImportUtil {
/**