Java使用freemarker導出word文檔


通過freemarker,以及JAVA,導出word文檔。

共分為三步:

  第一步:創建模板文件

  第二步:通過JAVA創建返回值。

  第三步:執行

分別介紹如下:

第一步:

首先創建word文檔,按照想要的格式寫好模板,需要替換的位置,使用 ${}  占位,其{}中放入名稱,以便執行代碼時使用。

例子如下

這個模板只要是報告的格式,包括報告名稱,報告時間,報告人。下邊的是編號和標題,以及內容。因為標題和內容方面可能存在多個,在后邊可以循環輸出。

制作完成之后,將該文檔另存為xml格式。(注意:盡量選擇2003版本的xml,否則可能出現文檔太大打不開的問題。)

另存為xml之后,需要對其做簡單的修改以便於循環輸出。

我使用的結果為Map嵌套的,所以輸出的循環語句為

<#assign num= 0>
<#list kejis?keys as key>  //kejis為接收map的鍵。
<#assign num = num+1>

  ${num}${kejis[key].title}    //在這需要找到文檔中中對應位置做相應修改。

</#list>

也可以使用list集合輸出。

修改完成之后將文件后綴修改為ftl格式。備用

第二步:

1.首先准備工具類,導出用,類中的方法共四個參數,按順序為   傳遞的值(Map類型),模板文件,生成word存儲路徑,生成文件名

package Util;
import freemarker.template.Configuration;
import freemarker.template.Template;

import java.io.*;
import java.util.Locale;
import java.util.Map;
public class WordUtil {
    public static void createWord(Map dataMap, String templateName, String filePath, String fileName){
        try {
            //創建配置實例
            Configuration configuration = new Configuration();

            //設置編碼
            configuration.setDefaultEncoding("UTF-8");
            configuration.setEncoding(Locale.getDefault(), "utf-8");
            //ftl模板文件統一放至 com.lun.template 包下面
            configuration.setClassForTemplateLoading(WordUtil.class,"/");

            //獲取模板
            Template template = configuration.getTemplate(templateName);

            //輸出文件
            File outFile = new File(filePath+File.separator+fileName);

            //如果輸出目標文件夾不存在,則創建
            if (!outFile.getParentFile().exists()){
                outFile.getParentFile().mkdirs();
            }

            //將模板和數據模型合並生成文件
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));


            //生成文件
            template.process(dataMap, out);

            //關閉流
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

2.准備返回值及調用

public static void main(String[] args) {
        Map<String, Object> map = new HashMap<String, Object>(); 
        map.put("time", "2019-4-1");
        map.put("name", "報告名稱");
        map.put("bgname", "wys");
        Map<String, Object> kejis=new HashMap<String, Object>(); 
        for(int i=0;i<10;i++) {
            Wordout wordout=new Wordout();
            wordout.setTitle("標題"+i);
            wordout.setContent("內容"+i);
            kejis.put(""+i, wordout);  //注意此處的第一個參數應保持每次put都是不同的
        }
        map.put("kejis", kejis);
        String filePath = "D:\\policy\\" ;
        String filename = "bk.doc";
        WordUtil.createWord(map, "bk.ftl", filePath, filename);    
        
    }

第三步:執行上邊代用主函數的代碼生成word成功,結果如下

 

以上便完成了word文檔導出。

總結:

  經過多次嘗試,導出的word文檔大小和xml文件的大小成正比的,所以在xml文件加循環的時候,應該盡量減少循環中的內容,以減小文件的大小,否則,生成的文件會太大導致打開太慢,或者無法打開的問題。

  並且另存為xml文件的時候,選擇2003版本為宜,因為經過測試,相同的word模板,另存為兩種不同xml大小不同,2003版本的較小,所以選擇該版本。

  假如想入輸出帶有格式的word,只需要將占位符修改為相應格式即可。字體格式,大小,顏色等屬性都會繼承過去。

附:

  這是經常用到的freemarker的語法

  1.if語句(判斷是否為空)  

  <#if      target?? >  

    此處為if為true的內容

  </#if>

  2.list循環(map循環上文使用過了)

  <#list list as t>

    ${t.title}

  </#list>

  如果想實現多層嵌套,只需要將返回值也嵌套進去,xml文件也相應的嵌套即可。

這是我首次使用freemarker的過程,如有錯誤,望指正,我及時修改

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM