1.在若依的Excel注解中加上一个参数
/** * 根据字典类型设置下拉列 */ public String comboDictType() default "";
主要用于注解时填写字典类型 这里没有改造combo因为系统其他地方的导出可以用到,贸然改造会影响原有功能所以就加了个新的参数
2.在ExcelUtil中找到设置combo的代码
/** * 创建表格样式 */ public void setDataValidation(Excel attr, Row row, int column) { if (attr.name().indexOf("注:") >= 0) { sheet.setColumnWidth(column, 6000); } else { // 设置列宽 sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256)); } if (StringUtils.isNotEmpty(attr.prompt()) || attr.combo().length > 0) { if (attr.combo().length > 15 || StringUtils.join(attr.combo()).length() > 255) { // 如果下拉数大于15或字符串长度大于255,则使用一个新sheet存储,避免生成的模板下拉值获取不到 setXSSFValidationWithHidden(sheet, attr.combo(), attr.prompt(), 1, 100, column, column); } else { // 提示信息或只能选择不能输入的列内容. setPromptOrValidation(sheet, attr.combo(), attr.prompt(), 1, 100, column, column); } } }
可以看到创建表格样式的时候设置的combo具体实现思路就是查询出来相对应字典类型的lable值去设置到excel表中 这里若依有redis缓存去存字典值所以就没有查库
3.在DictUtil中写一个方法查询缓存中对应字典类型的lable值
/** * 根据字典类型查询 Label集合 * * @param dictType * @return */ public static ListgetDictLabelList(String dictType) { return getDictCache(dictType).stream().map(SysDictData::getDictLabel).collect(Collectors.toList()); }
4.接下来就可以实现combo关联字典表实现下拉了
我们在第2步中的代码if()判断的下面在加一个判断
else if (StringUtils.isNotEmpty(attr.prompt()) || StringUtils.isNotEmpty(attr.comboDictType())) { //根据字典类型查询对应字典值的列表并转换成数组 String[] combo = DictUtils.getDictLabelList(attr.comboDictType()).stream().toArray(String[]::new); if (combo.length > 15 || StringUtils.join(combo).length() > 255) { // 如果下拉数大于15或字符串长度大于255,则使用一个新sheet存储,避免生成的模板下拉值获取不到 setXSSFValidationWithHidden(sheet, combo, attr.prompt(), 1, 100, column, column); } else { setPromptOrValidation(sheet, combo, attr.prompt(), 1, 100, column, column); } }
这里把从缓存里面查出来的Lable集合转成了String数组然后就是一些校验最终实现了这么一个效果
@Excel(name = "1111",comboDictType = "position_type",height = 10)
具体使用方式就是这样