欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot EasyPoi動(dòng)態(tài)導(dǎo)入導(dǎo)出的兩種方式實(shí)現(xiàn)方法詳解

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

前言

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

一、基于@Excel的 isColumnHidden 屬性

我們項(xiàng)目使用的是注解方式導(dǎo)出,只需要在屬性上增加@Excel注解,就可以導(dǎo)出該屬性列。默認(rèn)大家都會(huì)使用了,不會(huì)使用的出門右轉(zhuǎn)去官網(wǎng)教程看看demo。

要?jiǎng)討B(tài)導(dǎo)出列,我們需要用到 isColumnHidden 這個(gè)屬性。

可以看到,isColumnHidden中提供的默認(rèn)值是false,也就是默認(rèn)全部導(dǎo)出,不隱藏。把值設(shè)為true,導(dǎo)出就沒(méi)有該列了。所以這個(gè)問(wèn)題就變成,導(dǎo)出要想動(dòng)態(tài)顯示哪些列,只需要?jiǎng)討B(tài)設(shè)置 isColumnHidden 的值 就可以實(shí)現(xiàn)。

1.1 實(shí)現(xiàn)原理

JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)實(shí)體類,都能夠知道這個(gè)類的所有屬性和方法;對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意方法和屬性;這種動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對(duì)象方法的功能稱為java語(yǔ)言的反射機(jī)制。

利用 JAVA反射機(jī)制。根據(jù)反射機(jī)制,我們可以拿到一個(gè)類的所有屬性和方法,同理,注解也是一個(gè)類,也是可以拿到它的屬性和方法,拿到之后就好辦了,直接修改它的默認(rèn)值,然后根據(jù)不同的條件調(diào)整,就可以達(dá)到一個(gè)類實(shí)現(xiàn)動(dòng)態(tài)導(dǎo)出的目的。

1.2 實(shí)現(xiàn)步驟

先創(chuàng)建一個(gè)工具類,傳入對(duì)象,獲取注解值,并修改。

代碼如下(示例):

/**
 * @description  動(dòng)態(tài)顯示Excel導(dǎo)出列
 * @date 2022/8/31
 */
public class EasyPoiUtil<T> {
    /**
     * 需要被反射的對(duì)象,使用泛型規(guī)范傳入對(duì)象
     */
    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;
        }
        // 獲取目標(biāo)對(duì)象的屬性值
        Field field = t.getClass().getDeclaredField(columnName);
        // 獲取注解反射對(duì)象
        Excel excelAnnon = field.getAnnotation(Excel.class);
        // 獲取代理
        InvocationHandler invocationHandler = Proxy.getInvocationHandler(excelAnnon);
        Field excelField = invocationHandler.getClass().getDeclaredField("memberValues");
        // 因?yàn)檫@個(gè)字段是 private final 修飾,所以要打開(kāi)權(quán)限
        excelField.setAccessible(true);
        Map memberValues = (Map) excelField.get(invocationHandler);
        memberValues.put("isColumnHidden", target);
    }
}

然后在需要導(dǎo)出的數(shù)據(jù)中更改對(duì)應(yīng)條件能看到的列,這里以實(shí)際項(xiàng)目里的代碼為例

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;
                // 是否導(dǎo)出 參與狀態(tài) 一列  true 導(dǎo)出   false 不導(dǎo)出
                try {
                    easyPoiUtil.hiddColumn("isJoin", value);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

1.3 實(shí)現(xiàn)效果

可以看到導(dǎo)出的表格,“參與狀態(tài)”一列,是根據(jù)條件動(dòng)態(tài)顯示了。(其實(shí)也全部導(dǎo)出了,只是隱藏了列,通過(guò)Execl里的設(shè)置還是可以顯示隱藏列的,對(duì)這點(diǎn)有要求的此方式或者不適用)

二. 基于List< ExcelExportEntity > 的導(dǎo)出

上面說(shuō)到,利用@Execl的 isColumnHidden 屬性動(dòng)態(tài)設(shè)置值,只是在導(dǎo)出時(shí)隱藏了該列而已,實(shí)際上也還是全部導(dǎo)出了。

要徹底的不導(dǎo)出,官方也給出了解決方案:基于List< ExcelExportEntity> 的導(dǎo)出

ExcelExportEntity是注解經(jīng)過(guò)處理翻譯成的實(shí)體類,兩者幾乎是一對(duì)的,所以如果我們要?jiǎng)討B(tài)自定義導(dǎo)出列,只要?jiǎng)討B(tài)拼裝ExcelExportEntity就可以了

