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

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

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

概要

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

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

工具類核心功能

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

  1. 模板化導(dǎo)出:基于預(yù)定義的Excel模板填充數(shù)據(jù)
  2. 靈活數(shù)據(jù)支持:支持列表數(shù)據(jù)和離散對(duì)象數(shù)據(jù)的填充
  3. 自動(dòng)響應(yīng)設(shè)置:自動(dòng)處理HTTP響應(yīng)頭,實(shí)現(xiàn)文件下載
  4. 異常處理:統(tǒng)一的異常處理機(jī)制,確保導(dǎo)出過程穩(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文件后綴常量(可自行定義)。

模板導(dǎo)出核心方法

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);
        }
    });
}

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

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

文件下載處理

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);
}

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

HTTP響應(yīng)設(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;
}

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

文件下載處理

使用示例

1. 準(zhǔn)備Excel模板

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

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

// 準(zhǔn)備數(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í)行導(dǎo)出
ExportUtil.downloadExcelByTemplate("user_template.xlsx", "用戶訂單", orders, userInfo);

總結(jié)

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

相關(guān)文章

  • 創(chuàng)建Java線程安全類的七種方法

    創(chuàng)建Java線程安全類的七種方法

    線程安全是指某個(gè)方法或某段代碼,在多線程中能夠正確的執(zhí)行,不會(huì)出現(xiàn)數(shù)據(jù)不一致或數(shù)據(jù)污染的情況,我們把這樣的程序稱之為線程安全的,反之則為非線程安全的,下面這篇文章主要給大家介紹了關(guān)于創(chuàng)建Java線程安全類的七種方法,需要的朋友可以參考下
    2022-06-06
  • SpringBoot線程池ThreadPoolTaskExecutor異步處理百萬級(jí)數(shù)據(jù)

    SpringBoot線程池ThreadPoolTaskExecutor異步處理百萬級(jí)數(shù)據(jù)

    本文主要介紹了SpringBoot線程池ThreadPoolTaskExecutor異步處理百萬級(jí)數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • 使用Jenkins Pipeline自動(dòng)化構(gòu)建發(fā)布Java項(xiàng)目的方法

    使用Jenkins Pipeline自動(dòng)化構(gòu)建發(fā)布Java項(xiàng)目的方法

    這篇文章主要介紹了使用Jenkins Pipeline自動(dòng)化構(gòu)建發(fā)布Java項(xiàng)目的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-04-04
  • Java設(shè)計(jì)模式之狀態(tài)模式(State模式)介紹

    Java設(shè)計(jì)模式之狀態(tài)模式(State模式)介紹

    這篇文章主要介紹了Java設(shè)計(jì)模式之狀態(tài)模式(State模式)介紹,本文講解了何時(shí)使用狀態(tài)模式、如何使用狀態(tài)模式等內(nèi)容,需要的朋友可以參考下
    2015-03-03
  • Java訪問修飾符原理及代碼解析

    Java訪問修飾符原理及代碼解析

    這篇文章主要介紹了Java訪問修飾符原理及代碼解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Mybatis環(huán)境搭建和使用實(shí)例代碼

    Mybatis環(huán)境搭建和使用實(shí)例代碼

    MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲(chǔ)過程以及高級(jí)映射。本文重點(diǎn)給大家介紹Mybatis的環(huán)境搭建和使用實(shí)例代碼,需要的朋友參考下吧
    2017-12-12
  • java反射常用方法案例詳解

    java反射常用方法案例詳解

    Java反射指的是一個(gè)機(jī)制,這種機(jī)制可以在Java程序運(yùn)行時(shí)(動(dòng)態(tài))實(shí)例化對(duì)象、讀寫屬性、調(diào)用方法,這篇文章主要介紹了java反射常用方法,需要的朋友可以參考下
    2023-06-06
  • 實(shí)例分析Java Class的文件結(jié)構(gòu)

    實(shí)例分析Java Class的文件結(jié)構(gòu)

    今天把之前在Evernote中的筆記重新整理了一下,發(fā)上來供對(duì)java class 文件結(jié)構(gòu)的有興趣的同學(xué)參考一下
    2013-04-04
  • IDEA連接MySQL后管理數(shù)據(jù)庫的操作指南

    IDEA連接MySQL后管理數(shù)據(jù)庫的操作指南

    本節(jié)就來教大家如何在IDEA連接MySQL后管理數(shù)據(jù)庫(創(chuàng)建/修改/刪除數(shù)據(jù)庫、創(chuàng)建/修改/刪除表、插入/更新/刪除/查詢表記錄),文中通過圖文結(jié)合的方式給大家講解的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • SpringBoot整合RabbitMQ及原理

    SpringBoot整合RabbitMQ及原理

    這篇文章主要介紹了SpringBoot整合RabbitMQ及其原理分析,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06

最新評(píng)論