最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot EasyPoi動態(tài)導入導出的兩種方式實現(xiàn)方法詳解

 更新時間:2022年09月24日 10:19:36   作者:Java升級之路  
項目里使用的是EasyPoi來處理導入導出功能的。近日因業(yè)務需求調(diào)整,一些導出功能的導出列需要根據(jù)不同的條件動態(tài)導出

前言

一開始為了圖方便,使用的是土方法,即創(chuàng)建多個不同的實體類,每個實體類對應不同的列。這樣雖說能實現(xiàn),但實在不想多復制實體類,把代碼堆的和shi山一樣。于是查看官方文檔,里面確實提供了更加優(yōu)雅的實現(xiàn)方式。廢話不多說,開整。

一、基于@Excel的 isColumnHidden 屬性

我們項目使用的是注解方式導出,只需要在屬性上增加@Excel注解,就可以導出該屬性列。默認大家都會使用了,不會使用的出門右轉(zhuǎn)去官網(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獲取代碼中方法參數(shù)名信息的方法

    Java獲取代碼中方法參數(shù)名信息的方法

    在java中,可以通過反射獲取到類、字段、方法簽名等相關的信息,像方法名、返回值類型、參數(shù)類型、泛型類型參數(shù)等,但是不能夠獲取方法的參數(shù)名。在實際開發(fā)場景中,有時需要根據(jù)方法的參數(shù)名做一些操作,那么該如何操作了呢?下面就通過這篇文章來學習學習吧。
    2016-09-09
  • Java獲取啟動參數(shù)方式

    Java獲取啟動參數(shù)方式

    本文介紹了Java應用程序如何獲取JVM啟動參數(shù),包括標準參數(shù)、非標準參數(shù)和高級參數(shù),介紹了通過`main`方法參數(shù)、`System.getProperty`和`RuntimeMXBean`獲取啟動參數(shù)的方式,并提供了一個實際項目案例,展示了如何結合多種方式靈活配置應用程序
    2025-01-01
  • Java中消息隊列任務的平滑關閉詳解

    Java中消息隊列任務的平滑關閉詳解

    對于消息隊列的監(jiān)聽,我們一般使用Java寫一個獨立的程序,在Linux服務器上運行。程序啟動后,通過消息隊列客戶端接收消息,放入一個線程池進行異步處理,并發(fā)的快速處理。這篇文章主要給大家介紹了關于Java中消息隊列任務的平滑關閉的相關資料,需要的朋友可以參考下。
    2017-11-11
  • 關于各種排列組合java算法實現(xiàn)方法

    關于各種排列組合java算法實現(xiàn)方法

    這篇文章介紹了幾種用JAVA實現(xiàn)的排列組合算法,有需要的朋友可以參考一下
    2013-06-06
  • springboot 配置DRUID數(shù)據(jù)源的方法實例分析

    springboot 配置DRUID數(shù)據(jù)源的方法實例分析

    這篇文章主要介紹了springboot 配置DRUID數(shù)據(jù)源的方法,結合實例形式分析了springboot 配置阿里DRUID數(shù)據(jù)源的具體步驟與相關操作技巧,需要的朋友可以參考下
    2019-12-12
  • 手把手帶你分析SpringBoot自動裝配完成了Ribbon哪些核心操作

    手把手帶你分析SpringBoot自動裝配完成了Ribbon哪些核心操作

    這篇文章主要介紹了詳解Spring Boot自動裝配Ribbon哪些核心操作的哪些操作,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • 詳解JAVA 弱引用

    詳解JAVA 弱引用

    這篇文章主要介紹了 JAVA 弱引用的相關資料,幫助大家更好的理解和學習java引用對象,感興趣的朋友可以了解下
    2020-08-08
  • java中switch case語句需要加入break的原因解析

    java中switch case語句需要加入break的原因解析

    這篇文章主要介紹了java中switch case語句需要加入break的原因解析的相關資料,需要的朋友可以參考下
    2017-07-07
  • Java?NIO通信基礎示例詳解

    Java?NIO通信基礎示例詳解

    這篇文章主要為大家介紹了Java?NIO通信基礎使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 使用Java編寫一個簡單的Web的監(jiān)控系統(tǒng)

    使用Java編寫一個簡單的Web的監(jiān)控系統(tǒng)

    這篇文章主要介紹了使用Java編寫一個簡單的Web的監(jiān)控系統(tǒng)的例子,并且將重要信息轉(zhuǎn)為XML通過網(wǎng)頁前端顯示,非常之實用,需要的朋友可以參考下
    2015-11-11

最新評論

江永县| 襄垣县| 高清| 蒙山县| 长乐市| 自贡市| 江安县| 清河县| 绥滨县| 木兰县| 油尖旺区| 乌海市| 蓬莱市| 滨海县| 邵武市| 南澳县| 如东县| 唐山市| 江北区| 永新县| 汤原县| 台北市| 醴陵市| 全南县| 永靖县| 雷波县| 闻喜县| 旺苍县| 红桥区| 宁远县| 和田市| 司法| 平顶山市| 济源市| 永寿县| 张家界市| 天门市| 武平县| 沙洋县| 张掖市| 临西县|