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

Java利用Reflect實(shí)現(xiàn)封裝Excel導(dǎo)出工具類

 更新時(shí)間:2022年11月07日 14:51:11   作者:Zeuss  
這篇文章主要為大家詳細(xì)介紹了Java如何利用Reflect實(shí)現(xiàn)封裝Excel導(dǎo)出工具類,文中的實(shí)現(xiàn)方法講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下

最近遇到一個(gè)需求,需要對(duì)頁(yè)面的列表數(shù)據(jù)做導(dǎo)出操作,考慮了很多實(shí)現(xiàn)方案之后,最終選擇了hutool的ExcelWriter + Spring自帶的ReflectionUtils工具類來(lái)實(shí)現(xiàn)這個(gè)功能,采用這種方式的主要原因是對(duì)現(xiàn)有代碼改動(dòng)較少,并且可以無(wú)縫切入系統(tǒng),實(shí)現(xiàn)各個(gè)模塊的導(dǎo)出操作,設(shè)計(jì)思路如下:

如上圖所示,首先我們定義一個(gè)接口,此接口完成Excel導(dǎo)出功能,在ExcelExportService 中實(shí)現(xiàn)功能。

話不多說(shuō),上代碼:

定義ExcelExportEnum

在導(dǎo)出Excel之前,我們需要先定義ExcelExportEnum,此枚舉存儲(chǔ)了我們后端需要導(dǎo)出的模塊和模板名稱

@Getter
@RequiredArgsConstructor
public enum ExcelExportEnum {

/**
 * 模塊
 */
MODULE_A("moduleAService", "模塊A");

private final String key;
private final String name;

}

定義導(dǎo)出方法

校驗(yàn)入?yún)?/h3>

首先,我們需要對(duì)入?yún)⑦M(jìn)行校驗(yàn),查看傳入的 MODULE_NAME 是否和后端Enum的一致,并且我們需要對(duì)參數(shù)中的自定義方法名進(jìn)行提取,我們通過(guò)ExcelExportEnum來(lái)獲取導(dǎo)出的module的Service名稱

    if (!map.containsKey(MODULE_NAME)) {
        throw new BaseException("缺少參數(shù):moduleName");
    }
    String moduleName = map.get(MODULE_NAME).toString();
    if (!EnumUtil.contains(ExcelExportEnum.class, moduleName)) {
        throw new BaseException("模塊查找失敗");
    }
    String functionName = DEFAULT_FUNCTION_NAME;
    //如果傳了自定義方法名
    if (map.containsKey(CUSTOM_FUNCTION_NAME)) {
        functionName = map.get(CUSTOM_FUNCTION_NAME).toString();
    }
    String serviceName = ExcelExportEnum.valueOf(moduleName).getKey();
    String tableName = ExcelExportEnum.valueOf(moduleName).getName();

利用java反射獲取Service中的所有method

Map<String, Method> methodMap = Arrays.stream(SpringContextHolder.getBean(serviceName).getClass().getMethods()).collect(Collectors.toMap(Method::getName, Function.identity(), (key1, key2) -> key2));

在上述代碼中SpringContextHolder.getBean(serviceName).getClass().getMethods()方法,首先通過(guò)getBean來(lái)獲取 第一步中得到的ServiceName的Java bean。然后通過(guò)Class.getMethods()方法獲取此service中的所有方法

最后,使用Arrays.stream方法,將module對(duì)應(yīng)的Service中的所有method獲取到,并放入methodMap中,供后續(xù)代碼使用

提取method中的入?yún)?duì)象,獲取其Class

    Object o;
    try {
        o = methodMap.get(functionName).getParameterTypes()[0].getDeclaredConstructor().newInstance();
    } catch (Exception e) {
        throw new BaseException(e);
    }

通過(guò)Method.getParameterTypes()方法,將第二步中獲取的method的入?yún)⒌腃lass取到,并賦值給對(duì)象Object o,供后續(xù)調(diào)用分頁(yè)列表接口傳遞入?yún)⑵ヅ銫lass使用

傳入?yún)?shù),調(diào)用導(dǎo)出方法

    Map<String, Object> param = (Map<String, Object>) map.computeIfAbsent(PARAM, k -> new HashMap<String, Object>(4));
    param.put("limit", -1);
    CopyOptions copyOptions = new CopyOptions();
    copyOptions.setIgnoreError(true);
    PageUtils page = (PageUtils) methodMap.get(functionName).invoke(SpringContextHolder.getBean(serviceName), BeanUtil.mapToBean(param, o.getClass(), true, copyOptions));
    if (CollUtil.isEmpty(page.getList())) {
        throw new BaseException("數(shù)據(jù)獲取失敗");
    }
    Object resultObject = page.getList().get(0);
    ExcelUtils utils = new ExcelUtils(resultObject.getClass());
    utils.exportExcel(page.getList(), response, tableName, moduleName);

可以看到,在上述導(dǎo)出方法中,我們使用了Method.invoke方法,并且設(shè)置轉(zhuǎn)義忽略

注意事項(xiàng)

使用hutool工具包輸出到流

