若依导出模板时设置动态excel下拉框(表连接的)
一、问题
若依导出只能;使用dictType、combo、comboReadDict、readConverterExp这些来控制字典的导出下拉,如果不是字典了该咋弄,不能一个一个录把,多了少了不愁人,愁人的是要万一一直修改,岂不是每次修改完这导出也需要修改了,直接
二、解决
1、实体类
bash
@Excel(name = "生产经营区域", readConverterExp = "", combo = {})
private Long deptId;
2.1、临时使用
实现类代码,这里直接临时写入impl,看起来方便,如果很多,那就很麻烦了
bash
public void importTemplate(HttpServletResponse response) throws Exception {
ExcelUtil<SysCompany> util = new ExcelUtil<SysCompany>(SysCompany.class);
Class<SysCompany> clazz = util.clazz;
Field field = clazz.getDeclaredField("deptId");
Excel excel = field.getAnnotation(Excel.class);
InvocationHandler h = Proxy.getInvocationHandler(excel);
Field hField = h.getClass().getDeclaredField("memberValues");
hField.setAccessible(true);
Map<String, Object> memberValues = (Map<String, Object>) hField.get(h);
// 查询数据库
List<SysDept> deptList = deptMapper.selectDeptListAll();
String[] comboArray = new String[deptList.size()];
StringBuilder readConverterExpStr = new StringBuilder();
for (int i = 0; i < deptList.size(); i++) {
comboArray[i] = deptList.get(i).getDeptName();
if (i == 0){
readConverterExpStr.append(deptList.get(i).getDeptId()+"="+deptList.get(i).getDeptName());
}else {
readConverterExpStr.append(","+deptList.get(i).getDeptId()+"="+deptList.get(i).getDeptName());
}
}
memberValues.put("combo", comboArray);
memberValues.put("readConverterExp", readConverterExpStr.toString());
util.importTemplateExcel(response, "企业信息模板");
}
2.2、统一工具类
这里为了后续使用,直接写入工具类了,在
ExcelUtil.java
下定义了exportDropdownExcel
方法,设置导出下拉框
bash
/**
* 设置导出下拉框
*
* @param list 关联集合,查询的列和后续对应;select key,text from table
* @param name 需要下拉的字段
* @param key 需要映射的值
* @param text 需要映射的文本
* @throws Exception
*
*/
public < E> void exportDropdownExcel(List<E> list, String name, String key, String text) throws Exception {
Field field = clazz.getDeclaredField(name);
// 获取字段上的Excel注解
Excel excel = field.getAnnotation(Excel.class);
InvocationHandler h = Proxy.getInvocationHandler(excel);
Field hField = h.getClass().getDeclaredField("memberValues");
hField.setAccessible(true);
Map<String, Object> memberValues = (Map<String, Object>) hField.get(h);
// 动态获取字典值
Map<String, String> dictMap = new HashMap<>();
for (E item : list) {
Class<?> dictClass = item.getClass();
// 获取字典项的值和文本字段
Field keyField = dictClass.getDeclaredField(key);
Field textField = dictClass.getDeclaredField(text);
// 设置可访问
keyField.setAccessible(true);
textField.setAccessible(true);
String keyStr = String.valueOf(keyField.get(item));
String valueStr = String.valueOf(textField.get(item));
dictMap.put(keyStr, valueStr);
}
// 设置下拉框选项
String[] comboArray = dictMap.values().toArray(new String[0]);
StringBuilder readConverterExpStr = new StringBuilder();
int i = 0;
for (Map.Entry<String, String> entry : dictMap.entrySet()) {
if (i == 0) {
readConverterExpStr.append(entry.getKey()).append("=").append(entry.getValue());
} else {
readConverterExpStr.append(",").append(entry.getKey()).append("=").append(entry.getValue());
}
i++;
}
// 修改注解属性
memberValues.put("combo", comboArray);
memberValues.put("readConverterExp", readConverterExpStr.toString());
}
3、调用
临时使用的直接就是调用了,这里调用工具类的
bash
public void importTemplate(HttpServletResponse response) throws Exception {
ExcelUtil<SysCompany> util = new ExcelUtil<SysCompany>(SysCompany.class);
util.exportDropdownExcel(deptMapper.selectDeptListAll(),"deptId","deptId","deptName");
util.exportDropdownExcel( manageMapper.selectManageListAll(),"superAgencyId","manageId","manageName");
util.importTemplateExcel(response, "企业信息模板");
}
实现图示如下
完事直接使用就OK了,有更好的改进和意见可以评论区交流一下