例如上面的栗子,我們只導(dǎo)出 “姓名”,“學(xué)號(hào)”,“手機(jī)號(hào)”,"通知狀態(tài)"四列, 代碼如下(示例):

   /**
     * 根據(jù)條件動(dòng)態(tài)生成列信息
     **/
    private List<ExcelExportEntity> dynaCol(String type) {
        List<ExcelExportEntity> colList = new ArrayList<ExcelExportEntity>();
        colList.add(new ExcelExportEntity("姓名", "realName"));
        colList.add(new ExcelExportEntity("學(xué)號(hào)", "studNo"));
        if ("2".equals(type)) {
            colList.add(new ExcelExportEntity("手機(jī)號(hào)", "phoneNumber"));
            ExcelExportEntity excelentity = new ExcelExportEntity("通知狀態(tài)", "isSms");
            // 值替換
            String[] isSmsReplace = {"未發(fā)送_N", "已發(fā)送_Y","_null"};
            excelentity.setReplace(isSmsReplace);
            colList.add(excelentity);
        }
        return colList;
    }
    /**
     * 導(dǎo)出 偽代碼
     **/
    @GetMapping(value = "batchExport")
    public void batchExport(LiveUser liveUser, HttpServletResponse response){
        // 查詢出導(dǎo)出的結(jié)果集
        List<LiveUserExportVo> liveUsers = liveUserService.batchLiveUserExport(liveUser);
        // 根據(jù)條件動(dòng)態(tài)生成列信息
        List<ExcelExportEntity> beanList = dynaCol("2");
        // 導(dǎo)出
        ExcelUtil.exportExcelX(liveUsers, beanList,"名單.xls",  response,new ExportParams("名單", "名單"));
    }

實(shí)現(xiàn)效果

滿足了只導(dǎo)出四列的要求。

總結(jié)

好了,以上就是本文的全部?jī)?nèi)容了。全文介紹了兩種方式實(shí)現(xiàn)EasyPoi動(dòng)態(tài)導(dǎo)出列,可以根據(jù)項(xiàng)目的實(shí)際情況看看能否用的上。

到此這篇關(guān)于SpringBoot EasyPoi動(dòng)態(tài)導(dǎo)入導(dǎo)出的兩種方式實(shí)現(xiàn)方法詳解的文章就介紹到這了,更多相關(guān)SpringBoot EasyPoi導(dǎo)入導(dǎo)出內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于Java實(shí)現(xiàn)ssh命令登錄主機(jī)執(zhí)行shell命令過(guò)程解析

    基于Java實(shí)現(xiàn)ssh命令登錄主機(jī)執(zhí)行shell命令過(guò)程解析

    這篇文章主要介紹了基于Java實(shí)現(xiàn)ssh命令登錄主機(jī)執(zhí)行shell命令過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Linux下Java開(kāi)發(fā)環(huán)境搭建以及第一個(gè)HelloWorld

    Linux下Java開(kāi)發(fā)環(huán)境搭建以及第一個(gè)HelloWorld

    這篇文章主要介紹了Linux下Java開(kāi)發(fā)環(huán)境搭建以及第一個(gè)HelloWorld的實(shí)現(xiàn)過(guò)程,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-09-09
  • Spring Boot加密配置文件特殊內(nèi)容的示例代碼詳解

    Spring Boot加密配置文件特殊內(nèi)容的示例代碼詳解

    這篇文章主要介紹了Spring Boot加密配置文件特殊內(nèi)容的相關(guān)知識(shí),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 詳解Java代碼常見(jiàn)優(yōu)化方案

    詳解Java代碼常見(jiàn)優(yōu)化方案

    這篇文章主要介紹了Java代碼常見(jiàn)優(yōu)化方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Java設(shè)計(jì)模式七大原則之依賴倒置原則詳解

    Java設(shè)計(jì)模式七大原則之依賴倒置原則詳解

    依賴倒轉(zhuǎn)原則,即:上層模塊不應(yīng)該依賴底層模塊,它們都應(yīng)該依賴于抽象,抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象。本文將詳細(xì)介紹Java設(shè)計(jì)模式七大原則之一的依賴倒置原則,需要的可以參考一下
    2022-02-02
  • Spring Cloud Feign的文件上傳實(shí)現(xiàn)的示例代碼

    Spring Cloud Feign的文件上傳實(shí)現(xiàn)的示例代碼

    這篇文章主要介紹了Spring Cloud Feign的文件上傳實(shí)現(xiàn)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • spring事務(wù)@Transactional失效原因及解決辦法小結(jié)

    spring事務(wù)@Transactional失效原因及解決辦法小結(jié)

    今天就跟大家聊聊有關(guān)spring中@Transactional失效原因及解決辦法小結(jié),主要從三個(gè)方面考慮,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • Java 泛型總結(jié)(三):通配符的使用

    Java 泛型總結(jié)(三):通配符的使用

    在泛型的使用中,還有個(gè)重要的東西叫通配符,本文介紹通配符的使用。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • 淺析Spring獲取Bean的九種方法詳解

    淺析Spring獲取Bean的九種方法詳解

    隨著SpringBoot的普及,Spring的使用也越來(lái)越廣,在某些場(chǎng)景下,我們無(wú)法通過(guò)注解或配置的形式直接獲取到某個(gè)Bean。比如,在某一些工具類、設(shè)計(jì)模式實(shí)現(xiàn)中需要使用到Spring容器管理的Bean,此時(shí)就需要直接獲取到對(duì)應(yīng)的Bean,這篇文章主要介紹了Spring獲取Bean的九種方法
    2023-01-01
  • java如何測(cè)試網(wǎng)絡(luò)連通性

    java如何測(cè)試網(wǎng)絡(luò)連通性

    這篇文章主要為大家詳細(xì)介紹了java測(cè)試網(wǎng)絡(luò)連通性的兩種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10

最新評(píng)論