java doc 动态数据_Java 动态生成 复杂 .doc文件

项目中需要用 java 程序生成doc 文件,百度一番,FreeMarker 的评价比较高,FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出,至于想详细了解 FreeMarker 的请去问百度.....

这篇博文主要是总结自己在用网上例子时遇到的坑。吃水不忘挖井人,还是要感谢分享技术的前辈。

原文链接:

参照过的例子链接:

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

FreeMarker.jar 下载地址:

主要思路如下:

1.word 里面调整好排版,包括你想生成的动态部分,还有一些不用生成的规则性的文字

32a5dca537a5aec2c4003da79a8fe909.png

2. 将 word 文档保存为 xml

13a3b592018181bccbdd3201525e45f9.png

3.用 Firstobject free XML edito 打开,将你需要动态生成的字段打上标记,${} 这样就可以

6c868bec8330caf9854d1e5592bb756d.png

FreeMarker 还支持需要丰富的标记,如果你想展示更复杂和丰富的内容,都可以实现;

Firstobject free XML edito 友情下载链接:

4.将 xml 文件更改后缀名 为 .ftl, 然后引用到你的项目中

需要注意的问题:

a. word 版本不能低于 2003 ,因为 2003 才开始支持 xml;

b.用 Firstobject free XML edito 打开 要编辑的 xml 文件时,记得xml 不要放在含有中文路径的目录中【编辑器会无响应,然后你知道的.....】。

实现的代码如下:

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileOutputStream;

import java.io.OutputStreamWriter;

import java.io.Writer;

import java.sql.Connection;

import java.sql.ResultSet;

import java.util.HashMap;

import java.util.Map;

import cn.sina.ttjava_13.database.DB;

import freemarker.template.Configuration;

import freemarker.template.Template;

public class WordTest {

private Configuration configuration = null;

private Connection conn;

private ResultSet res;

public WordTest() {

configuration = new Configuration();

configuration.setDefaultEncoding("UTF-8");

}

public void createWord() {

Map dataMap = new HashMap();

try {

String selectSql = "SELECT ID,NAME,NORMALPRICE,MEMBERPRICE FROM T_PRODUCT WHERE 1 LIMIT 10";

conn = DB.getConn();

res = DB.getRs(conn, selectSql);

while(res.next()){

dataMap.put("id", res.getString("id").trim());

dataMap.put("name", res.getString("name").trim());

dataMap.put("normalprice", res.getString("normalprice").trim());

dataMap.put("memberprice", res.getString("memberprice").trim());

configuration.setClassForTemplateLoading(this.getClass(), "/template"); // FTL文件所存在的位置

Template template = configuration.getTemplate("Product.ftl");

File outFile = new File("D:/temp/"+ res.getString("name").trim().replaceAll("/", "") +".doc");

Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));

template.process(dataMap, out);

out.close();

}

DB.close(res);

DB.close(conn);

} catch (Exception e) {

e.printStackTrace();

}

}

public static void main(String[] args) {

WordTest test = new WordTest();

test.createWord();

}

}

a. 代码数据库为 mysql ,将查询到的数据,动态填入到wod 中;

b.template.process(),接受一个 Map 和 输入流做为入参,Map 既是你需要动态生成到 doc 里面的数据,字段名必须与你在 .ftl 里面定义的一致;

c. 我觉得数据的来源可以很多,程序计算的结果,数据库存储的数据,页面点击的数据.........

d. 如果你想利用这段代码,需要有一个 .ftl 文件,并且在你的项目 src 目录下面新建 template 目录;

e.我不知道怎样把 .ftl 文件上传上来,如果需要做例子的,请在下面留言,我发给你。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值