若依導出模板時設置動態excel下拉框(表連接的)
- 一、問題
- 二、解決
- 1、實體類
- 2.1、臨時使用
- 2.2、統一工具類
- 3、調用
一、問題
若依導出只能;使用dictType、combo、comboReadDict、readConverterExp這些來控制字典的導出下拉,如果不是字典了該咋弄,不能一個一個錄把,多了少了不愁人,愁人的是要萬一一直修改,豈不是每次修改完這導出也需要修改了,直接
二、解決
1、實體類
@Excel(name = "生產經營區域", readConverterExp = "", combo = {})
private Long deptId;
2.1、臨時使用
實現類代碼,這里直接臨時寫入impl,看起來方便,如果很多,那就很麻煩了
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
方法,設置導出下拉框
/*** 設置導出下拉框** @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、調用
臨時使用的直接就是調用了,這里調用工具類的
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了,有更好的改進和意見可以評論區交流一下