关于Freemarker生成word的使用(java生成word)
用freemarker做了一个项目,把使用心得留下来以便学习.
Freemarker具体的是什么就不解释了,不明白的同学可以baidu.
我主要是用这个开源的控件做word的动态生成,
首先客户需要的word一般性都有模板,我们只要改动其中的一部分值就可以了,比如姓名,日期,表名,表中数据等.第一步要做的就是,把着些要改动的地方找出来,打上标记.比如一个X 或者随便的什么,好方便自己查找.
第二步就是把word模板,转化为xml文件(word可以另存为xml的),用UE等工具打开,eclipse也可以,注意字符编码,word的字符编码为utf-8,所以打开是最好是先不要改动,先看编码是否正确(不正确的改下字符编码),然后寻找你刚才在word中留下的标记,把他们换成freemarker标记.---友情提醒, eclipse可以自动排版xml.
比如把姓名换成${username},日期换成${date},等至于表格,因为是,xml所以是可以找到表结构的.例如
Word是这样的
XMl是这样的:
一般是这么做的,先把表格外面的数据都替换了,每个标记不相同就行.
比如
接下来是表格:表格应为是重复的多条数据所以可以这么来:
在表格的开头(表头之下,数据开始的地方)打上标记:
在结尾在打上标记
替换表里的每个字段:
然后保存:
我的xml的保存文件名叫test2.xml.等下会用到这个
接下来开始写程序:
首先你要有这些;就是freemarker的开源包,百度一个,导入就好,
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
接下来这么做:
目录:
TheFreemarker:
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public
class TheFreemarker {
private Configuration
configuration = null;
public TheFreemarker() {
configuration =
new Configuration();
configuration.setDefaultEncoding("UTF-8");
}
public
void createDoc() {
// 要填入模本的数据文件
Map dataMap = new HashMap();
getData(dataMap);
// 设置模本装置方法和路径
// 这里我们的模板是放在src.model包下面
configuration.setClassForTemplateLoading(this.getClass(),
"model");
Template t = null;
try {
t = configuration.getTemplate("test2.xml");
// 装载test2.xml模板
} catch (IOException e) {
e.printStackTrace();
}
// 输出文档路径及名称
File outFile = new File("D:/outFileDoc.doc");
Writer out = null;
try {
out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(outFile),"utf-8"));
} catch (Exception e1) {
e1.printStackTrace();
}
try {
t.process(dataMap, out);
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
*
注意dataMap里存放的数据Key值要与模板中的参数相对应
* @param
dataMap
*/
private
void getData(Map dataMap) {
dataMap.put("name",
"小新与小白");//姓名 xml里的标记为${name}
dataMap.put("Tdate",
"2011-12-02");//时间 xml里的标记为${Tdate}
dataMap.put("address",
"北京海淀区");//时间 xml里的标记为${address}
List table2 = new ArrayList();
for (int i = 0; i < 5; i++) {
Table2 t = new Table2();
t.setApplyno("BBBBBBBB-BB");
t.setCustname("小新");
t.setLoandate("2012-12-12");
t.setRegion("999-999");
table2.add(t);
}
dataMap.put("table2", table2);
}
}
Table2 为
public
class Table2 {
private String
applyno;
private String
custname;
private String
loandate;
private String
region;
public
StringgetApplyno() {
return
applyno;
}
public
void setApplyno(String applyno) {
this.applyno = applyno;
}
public String getCustname() {
return
custname;
}
public
void setCustname(String custname) {
this.custname = custname;
}
public String getLoandate() {
return
loandate;
}
public
void setLoandate(String loandate) {
this.loandate = loandate;
}
public String getRegion() {
return
region;
}
public
void setRegion(String region) {
this.region = region;
}
}
测试类:
public
class Pptest {
public
static void main(String[] args) {
TheFreemarker tf=new TheFreemarker();
tf.createDoc();
}
}
执行结果: