首先需要定义excel实体类
@Data
@ColumnWidth(22)
@HeadRowHeight(30)
public class ExcelProductDTO {
//动态下拉框,可以查询数据库数据显示在下拉框中
@ExcelSelected(sourceClass = MyExcelSelected.class)
@ExcelProperty(value = "生产厂家编号")
private String producerCode;
@ExcelSelected(source = {"高值","低值"})
@ExcelProperty(value = "库存价值类型")
private String stockValType;
@ExcelSelected(source = {"耗材","普通设备","医疗设备"})
@ExcelProperty(value = "库存类型")
private String stockType;
@ExcelSelected(source = {"有","无"})
@ExcelProperty(value = "是否有明细")
private Integer hasDetail;
@ExcelSelected(source = {"药械","资产","设备"})
@ExcelProperty(value = "业务类型")
private String ywType;
@ExcelSelected(source = {"虚库","实库"})
@ExcelProperty(value = "是否虚库")
private String isVirtual;
@ExcelSelected(source = {"是","否"})
@ExcelProperty(value = "是否进口")
private String isImport;
}
自定义注解
@Documented
@Target({ElementType.FIELD})//用此注解用在属性上。
@Retention(RetentionPolicy.RUNTIME)//注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在;
public @interface ExcelSelected {
/**
* 固定下拉内容
*/
String[] source() default {};
/**
* 动态下拉内容
*/
Class<? extends ExcelDynamicSelect>[] sourceClass() default {};
/**
* 设置下拉框的起始行,默认为第二行
*/
int firstRow() default 1;
/**
* 设置下拉框的结束行,默认为最后一行
*/
int lastRow() default 0x10000;
}
创建动态下拉框的接口,设置动态下拉框都实现该接口
public interface ExcelDynamicSelect {
/**
* 获取动态生成的下拉框可选数据
* @return 动态生成的下拉框可选数据
*/
String[] getSource();
}
自定义注解解析类 (反射)
//自定义注解解析
@Data
@Slf4j
public class ExcelSelectedResolve {
/**
* 下拉内容
*/
private String[] source;
/**
* 设置下拉框的起始行,默认为第二行
*/
private int firstRow;
/**
* 设置下拉框的结束行,默认为最后一行
*/
private int lastRow;
public String[] resolveSelectedSource(ExcelSelected excelSelected) {
if (excelSelected == null) {
return null;
}
// 获取固定下拉框的内容
String[] source = excelSelected.source();
if (source.length > 0) {
return source;
}
// 获取动态下拉框的内容
Class<? extends ExcelDynamicSelect&g