一、动态下拉框
如何得到这样一张表格?在单元格中插入可选下拉框。
思路分析:
① excel 表头每个字段对应实体的每个字段
② 表头字段是从注解 @ExcelProperty的value中取得的(参考alibaba的写excel方法)
③那么,是否可以自定义1个注解,通过这个注解得到下拉框的值
使用的工具类:easyexcel
第一步,自定义一个注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({
ElementType.FIELD})
public @interface ExplicitConstraint {
//定义注解类型元素(基本数据类型,String,Class,枚举,注解,数组)
Class<? extends EasyExcelSelect> sourceClass();
String value() default "";
}
第二步,定义一个抽象类
public abstract class EasyExcelSelect {
/**
* 得到下拉框的值
*
* @return
*/
public abstract String[] selectValue(Object value);
}
第三步,定义一个实现类
public class DictEasySelect extends EasyExcelSelect {
@Override
public String[] selectValue(Object value) {
if(ObjectUtils.allNotNull(value)){
//用BeanFactory来获取bean
RemoteDataDictService remoteDataDictService = SpringUtils.getBean(RemoteDataDictService.class);
//查出字典中该字段的所有可能值
List<DictTreeVo> list = remoteDataDictService.findDictList(value.toString());
if(StringUtils.isNotEmpty(list)){
return list.stream().map(DictTreeVo::getDictName).toArray(String[]::new);
}
}
return null;
}
}
第四步,new一个实体,并在需要下拉的字段上引用该注解
@ApiModel("试题批量导入模板")
@ColumnWidth(value = 10)
@HeadRowHeight(5)
@ContentRowHeight(5)
@HeadFontStyle(fontHeightInPoints = 12)
public class TopicTemplateDto {
@ApiModelProperty(value = "试题类型", required = true)
@ExcelProperty(value = "试题类型",index = 3)
@ExplicitConstraint(sourceClass = DictEasySelect.class,value = Constants.SUBJECT_TYPE)
private Integer topicType;
}
第五步,实现excel导出功能
/**
* 导出动态下拉框
*/
public static ExportVo writeExcel(String fileName, Class clazz) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
//下拉列表集合(key 是列,value 是字段ÿ