Java 動態生成復雜 Word


    項目中需要用 java 程序生成doc 文件,百度一番,發現FreeMarker 的評價比較高。

    FreeMarker是一個用Java語言編寫的模板引擎,它基於模板來生成文本輸出,至於想詳細了解 FreeMarker 的請自行百度。

    這篇博文主要是總結自己在用網上例子時遇到的坑。吃水不忘挖井人,還是要感謝分享技術的前輩。

    參照過的博客鏈接:

    http://www.360doc.com/content/13/0731/10/13247663_303740756.shtml

    http://blog.csdn.net/zhanwentao2/article/details/7255432

1. 制作 Word 模版

 

2. 將 Word文檔保存為 xml 

3. freemarker 標簽語言替換字段

用 Firstobject free XML edito 打開,將你需要動態生成的字段打上標記,${} 這樣就可以

    FreeMarker 還支持需要豐富的標記,如果你想展示更復雜和豐富的內容,都可以實現,具體遇到需求時問度娘即可。

4. 引入項目

    將 xml 文件更改后綴名 為 .ftl, 然后引用到你的項目中

    需要注意的問題:

    a. word 版本不能低於 2003 ,因為 2003 才開始支持 xml;

    b.用 Firstobject free XML edito 打開 要編輯的 xml 文件時,xml 不要放在含有中文路徑的目錄中【編輯器會無響應,然后你知道的.....】。

實現的代碼如下:

 1 import java.io.BufferedWriter;
 2 import java.io.File;
 3 import java.io.FileOutputStream;
 4 import java.io.OutputStreamWriter;
 5 import java.io.Writer;
 6 import java.sql.Connection;
 7 import java.sql.ResultSet;
 8 import java.util.HashMap;
 9 import java.util.Map;
10 
11 import cn.sina.ttjava_13.database.DB;
12 import freemarker.template.Configuration;
13 import freemarker.template.Template;
14 
15 public class WordTest {
16 
17     private Configuration configuration = null;
18     private Connection conn;
19     private ResultSet res;
20 
21     public WordTest() {
22         configuration = new Configuration();
23         configuration.setDefaultEncoding("UTF-8");
24     }
25 
26     public void createWord() {
27         Map<String, Object> dataMap = new HashMap<String, Object>();
28         try {
29             String selectSql = "SELECT ID,NAME,NORMALPRICE,MEMBERPRICE FROM T_PRODUCT WHERE 1 LIMIT 10";
30             conn = DB.getConn();
31             res = DB.getRs(conn, selectSql);
32             while(res.next()){
33                 dataMap.put("id", res.getString("id").trim());
34                 dataMap.put("name", res.getString("name").trim());
35                 dataMap.put("normalprice", res.getString("normalprice").trim());
36                 dataMap.put("memberprice", res.getString("memberprice").trim());
37                 
38                 configuration.setClassForTemplateLoading(this.getClass(), "/template"); // FTL文件所存在的位置
39                 Template template = configuration.getTemplate("Product.ftl");
40 
41                 File outFile = new File("D:/temp/"+ res.getString("name").trim().replaceAll("/", "") +".doc");
42                 Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));
43                 template.process(dataMap, out);
44                 out.close();
45             }
46             DB.close(res);
47             DB.close(conn);
48         } catch (Exception e) {
49             e.printStackTrace();
50         }
51     }
52 
53     public static void main(String[] args) {
54         WordTest test = new WordTest();
55         test.createWord();
56     }
57 }

    a. 代碼數據庫為 mysql ,將查詢到的數據,動態填入到wod 中;

    b.template.process(),接受一個 Map 和 輸入流做為入參,Map 既是你需要動態生成到 doc 里面的數據,字段名必須與你在 .ftl 里面定義的一致;

    c. 我覺得數據的來源可以很多,程序計算的結果,數據庫存儲的數據,頁面點擊的數據.........

    d. 如果你想利用這段代碼,需要有一個 .ftl 文件,並且在你的項目 src 目錄下面新建 template 目錄;

    FreeMarker.jar 、實例項目的.ftl 、XMl編輯工具百度雲地址:

    鏈接: http://pan.baidu.com/s/1qXhD5N2 密碼: 876j


免責聲明!

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



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