• 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

  • 相关阅读:
    中医手诊原理
    半月痕
    0020 教您新手修车的五种实用技巧
    下面说说我开车12年来的一些心得
    创建电子邮件信纸
    交通事故责任划分2011版(图解)
    育儿语录
    汽车中控台那些按钮是什么用的?
    我的书中的部分函数
    纠结的书名
  • 原文地址:https://www.cnblogs.com/java-class/p/4686325.html
Copyright © 2020-2023  润新知