您的位置:首页 > 其它

FreeMarker(XML模板)导出word

2015-08-16 15:11 447 查看
  在项目中使用它完成的功能是按照固定的模板将数据导出到Word。比如台账。在完成后将处理过程按照台账的要求导出,有时程序中需要实现生成标准Word文档,要求能够打印,并且保持页面样式不变。

  这个功能就是由XML+Freemarder来实现的,Word从2003开始支持XML格式,大致的步骤:用office2003或者以上的版本编辑 好 word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。

一、模板的制作

先用Word做一个模板,如下图:



然后另存为XML文件,可以利用高亮显示的notepad++打开xml,主要是有高亮显示,和元素自动配对

也可以用foxe_CHS打开xml,是一个简洁、快速的 XML 编辑器,还提供F8对齐排版功能。

保存后,修改后缀名为ftl,至此模板制作完毕。

二、编程实现

首先引入freemarker的开源包

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;


编写java类,主要实现对模板的赋值以及生成流,用于导出。

package com.test.freemarker.report;
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.HashMap;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

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.havenliu.document.template包下面
configuration.setClassForTemplateLoading(this.getClass(), "/com/test/freemarker/report");
Template t = null;
try {
// test.ftl为要装载的模板
t = configuration.getTemplate("test.ftl");
t.setEncoding("utf-8");
} catch (IOException e) {
e.printStackTrace();
}
// 输出文档路径及名称
File outFile = new File("D:/test.doc");
Writer out = null;
try {
FileOutputStream fos = new FileOutputStream(outFile);
OutputStreamWriter oWriter = new OutputStreamWriter(
fos,"UTF-8");//这个地方对流的编码不可或缺,使用main()单独调用时,应该可以,但是如果是web请求导出时导出后word文档就会打不开,并且包XML文件错误。主要是编码格式不正确,无法解析。
out = new BufferedWriter(oWriter);
/** out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8")); **/
} catch (Exception e1) {
e1.printStackTrace();
}
try {
t.process(dataMap, out);
out.close();
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 注意dataMap里存放的数据Key值要与模板中的参数相对应
* @param dataMap
*/
private void getData(Map dataMap) {
dataMap.put("title_name", "用户信息");
dataMap.put("user_name", "张三");
dataMap.put("org_name", "微软公司");
dataMap.put("dept_name", "事业部");
}
}


三、生成的Word结果如下:



对于复杂的报表样式可以在Word中编辑后保存,如果需要输出列表类型数据可以参考Freemarker的循环或逻辑控制。

四、总结

  这个工具生成word确实很方便,但是还是有些不足的地方,FreeMarker三宗罪->http://www.iteye.com/topic/17468

  转载自:http://blog.csdn.net/xiexl/article/details/6747767
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: