1. 程式人生 > >java後臺利用模板生成Word文件提供前臺下載

java後臺利用模板生成Word文件提供前臺下載

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

在博主完成尚未完成的web專案的過程中,又遇到了這樣一個需求,當用戶點選相關按鈕時,系統依據模板生成一份Word文件並提供下載。

實現的依據參考了這篇部落格,現在將我的實現過程記錄下來,為後人行個方便也為自己留個記錄。

首先要指出的是,實現的思路和freeMarker差不離,將.doc的文件做相應的轉換後轉為.ftl文件,其中的變數會以${xxx}來代替,這樣就可以

使用freeMarker模板引擎來替換變數啦為例,動態生成檔案後傳送到瀏覽器端提供使用者下載。所以,實現該功能分為以下幾個步驟,以我的

專案為例,一些敏感的資訊可能不予展示,但不影響該功能的學習。

1.為你的專案匯入freeMarker包

我的專案是依靠maven來維護依賴的,所以引入很方便,只需要在pom檔案中加入下面這個依賴就好

<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.23</version>
</dependency>

如果還是比較傳統的話,就像那個連結裡的專案一樣,把jar包匯入專案吧

2.依據模板動態生成word文件,首先你得有個模板

模板是doc型別就好,注意不是docx,docx沒有嘗試,doc型別已經滿足了我的需求,朋友們如果嘗試成功了可以告訴我一下

test.doc,注意“產品品質證明書”是一張圖片哦,圖片會漂亮的留在生成的新文件中。將變數替換成${xxx}即可,這裡只選了兩

個變數


3.點選 檔案->另存為 將test.doc儲存為xml型別,即 Word XML文件 .xml型別 ,得到test.xml

4.用notepad或者sublime開啟test.xml,你會發現${xxx}會被分割成${*********xxx********)的樣子,將*******刪除,保證它又成了完整的變數

標籤,像這樣


5.將檔案已utf-8編碼儲存,另存為為.ftl,找不到該格式直接改檔案字尾名就行,這樣得到test.ftl

6.前臺觸發事件

我的專案是基於SpringMVC的,所以前臺觸發只需要在view層的檔案里加個按鈕事件即可,直接上程式碼

function generateMillCertificate(id) {//點選下載按鈕觸發的事件
        window.location.href = '../deliveryOrder/exportMillCertificate?id=' + id;
    }
7.後臺生成檔案,並返回給客戶的瀏覽器

這裡又分為兩步

a.controller層接收請求,根據引數拼湊資料,放在map中

