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

使用EasyExcel根據(jù)模板導出文件方式

 更新時間:2025年09月08日 15:33:36   作者:劉火鍋  
本文基于EasyExcel庫開發(fā)ExportUtil工具類,支持模板化導出、列表/離散數(shù)據(jù)填充、HTTP響應自動配置及異常統(tǒng)一處理,實現(xiàn)結(jié)構(gòu)化報表生成與文件下載功能

概要

在企業(yè)級應用開發(fā)中,Excel數(shù)據(jù)導出是一個常見的需求。

本文實現(xiàn)一個基于阿里巴巴EasyExcel庫實現(xiàn)的根據(jù)模板導出文件的工具類,它通過預定義的Excel模板來生成結(jié)構(gòu)化的數(shù)據(jù)報表,提高了導出功能的開發(fā)效率和靈活性。

工具類核心功能

該ExportUtil工具類主要提供以下功能:

  1. 模板化導出:基于預定義的Excel模板填充數(shù)據(jù)
  2. 靈活數(shù)據(jù)支持:支持列表數(shù)據(jù)和離散對象數(shù)據(jù)的填充
  3. 自動響應設(shè)置:自動處理HTTP響應頭,實現(xiàn)文件下載
  4. 異常處理:統(tǒng)一的異常處理機制,確保導出過程穩(wěn)定性

核心代碼解析

類結(jié)構(gòu)與常量定義

@Slf4j
@Component
public class ExportUtil {
    public static final String TEMPLATE_ROOT_PATH = "template";
    public static final String EXCEL_POSTFIX = "." + CommonConst.EXCEL_TYPE_XLSX;
    // ...
}

使用Lombok注解簡化日志管理。定義了模板根路徑和Excel文件后綴常量(可自行定義)。

模板導出核心方法

public static void downloadExcelByTemplate(String templatePath, String fileName, 
                                         List<?> list, Object obj) {
    String templateFileName = TEMPLATE_ROOT_PATH + File.separator + templatePath;
    download(fileName + EXCEL_POSTFIX, outputStream -> {
        try (ExcelWriter excelWriter = EasyExcel.write(outputStream)
                .withTemplate(ExportUtil.class.getClassLoader()
                .getResourceAsStream(templateFileName)).build()) {
            WriteSheet writeSheet = EasyExcel.writerSheet().build();
            FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
            excelWriter.fill(list, fillConfig, writeSheet);
            excelWriter.fill(obj, fillConfig, writeSheet);
        } catch (Exception e) {
            log.error("Writing template failed:{}", e.getMessage());
            throw new BusinessException(BusinessExceptionEnum.EXPORT_FAILED);
        }
    });
}

該方法接收四個參數(shù):

  1. templatePath: 模板文件路徑
  2. fileName: 導出文件名(不含后綴)
  3. list: 列表數(shù)據(jù)(用于填充模板中的表格區(qū)域)
  4. obj: 離散數(shù)據(jù)(用于填充模板中的單個字段)

文件下載處理

public static void download(String fileName, Consumer<ServletOutputStream> write) {
    HttpServletResponse response = getHttpServletResponse(fileName);
    ServletOutputStream outputStream;
    try {
        outputStream = response.getOutputStream();
    } catch (IOException e) {
        log.error("Failed to read response and write stream:{}", e.getMessage());
        throw new BusinessException(BusinessExceptionEnum.EXPORT_FAILED);
    }
    write.accept(outputStream);
}

封裝了文件下載的通用邏輯,接收一個文件名和一個用于寫入輸出流的Consumer函數(shù)式接口。

HTTP響應設(shè)置

