参考http://blog.csdn.net/y_love_f/article/details/41595647
1、首先制作模板
-
新建word文档,如图所示:
文件另存为XML文件,XML文件重命名为ftl。若出现格式字符${name}被断开的情况,可选中该格式字符,清除格式之后再保存为XML文件。
循环处理:
模板中明细表中的数据是一个集合,我们需要循环遍历才能够将数据全部注入,这个时候我们就会用到了FreeMarker本身的语法了。
循环:
<#list array as bean>
${bean.property}
</#list>
代码放在表格的开头和结尾,也即是将表格中的标签包括在循环里面,并表格中的字符 ${number}
替换为${bean.number}
,这样子就可以了。<#list array as bean><w:tr ……>…${bean.number}…</w:tr></#list>
2、准备数据
-
将上面模板中的${}的标签放上对应的数据
首先要将freemarker的jar包放到程序中,然后将上面制作好的模板放到程序中;
编写代码
DocumentHandler.java文件
package com.ftl;
import java.io.*;
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;
import sun.misc.BASE64Encoder;
public class DocumentHandler {
private Configuration configuration = null;
public DocumentHandler() {
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
}
public void createDoc() {
// 要填入模本的数据文件
Map dataMap = new HashMap();
getData(dataMap);
// 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
// 这里我们的模板是放在com.ftl包下面
configuration.setClassForTemplateLoading(this.getClass(),"/com/ftl");
Template t = null;
// 输出文档路径及名称
File outFile = new File("D:/test.doc");
Writer out = null;
try {
// test.ftl为要装载的模板
t = configuration.getTemplate("temple.ftl");
t.setEncoding("utf-8");
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"));
t.process(dataMap, out);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 注意dataMap里存放的数据Key值要与模板中的参数相对应
* @param dataMap
*
*/
@SuppressWarnings("unchecked")
private void getData(Map dataMap) {
// dataMap.put("image", getImageStr());
dataMap.put("name", "张三");
List<Map<String, Object>> newsList=new ArrayList<Map<String,Object>>();
for(int i=1;i<=10;i++){
Map<String, Object> map=new HashMap<String, Object>();
map.put("purchaseTime", "进货日期"+i);
map.put("product", "产品名称"+i);
map.put("factory", "生产厂家"+i);
map.put("spec", "产品规格"+i);
map.put("number", "进货数量"+i);
newsList.add(map);
}
dataMap.put("array",newsList);
}
//图片转为字符串
private String getImageStr() {
String imgFile = "d:/1.png";
InputStream in = null;
byte[] data = null;
try {
in = new FileInputStream(imgFile);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);
}
}
Main.java文件
package com.ftl;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
DocumentHandler dh=new DocumentHandler();
dh.createDoc();
System.out.println("end");
}
}
3、生成效果
4、总结
对于图片固定的情况,可以不用替换xml文件中的图片部分,生成word时会自动转换为原图片显示。如果图片是不固定的,那么可以用${image}
(或其他字符)替换,然后在代码生成word时填充base64码。