SpringBoot EasyPoi動態(tài)導入導出的兩種方式實現(xiàn)方法詳解
前言
一開始為了圖方便,使用的是土方法,即創(chuàng)建多個不同的實體類,每個實體類對應不同的列。這樣雖說能實現(xiàn),但實在不想多復制實體類,把代碼堆的和shi山一樣。于是查看官方文檔,里面確實提供了更加優(yōu)雅的實現(xiàn)方式。廢話不多說,開整。
一、基于@Excel的 isColumnHidden 屬性
我們項目使用的是注解方式導出,只需要在屬性上增加@Excel注解,就可以導出該屬性列。默認大家都會使用了,不會使用的出門右轉去官網(wǎng)教程看看demo。
要動態(tài)導出列,我們需要用到 isColumnHidden 這個屬性。
可以看到,isColumnHidden中提供的默認值是false,也就是默認全部導出,不隱藏。把值設為true,導出就沒有該列了。所以這個問題就變成,導出要想動態(tài)顯示哪些列,只需要動態(tài)設置 isColumnHidden 的值 就可以實現(xiàn)。
1.1 實現(xiàn)原理
JAVA反射機制是在運行狀態(tài)中,對于任意一個實體類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意方法和屬性;這種動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能稱為java語言的反射機制。
利用 JAVA反射機制。根據(jù)反射機制,我們可以拿到一個類的所有屬性和方法,同理,注解也是一個類,也是可以拿到它的屬性和方法,拿到之后就好辦了,直接修改它的默認值,然后根據(jù)不同的條件調(diào)整,就可以達到一個類實現(xiàn)動態(tài)導出的目的。
1.2 實現(xiàn)步驟
先創(chuàng)建一個工具類,傳入對象,獲取注解值,并修改。
代碼如下(示例):
/** * @description 動態(tài)顯示Excel導出列 * @date 2022/8/31 */ public class EasyPoiUtil<T> { /** * 需要被反射的對象,使用泛型規(guī)范傳入對象 */ public T t; public void hiddColumn(String columnName, Boolean target) throws Exception { if (t == null) { throw new ClassNotFoundException("TARGET OBJECT NOT FOUNT"); } if (StringUtils.isEmpty(columnName)) { throw new NullPointerException("COLUMN NAME NOT NULL"); } if (target == null) { target = true; } // 獲取目標對象的屬性值 Field field = t.getClass().getDeclaredField(columnName); // 獲取注解反射對象 Excel excelAnnon = field.getAnnotation(Excel.class); // 獲取代理 InvocationHandler invocationHandler = Proxy.getInvocationHandler(excelAnnon); Field excelField = invocationHandler.getClass().getDeclaredField("memberValues"); // 因為這個字段是 private final 修飾,所以要打開權限 excelField.setAccessible(true); Map memberValues = (Map) excelField.get(invocationHandler); memberValues.put("isColumnHidden", target); } }
然后在需要導出的數(shù)據(jù)中更改對應條件能看到的列,這里以實際項目里的代碼為例
public List<ExportVo> batchLiveUserExport(LiveUser liveUser) { List<ExportVo> voList = baseMapper.batchLiveUserExport(liveUser); LiveInfo liveInfo = liveInfoService.getById(liveUser.getLiveId()); if (liveInfo != null) { LiveSpecial liveSpecial = liveSpecialService.getById(liveInfo.getSpecialId()); if ("2".equals(liveSpecial.getLivePlatform())) { setHiddColumn(voList,true); } else { setHiddColumn(voList,false); } } return voList; } private void setHiddColumn(List<ExportVo> list, Boolean value) { if (CollectionUtil.isNotEmpty(list)) { for (ExportVo vo : list) { EasyPoiUtil<ExportVo> easyPoiUtil = new EasyPoiUtil<>(); easyPoiUtil.t = vo; // 是否導出 參與狀態(tài) 一列 true 導出 false 不導出 try { easyPoiUtil.hiddColumn("isJoin", value); } catch (Exception e) { e.printStackTrace(); } } } }
1.3 實現(xiàn)效果
可以看到導出的表格,“參與狀態(tài)”一列,是根據(jù)條件動態(tài)顯示了。(其實也全部導出了,只是隱藏了列,通過Execl里的設置還是可以顯示隱藏列的,對這點有要求的此方式或者不適用)
二. 基于List< ExcelExportEntity > 的導出
上面說到,利用@Execl的 isColumnHidden 屬性動態(tài)設置值,只是在導出時隱藏了該列而已,實際上也還是全部導出了。
要徹底的不導出,官方也給出了解決方案:基于List< ExcelExportEntity> 的導出
ExcelExportEntity是注解經(jīng)過處理翻譯成的實體類,兩者幾乎是一對的,所以如果我們要動態(tài)自定義導出列,只要動態(tài)拼裝ExcelExportEntity就可以了
例如上面的栗子,我們只導出 “姓名”,“學號”,“手機號”,"通知狀態(tài)"四列, 代碼如下(示例):
/** * 根據(jù)條件動態(tài)生成列信息 **/ private List<ExcelExportEntity> dynaCol(String type) { List<ExcelExportEntity> colList = new ArrayList<ExcelExportEntity>(); colList.add(new ExcelExportEntity("姓名", "realName")); colList.add(new ExcelExportEntity("學號", "studNo")); if ("2".equals(type)) { colList.add(new ExcelExportEntity("手機號", "phoneNumber")); ExcelExportEntity excelentity = new ExcelExportEntity("通知狀態(tài)", "isSms"); // 值替換 String[] isSmsReplace = {"未發(fā)送_N", "已發(fā)送_Y","_null"}; excelentity.setReplace(isSmsReplace); colList.add(excelentity); } return colList; } /** * 導出 偽代碼 **/ @GetMapping(value = "batchExport") public void batchExport(LiveUser liveUser, HttpServletResponse response){ // 查詢出導出的結果集 List<LiveUserExportVo> liveUsers = liveUserService.batchLiveUserExport(liveUser); // 根據(jù)條件動態(tài)生成列信息 List<ExcelExportEntity> beanList = dynaCol("2"); // 導出 ExcelUtil.exportExcelX(liveUsers, beanList,"名單.xls", response,new ExportParams("名單", "名單")); }
實現(xiàn)效果
滿足了只導出四列的要求。
總結
好了,以上就是本文的全部內(nèi)容了。全文介紹了兩種方式實現(xiàn)EasyPoi動態(tài)導出列,可以根據(jù)項目的實際情況看看能否用的上。
到此這篇關于SpringBoot EasyPoi動態(tài)導入導出的兩種方式實現(xiàn)方法詳解的文章就介紹到這了,更多相關SpringBoot EasyPoi導入導出內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
基于Java實現(xiàn)ssh命令登錄主機執(zhí)行shell命令過程解析
這篇文章主要介紹了基于Java實現(xiàn)ssh命令登錄主機執(zhí)行shell命令過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-12-12Linux下Java開發(fā)環(huán)境搭建以及第一個HelloWorld
這篇文章主要介紹了Linux下Java開發(fā)環(huán)境搭建以及第一個HelloWorld的實現(xiàn)過程,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2015-09-09Spring Boot加密配置文件特殊內(nèi)容的示例代碼詳解
這篇文章主要介紹了Spring Boot加密配置文件特殊內(nèi)容的相關知識,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05Spring Cloud Feign的文件上傳實現(xiàn)的示例代碼
這篇文章主要介紹了Spring Cloud Feign的文件上傳實現(xiàn)的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03spring事務@Transactional失效原因及解決辦法小結
今天就跟大家聊聊有關spring中@Transactional失效原因及解決辦法小結,主要從三個方面考慮,具有一定的參考價值,感興趣的可以了解一下2023-08-08