@SneakyThrows
public static HttpServletResponse getHttpServletResponse(String fileName) {
    ServletRequestAttributes servletRequestAttributes = 
        (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
    if (servletRequestAttributes == null || servletRequestAttributes.getResponse() == null) {
        log.error("Unable to obtain HttpServletResponse.");
        throw new BusinessException(BusinessExceptionEnum.EXPORT_FAILED);
    }
    HttpServletResponse res = servletRequestAttributes.getResponse();
    res.setContentType("application/octet-stream; charset=" + StandardCharsets.UTF_8);
    res.setHeader("Content-disposition", "attachment;filename=" + 
        URLEncoder.encode(fileName, StandardCharsets.UTF_8) + ";" + 
        "filename*=utf-8''" + URLEncoder.encode(fileName, StandardCharsets.UTF_8));
    return res;
}

負責設(shè)置HTTP響應頭,包括內(nèi)容類型和內(nèi)容處置頭,確保瀏覽器正確處理文件下載。使用URLEncoder對文件名進行編碼,解決中文文件名亂碼問題。

文件下載處理

使用示例

1. 準備Excel模板

  • 在resources/template目錄下創(chuàng)建模板文件,例如user_template.xlsx。
  • 在模板中使用{}占位符表示離散數(shù)據(jù),使用{.}表示列表數(shù)據(jù)。

2. 調(diào)用導出方法

// 準備數(shù)據(jù)
UserInfo userInfo = new UserInfo("張三", "技術(shù)部");
List<Order> orders = Arrays.asList(
    new Order("訂單001", new Date(), 2999.0),
    new Order("訂單002", new Date(), 3999.0)
);

// 執(zhí)行導出
ExportUtil.downloadExcelByTemplate("user_template.xlsx", "用戶訂單", orders, userInfo);

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringAOP中的動態(tài)代理技術(shù)深入解析

    SpringAOP中的動態(tài)代理技術(shù)深入解析

    這篇文章主要介紹了SpringAOP中的動態(tài)代理技術(shù)深入解析,spring默認使用JDK動態(tài)代理實現(xiàn)AOP,類如果實現(xiàn)了接口,spring就會用JDK動態(tài)代理實現(xiàn)AOP,如果目標類沒有實現(xiàn)接口,spring則使用Cglib動態(tài)代理來實現(xiàn)AOP,需要的朋友可以參考下
    2024-01-01
  • Java并發(fā)編程之重入鎖與讀寫鎖

    Java并發(fā)編程之重入鎖與讀寫鎖

    這篇文章主要介紹了Java并發(fā)編程之重入鎖與讀寫鎖,文中相關(guān)實例代碼詳細,測試可用,具有一定參考價值,需要的朋友可以了解下。
    2017-09-09
  • Spring Boot CORS 配置方法允許跨域請求的最佳實踐方案

    Spring Boot CORS 配置方法允許跨域請求的最佳實踐方案

    跨域請求在現(xiàn)代Web開發(fā)中非常重要,特別是在涉及多個前端和后端服務(wù)時,本文詳細介紹了跨域請求的背景、重要性以及如何解決跨域問題,通過SpringBoot框架的CORS配置,可以有效地處理跨域請求,確保數(shù)據(jù)傳輸?shù)陌踩院陀脩趔w驗,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • java設(shè)計模式之模板方法模式詳解

    java設(shè)計模式之模板方法模式詳解

    這篇文章主要為大家詳細介紹了java設(shè)計模式之模板方法模式的相關(guān)資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • javaweb中ajax請求后臺servlet(實例)

    javaweb中ajax請求后臺servlet(實例)

    下面小編就為大家?guī)硪黄猨avaweb中ajax請求后臺servlet(實例)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 詳解Spring Cloud Alibaba Sidecar多語言微服務(wù)異構(gòu)

    詳解Spring Cloud Alibaba Sidecar多語言微服務(wù)異構(gòu)

    這篇文章主要介紹了詳解Spring Cloud Alibaba Sidecar多語言微服務(wù)異構(gòu),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • Android中幾種圖片特效的處理的實現(xiàn)方法

    Android中幾種圖片特效的處理的實現(xiàn)方法

    這篇文章主要介紹了 Android中幾種圖片特效的處理的實現(xiàn)方法的相關(guān)資料,這里有放大縮小圖片,獲得圓角圖片,獲得帶倒影圖片的幾種方法,需要的朋友可以參考下
    2017-08-08
  • IE8+SpringMVC文件上傳防止JSON下載

    IE8+SpringMVC文件上傳防止JSON下載

    這篇文章主要介紹了IE8+SpringMVC文件上傳防止JSON下載的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • MyBatis 防止 SQL 注入的正確用法

    MyBatis 防止 SQL 注入的正確用法

    文章主要講述了MyBatis防止SQL注入的方法,強調(diào)了使用#{param}進行參數(shù)綁定,避免使用${param}拼接SQL,對于必須使用的${}需做白名單或使用<choose>枚舉替代,并提出了編碼規(guī)范、代碼評審、審計與測試等多層防護建議,感興趣的朋友一起看看吧
    2026-03-03
  • 詳解Java利用實現(xiàn)對稱加密(DES、3DES、AES)

    詳解Java利用實現(xiàn)對稱加密(DES、3DES、AES)

    本篇文章主要介紹了Java利用實現(xiàn)對稱加密(DES、3DES、AES),具有一定的參考價值,有興趣的可以了解一下。
    2017-01-01

最新評論

田阳县| 稷山县| 原阳县| 高邮市| 巩留县| 新津县| 荣昌县| 含山县| 溧水县| 隆安县| 托里县| 称多县| 阳泉市| 龙川县| 台东市| 浦东新区| 灵川县| 古丈县| 明水县| 滨州市| 玉林市| 丁青县| 绿春县| 温宿县| 博乐市| 渭源县| 称多县| 沂源县| 长泰县| 昆山市| 台江县| 什邡市| 孟州市| 三都| 囊谦县| 通河县| 晋城| 罗田县| 瑞金市| 枞阳县| 尖扎县|