// 通過(guò)工具類創(chuàng)建writer,默認(rèn)創(chuàng)建xls格式 
ExcelWriter writer = ExcelUtil.getWriter(); 
//創(chuàng)建xlsx格式的 
//ExcelWriter writer = ExcelUtil.getWriter(true); 
// 一次性寫出內(nèi)容,使用默認(rèn)樣式,強(qiáng)制輸出標(biāo)題 
writer.write(rows, true); 
//out為OutputStream,需要寫出到的目標(biāo)流 
writer.flush(out); 
// 關(guān)閉writer,釋放內(nèi)存 
writer.close();

注意 ExcelUtil.getWriter()默認(rèn)創(chuàng)建xls格式的Excel,因此寫出到客戶端也需要自定義文件名為XXX.xls,否則會(huì)出現(xiàn)文件損壞的提示。 若想生成xlsx格式,請(qǐng)使用ExcelUtil.getWriter(true)創(chuàng)建。

到此這篇關(guān)于Java利用Reflect實(shí)現(xiàn)封裝Excel導(dǎo)出工具類的文章就介紹到這了,更多相關(guān)Java Reflect封裝Excel導(dǎo)出工具類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 生成PDF全攻略之在已有PDF上添加內(nèi)容的實(shí)現(xiàn)方法

    生成PDF全攻略之在已有PDF上添加內(nèi)容的實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇生成PDF全攻略之在已有PDF上添加內(nèi)容的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-06-06
  • 升級(jí)dubbo2.7.4.1版本平滑遷移到注冊(cè)中心nacos

    升級(jí)dubbo2.7.4.1版本平滑遷移到注冊(cè)中心nacos

    這篇文章主要為大家介紹了2.7.4.1的dubbo平滑遷移到注冊(cè)中心nacos的兩種版本升級(jí)方案,以及為什要升級(jí),有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2022-02-02
  • 解決Java中socket使用getInputStream()阻塞問(wèn)題

    解決Java中socket使用getInputStream()阻塞問(wèn)題

    這篇文章主要介紹了解決Java中socket使用getInputStream()阻塞問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java使用DateTimeFormatter實(shí)現(xiàn)格式化時(shí)間

    Java使用DateTimeFormatter實(shí)現(xiàn)格式化時(shí)間

    這篇文章主要介紹了Java使用DateTimeFormatter實(shí)現(xiàn)格式化時(shí)間,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Java 比較字符串實(shí)例詳解

    Java 比較字符串實(shí)例詳解

    這篇文章主要介紹了 Java 比較字符串實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • springCloud gateWay 統(tǒng)一鑒權(quán)的實(shí)現(xiàn)代碼

    springCloud gateWay 統(tǒng)一鑒權(quán)的實(shí)現(xiàn)代碼

    這篇文章主要介紹了springCloud gateWay 統(tǒng)一鑒權(quán)的實(shí)現(xiàn)代碼,統(tǒng)一鑒權(quán)包括鑒權(quán)邏輯和代碼實(shí)現(xiàn),本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • Spring Boot 集成 Quartz 使用Cron 表達(dá)式實(shí)現(xiàn)定時(shí)任務(wù)

    Spring Boot 集成 Quartz 使用Cron 表達(dá)式實(shí)現(xiàn)定

    本文介紹了如何在SpringBoot項(xiàng)目中集成Quartz并使用Cron表達(dá)式進(jìn)行任務(wù)調(diào)度,通過(guò)添加Quartz依賴、創(chuàng)建Quartz任務(wù)、配置任務(wù)調(diào)度以及啟動(dòng)項(xiàng)目,可以實(shí)現(xiàn)定時(shí)任務(wù)的執(zhí)行,Cron表達(dá)式提供了靈活的任務(wù)調(diào)度方式,適用于各種復(fù)雜的定時(shí)任務(wù)需求,感興趣的朋友一起看看吧
    2025-03-03
  • LeetCode -- Path Sum III分析及實(shí)現(xiàn)方法

    LeetCode -- Path Sum III分析及實(shí)現(xiàn)方法

    這篇文章主要介紹了LeetCode -- Path Sum III分析及實(shí)現(xiàn)方法的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-10-10
  • swing分割窗口控件JSplitPane使用方法詳解

    swing分割窗口控件JSplitPane使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了swing分割窗口控件JSplitPane的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • SpringBoot2使用WebFlux函數(shù)式編程的方法

    SpringBoot2使用WebFlux函數(shù)式編程的方法

    這篇文章主要介紹了SpringBoot2使用WebFlux函數(shù)式編程的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08

最新評(píng)論

奉节县| 宣恩县| 新营市| 藁城市| 平果县| 嘉黎县| 敦煌市| 天津市| 黄骅市| 岗巴县| 和硕县| 西平县| 白山市| 邢台市| 顺昌县| 兰西县| 阿克苏市| 阿克陶县| 江油市| 安图县| 荃湾区| 定远县| 馆陶县| 万年县| 兖州市| 昔阳县| 泸西县| 呼和浩特市| 通榆县| 西乌| 东光县| 璧山县| 秀山| 太康县| 武隆县| 德江县| 盐池县| 新干县| 宾川县| 中卫市| 贡嘎县|