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

Java使用FreeMarker來實現(xiàn)Word自定義導(dǎo)出功能

 更新時間:2025年09月26日 11:08:12   作者:保加利亞的風(fēng)  
Java FreeMarker是一個用Java語言編寫的模板引擎,它可以基于模板來生成文本輸出,并且與Web容器無關(guān),在對一些特定導(dǎo)出功能,使用常規(guī)Excel無法解決的,通常使用Word來實現(xiàn)導(dǎo)出功能,這篇介紹下如何在Java中使用FreeMarker模板注入方式來實現(xiàn)Word導(dǎo)出功能

前言

在對一些特定導(dǎo)出功能,使用常規(guī)Excel無法解決的,通常使用Word來實現(xiàn)導(dǎo)出功能,這篇介紹下如何在Java中使用FreeMarker模板注入方式來實現(xiàn)Word導(dǎo)出功能

導(dǎo)出案例(已作打碼處理)

或者:

準(zhǔn)備工作

第一步:maven依賴庫

		<!-- freemarker (用于Word導(dǎo)出)-->
       	<dependency>
	        <groupId>org.freemarker</groupId>
	        <artifactId>freemarker</artifactId>
	        <version>${freemarker.version}</version>
       	</dependency>

第二步:Word導(dǎo)出工具類

import com.zrxt.common.config.RuoYiConfig;
import com.zrxt.common.core.text.CharsetKit;
import freemarker.cache.ClassTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Map;

/**
 * @ClassName WordUtil
 * @Description 使用Freemarker生成Word文檔工具類
 * @Author
 * @Date 2023/12/14
 **/