/***
     * 匯出Word材質單
     *
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "exportMillCertificate", method = RequestMethod.GET)
    @ResponseBody
    public void exportMillCertificate(HttpServletRequest request,
                      HttpServletResponse response) throws Exception {
        //獲得資料,系統相關,就不展示了
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("customerShortName",deliveryOrder.getRepositoryName());
        map.put("productName",deliveryOrderDetail.getProductName());
        WordUtils.exportMillCertificateWord(request,response,map);
    }
b.工具類WordUtils利用傳來的map和將要返回給使用者的HTTPServletReponse,將map裡的資料和模板中${xxx}標籤對應的變數值填入,

生成新的文件,通過response返回給瀏覽器並提供使用者下載

public class WordUtils {
    //配置資訊,程式碼本身寫的還是很可讀的,就不過多註解了
    private static Configuration configuration = null;
    //這裡注意的是利用WordUtils的類載入器動態獲得模板檔案的位置
    private static final String templateFolder = WordUtils.class.getClassLoader().getResource("../../").getPath() + "asserts/templete/";
    static {
        configuration = new Configuration();
        configuration.setDefaultEncoding("utf-8");
        try {
            configuration.setDirectoryForTemplateLoading(new File(templateFolder));
        } catch (IOException e) {
            e.printStackTrace();
        }
   }

    private WordUtils() {
        throw new AssertionError();
    }

    public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map) throws IOException {
        Template freemarkerTemplate = configuration.getTemplate("test.ftl");
        File file = null;
        InputStream fin = null;
        ServletOutputStream out = null;
        try {
            // 呼叫工具類的createDoc方法生成Word文件
            file = createDoc(map,freemarkerTemplate);
            fin = new FileInputStream(file);

            response.setCharacterEncoding("utf-8");
            response.setContentType("application/msword");
            // 設定瀏覽器以下載的方式處理該檔名
            String fileName = "材質單"+DateUtils.curDateTimeStr14() + ".doc";
            response.setHeader("Content-Disposition", "attachment;filename="
                    .concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));

            out = response.getOutputStream();
            byte[] buffer = new byte[512];  // 緩衝區
            int bytesToRead = -1;
            // 通過迴圈將讀入的Word檔案的內容輸出到瀏覽器中
            while((bytesToRead = fin.read(buffer)) != -1) {
                out.write(buffer, 0, bytesToRead);
            }
        } finally {
            if(fin != null) fin.close();
            if(out != null) out.close();
            if(file != null) file.delete(); // 刪除臨時檔案
        }
    }

    private static File createDoc(Map<?, ?> dataMap, Template template) {
        String name =  "test.doc";
        File f = new File(name);
        Template t = template;
        try {
            // 這個地方不能使用FileWriter因為需要指定編碼型別否則生成的Word文件會因為有無法識別的編碼而無法開啟
            Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
            t.process(dataMap, w);
            w.close();
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
        return f;
    }
}
8.可以執行試試看啦,給你看我生成的新文件



是不是完美的一腿。寫到這裡就結束啦。

您的幫助是我莫大的鼓勵!喜歡的話可以掃描左側二維碼隨意打賞哈~支付寶微信都可以,歡迎看看我的其他文章~

這篇文章目前收到了不少朋友的支援,在這裡謝謝你們了,打賞有價,支援與鼓勵無價!

相關推薦

java後臺利用模板生成Word提供前臺下載

----------------------------------------------------------------------------------------------------------------------------------------

java後臺利用Apache poi 生成excel提供前臺下載

之前在專案中會用到在Java在後臺把資料填入Word文件的模板來提供前臺下載,為了自己能隨時檢視當時的實現方案及方便他人學習我寫了這篇部落格,訪問量已經是我寫的部落格裡第一了。於是乎我在學會用Java在後臺利用Apache poi 生成excel文件提供前臺下載之後就想著

java根據ftl模板生成word(列表)

1、在專案開發中很多時候我們要做的事匯出資料列表,那麼如果使用freemarker的時候,list也是不會少的 <#list datelist ?sort_by("name") as data>//根據name排序 reverse為降序 <#list

Java根據Word模板生成Word(Freemarker實現)

public class WordExportUtil { private static Configuration configuration; static { configuration = new Configuration(); configur

使用freemarker模板生成Word和HTML

注:該文件是參考某個大佬的資料,根據自己的需要修改的,具體是哪位大佬的忘了,如果作者自己看到需要加明出處的,請留言你的部落格地址 業務處理: 1,在業務中建立List<Map<String, Object>> data = new ArrayList<Map<Strin

使用freemarker模板生成word

專案中最近用到這個東西,做下記錄。 如下圖,先準備好一個(office2003)word文件當做模板。文件中圖片、姓名、性別和生日已經使用佔位符代替,生成過程中將會根據實際情況進行替換。 然後將word文件另存為“Word XML文件” 使用xml編輯器開啟test.xml,

模板生成word By POI+Word書籤功能

剛開始接到生成文件的時候,我的內心是拒絕的,腦海裡回想起了苦痛挪位置調畫素的jasper,和不停add各種style的POI。但是這個模組都歸我~~~老子說了算趕緊上網搜搜有沒什麼easy way。看到挺多人說起FreeMarker,大略一看So easy啊,只要做好一個w

利用QT生成Word

   前段時間因一個專案的需要,需要用Qt生成Word報告,網上查閱並借鑑了相關資料終於解決了基本的問題。本文件中主要是基本資料的填充、資料表格和圖片幾種型別,所以是用word模板(.dot)和書籤進行操作。(網上看有種方法是利用巨集來進行操作,表示不是很懂,哈哈)。 一、

java poi 基於模板檔案替換字元生成word

最近在公司開發個小功能,要求是基於需求提供的word文件模板來生成規定的word文件。 想了一下,就用了poi來做,這裡特別強調一點,實現該功能所需的jar包最好是:poi-scratchpad-3.

利用freemarker 在模板裡面寫入動態資料,動態表格,圖片插入並生成word

利用freemarker 在模板裡面寫入動態資料,動態表格,圖片插入。 以下測試程式碼圖片(image.jpg)和模板(template.xml)是直接放到src目錄下面的,可以根據自己需求調整 廢話不多說,直接上程式碼: 程式碼塊 impor

Java-POI替換Word模板中的變數,生成Word

第一步:在專案中匯入POI的jar包,以及相關的jar包。 所需的jar包列表: 下載地址:http://download.csdn.net/download/qq_34908167/10046670 第二步:建立util工具類。 public class Docx

java匯出mysql資料表的結構生成word

使用sql查詢表的結構是比較簡單,其實這裡難就是難在匯出結構到word文件中。。。,使用poi-tl程式碼也簡單 一、首先jdbc工具類,這個不多說了 public class SqlUtils { private static String url = "jdbc:mysql://lo

Java POI 生成Word

  版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/zhouseawater/article/details/54289495 在開發中有時候我們需要匯出MS word文件。最近因為需要做一個生成word檔案的功能。就將這塊拿出來和

Java Web 生成Word(freemarker方式)

首先在pom檔案中加入下面這個依賴(不是Maven專案的話,把jar包匯入專案即可) <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</ar

使用Java生成word(附原始碼)

原文地址:http://blog.51cto.com/favccxx/1331115 當我們使用Java生成word文件時,通常首先會想到iText和POI,這是因為我們習慣了使用這兩種方法操作Excel,自然而然的也想使用這種生成word文件。但是當我們需要動態生成word時,通常不僅要能夠顯

Java iText使用PDF模板生成PDF

我們系統需要生成一個可以列印的PDF文件,老闆給了我一個Word文件,按照這個Word文件的格式生成PDF文件。 第一步:下載AdobeAcrobat DC,必須使用這個來製作from域。 第二步:使用AdobeAcrobat DC將Word導成PDF文件。 第三步:由於還要加水

JAVA通過模板生成DOC

將word文件另存為xml檔案 接下來,上面寫的拼音就起到作用了. 開啟xml檔案.搜尋 要替換的內容. 改為 ${內容} 改完後,把檔案的字尾名直接改成ftl。 程式碼: package com.hentor.apps.bestsign.util; i

Java Web專案中使用Freemarker生成Word

Web專案中生成Word文件的操作屢見不鮮,基於Java的解決方案也是很多的,包括使用Jacob、Apache POI、Java2Word、iText等各種方式,其實在從Office 2003開始,就可以將Office文件轉換成XML檔案,這樣只要將需要填入的內容放上${

使用模板生成word

dna head exists pri reat tables hang exceptio website 使用poi-tl根據模板生成word文檔,在porm.xml中添加poi-tl依賴,直接上代碼 import java.io.File; import java.i

Java KeyStore 用命令生成keystore

格式 認證 什麽 rsa console www 憑證 代碼 直接 1.生成keyStore文件 在命令行下執行以下命令: Shell代碼 收藏代碼 keytool -genkey -validity 36000 -alias www.zlex.org -keyalg R