public class WordUtil {
    /**
     * 使用Freemarker自動生成Word文檔(磁盤路徑方法)
     *
     * @param dataMap      保存Word文檔中所需要的數(shù)據(jù)
     * @param templatePath 模板文件的絕對路徑
     * @param templateFile 模板文件的名稱
     * @throws Exception
     */
    public static void CreateWord(HttpServletResponse response, Map<String, Object> dataMap, String templatePath, String templateFile) throws Exception {
        Writer out = null;
        try {
            // 設(shè)置FreeMarker的版本
            Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);
            // 設(shè)置Freemarker的編碼格式
            configuration.setDefaultEncoding(CharsetKit.UTF_8);
            // 設(shè)置FreeMarker生成Word文檔所需要的模板的路徑
            configuration.setDirectoryForTemplateLoading(new File(templatePath));
            // 設(shè)置FreeMarker生成Word文檔所需要的模板名稱
            Template t = configuration.getTemplate(templateFile, CharsetKit.UTF_8);
            // 創(chuàng)建一個Word文檔的輸出流
            out = new BufferedWriter(new OutputStreamWriter(response.getOutputStream(), StandardCharsets.UTF_8));
            //FreeMarker使用Word模板和數(shù)據(jù)生成Word文檔
            t.process(dataMap, out);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            assert out != null;
            out.flush();
            out.close();
        }
    }

    /**
     * 使用Freemarker自動生成Word文檔
     *
     * @param dataMap      保存Word文檔中所需要的數(shù)據(jù)
     * @param templatePath 模板文件的路徑(絕對)
     * @param templateFile 模板文件的名稱
     * @throws Exception
     */
    public static void GeneratorWord(HttpServletResponse response, Map<String, Object> dataMap, String templatePath, String templateFile) throws Exception {
        Writer out = null;
        try {
            // 設(shè)置FreeMarker的版本
            Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
            // 設(shè)置Freemarker的編碼格式
            configuration.setDefaultEncoding(CharsetKit.UTF_8);
            //相對路徑加載模板方法
            configuration.setTemplateLoader(new ClassTemplateLoader(WordUtil.class,templatePath));
            // 設(shè)置FreeMarker生成Word文檔所需要的模板名稱
            Template template  = configuration.getTemplate(templateFile, CharsetKit.UTF_8);
            // 創(chuàng)建一個Word文檔的輸出流
            out = new BufferedWriter(new OutputStreamWriter(response.getOutputStream(), StandardCharsets.UTF_8));
            //FreeMarker使用Word模板和數(shù)據(jù)生成Word文檔
            template .process(dataMap, out);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            assert out != null;
            out.flush();
            out.close();
        }
    }

    /**
     * 下載文件
     *
     * @param path     文件的位置
     * @param fileName 自定義下載文件的名稱
     * @param response http響應(yīng)
     * @param request  http請求
     */
    public static void downloadFile(String path, String fileName, HttpServletResponse response, HttpServletRequest request) {
        try {
            File file = new File(path);
            // 中文亂碼解決
            String type = request.getHeader("User-Agent").toLowerCase();
            if (type.indexOf("firefox") > 0 || type.indexOf("chrome") > 0) {
                // 谷歌或火狐
                fileName = new String(fileName.getBytes(StandardCharsets.UTF_8), "iso8859-1");
            } else {
                // IE
                fileName = URLEncoder.encode(fileName, CharsetKit.UTF_8);
            }
            // 設(shè)置響應(yīng)的頭部信息
            response.setHeader("content-disposition", "attachment;filename=" + fileName);
            // 設(shè)置響應(yīng)內(nèi)容的類型
            response.setContentType(getFileContentType(fileName) + "; charset=" + CharsetKit.UTF_8);
            // 設(shè)置響應(yīng)內(nèi)容的長度
            response.setContentLength((int) file.length());
            // 輸出
            outStream(new FileInputStream(file), response.getOutputStream());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 文件的內(nèi)容類型
     */
    private static String getFileContentType(String name) {
        String result = "";
        String fileType = name.toLowerCase();
        if (fileType.endsWith(".png")) {
            result = "image/png";
        } else if (fileType.endsWith(".gif")) {
            result = "image/gif";
        } else if (fileType.endsWith(".jpg") || fileType.endsWith(".jpeg")) {
            result = "image/jpeg";
        } else if (fileType.endsWith(".svg")) {
            result = "image/svg+xml";
        } else if (fileType.endsWith(".doc")) {
            result = "application/msword";
        } else if (fileType.endsWith(".xls")) {
            result = "application/x-excel";
        } else if (fileType.endsWith(".zip")) {
            result = "application/zip";
        } else if (fileType.endsWith(".pdf")) {
            result = "application/pdf";
        } else {
            result = "application/octet-stream";
        }
        return result;
    }


    /**
     * 基礎(chǔ)字節(jié)數(shù)組輸出
     */
    private static void outStream(InputStream is, OutputStream os) {
        try {
            byte[] buffer = new byte[10240];
            int length = -1;
            while ((length = is.read(buffer)) != -1) {
                os.write(buffer, 0, length);
                os.flush();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                os.close();
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 檢查存儲生成文件的路徑是否存在,如果不存在則新建路徑.
     *
     * @param directory the directory name, like '\dir-name'
     */
    public static void CheckDownloadPath(String directory) {
        File path = new File(RuoYiConfig.getDownloadPath() + directory);
        if (!path.exists()) {
            path.mkdirs();
        }
    }
}

模板準(zhǔn)備

第一步:首先要編寫Word模板,可以參考文章開頭的示例圖片。
第二步:Word模板編寫好后,點擊另存為,然后選擇Word 2003 XML文檔

第三步:保存好后的文件打開,Ctrl+A復(fù)制文檔所有內(nèi)容,然后在線搜索XML格式化在線工具,我這邊提供一個現(xiàn)成的XML格式化在線工具,將內(nèi)容全部粘貼進(jìn)去后點擊格式化按鈕。

創(chuàng)建ftl文件

上面所有工作準(zhǔn)備好后,就可以在resource目錄下創(chuàng)建一個.ftl文件,然后將格式化后的代碼復(fù)制到文件中即可。

測試導(dǎo)出是否完整

Controller層編寫測試代碼,判斷是否可以正常導(dǎo)出

    /**
     * 導(dǎo)出(word)關(guān)鍵過程控制詳細(xì)信息詳細(xì)信息(xml版本)
     */
    @PostMapping(value = "/exportWord")
    public void getInfo(MakeCriticalProcessControl param, HttpServletResponse response) {
        try {
            MakeCriticalProcessControl obj=
                    makeCriticalProcessControlService.selectById(param.getId());
          
            Map<String, Object> context = new HashMap<>();
            context.put("obj", obj);
            WordUtil.GeneratorWord(response, context, "/wordDocumentFtl/make/", "MakeCriticalProcessControl.ftl");
        } catch (Exception e) {
            e.printStackTrace();
            throw new ServiceException("導(dǎo)出Word文件失敗,請稍后重試!");
        }
    }

WordUtil.GeneratorWord()方法
第二個參數(shù)context為數(shù)據(jù)庫的數(shù)據(jù),要往word中空白單元格所填充的。
第三個參數(shù)為templatePath – 模板文件的路徑(相對路徑)。
第四個參數(shù)為具體的模板的文件名稱(帶后綴)

注:測試后需檢查格式是否混亂,是否有缺少單元格等情況,如果有則檢查原Word模板并修復(fù)然后重新走一遍流程即可

如何將數(shù)據(jù)庫數(shù)據(jù)填充到Word中

ftl文件中的內(nèi)容是一行一行的順序,也就是從第一行的第一個單元格開始,然后是第一行第二個單元格,第三個單元格…
然后第一行如果結(jié)束了,則是第二行第一個單元格、第二個單元格、第三個…

以此類推,所以優(yōu)先找到對應(yīng)標(biāo)題的對應(yīng)數(shù)據(jù)單元格在ftl文件的哪個位置。

如果是單個屬性或?qū)ο箢愋偷?,可以在controller中使用Map<String, Object> context = new HashMap<>();將數(shù)據(jù)put,然后key作為鍵,在ftl文件中可以把屬性獲取出來。例如下圖

如果涉及到遍歷,將一個list結(jié)果導(dǎo)出到word,請看以下案例

如果是遍歷導(dǎo)出的話,則在word模板設(shè)置時,只需要設(shè)置一行表頭,下方對應(yīng)一行空的單元格即可,我們要循環(huán)空的單元格,然后將數(shù)據(jù)挨個寫入。

只需要在標(biāo)題下寫一行即可

在controller中依舊是查詢出對應(yīng)list,然后put到map中

1:判斷l(xiāng)ist是否為空
2:循環(huán)遍歷list
3:一般<w:tr>表示為行,所以這里的意思就是,list有多少數(shù)據(jù),則就生成多少行
如何要獲取值的話就可以${item.屬性名!}

如果涉及到If語句或者是需要將數(shù)字轉(zhuǎn)為對應(yīng)的狀態(tài)

以上就是Java使用FreeMarker來實現(xiàn)Word自定義導(dǎo)出功能的詳細(xì)內(nèi)容,更多關(guān)于Java FreeMarker Word自定義導(dǎo)出的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java 同步鎖(synchronized)詳解及實例

    Java 同步鎖(synchronized)詳解及實例

    這篇文章主要介紹了Java 同步鎖(synchronized)詳解及實例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • JavaSE學(xué)習(xí)之內(nèi)部類及常用API

    JavaSE學(xué)習(xí)之內(nèi)部類及常用API

    這篇文章主要介紹了JavaSE中的內(nèi)部類和幾個常用的API,文中的示例代碼介紹詳細(xì),對我們學(xué)習(xí)JavaSEI有一定的幫助,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2021-12-12
  • maven導(dǎo)入無法拉取所需依賴的解決方法

    maven導(dǎo)入無法拉取所需依賴的解決方法

    最近遇到個問題maven導(dǎo)入無法拉取所需依賴的解決方法,本文就來詳細(xì)的介紹一下解決方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • Java判斷事務(wù)有無提交成功的常用方法

    Java判斷事務(wù)有無提交成功的常用方法

    在Java中,判斷事務(wù)是否成功提交可以通過多種方式實現(xiàn),具體取決于你使用的事務(wù)管理機制,以下是幾種常見的情況及其對應(yīng)的解決方案,需要的朋友可以參考下
    2025-10-10
  • JavaCV實現(xiàn)圖片中人臉檢測的示例代碼

    JavaCV實現(xiàn)圖片中人臉檢測的示例代碼

    這篇文章主要介紹了如何利用JavaCV實現(xiàn)圖片中人臉檢測的功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的可以了解一下
    2022-11-11
  • JAVA 格式化JSON數(shù)據(jù)并保存到j(luò)son文件中的實例

    JAVA 格式化JSON數(shù)據(jù)并保存到j(luò)son文件中的實例

    這篇文章主要介紹了JAVA 格式化JSON數(shù)據(jù)并保存到j(luò)son文件中的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • eclipse/intellij idea 遠(yuǎn)程調(diào)試hadoop 2.6.0

    eclipse/intellij idea 遠(yuǎn)程調(diào)試hadoop 2.6.0

    這篇文章主要介紹了eclipse/intellij idea 遠(yuǎn)程調(diào)試hadoop 2.6.0的相關(guān)資料,需要的朋友可以參考下
    2016-07-07
  • Spring Boot從Controller層進(jìn)行單元測試的實現(xiàn)

    Spring Boot從Controller層進(jìn)行單元測試的實現(xiàn)

    這篇文章主要介紹了Spring Boot從Controller層進(jìn)行單元測試的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Springcloud中Feign傳遞參數(shù)的過程解析

    Springcloud中Feign傳遞參數(shù)的過程解析

    這篇文章主要介紹了Springcloud中Feign傳遞參數(shù)的過程,單個參數(shù)的傳值有兩種方式,第一種使用@RequestParam/@PathVariable進(jìn)行傳值,傳遞多個參數(shù):多個參數(shù)的傳值可以使用多個@RequestParam來進(jìn)行傳參,需要的朋友可以參考下
    2023-09-09
  • SpringMvc入門指南(必看)

    SpringMvc入門指南(必看)

    下面小編就為大家?guī)硪黄猄pringMvc入門指南(必看)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06

最新評論

鄂托克旗| 明光市| 长阳| 上虞市| 抚远县| 集安市| 延川县| 吉林省| 南通市| 平武县| 连南| 马尔康县| 蓬莱市| 宜州市| 叙永县| 景宁| 甘德县| 通化县| 无锡市| 兰西县| 青冈县| 财经| 石柱| 高雄市| 青岛市| 孟州市| 兴隆县| 北宁市| 望谟县| 雷山县| 福海县| 雅江县| 五河县| 股票| 中方县| 德令哈市| 彭泽县| 湟源县| 新昌县| 临城县| 恩平市|