FreeMarker(XML模板)导出word

  在项目中使用它完成的功能是按照固定的模板将数据导出到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的开源包

1 import freemarker.template.Configuration;
2 import freemarker.template.Template;
3 import freemarker.template.TemplateException;

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

 1 package com.test.freemarker.report;
 2 import java.io.BufferedWriter;
 3 import java.io.File;
 4 import java.io.FileOutputStream;
 5 import java.io.IOException;
 6 import java.io.OutputStreamWriter;
 7 import java.io.Writer;
 8 import java.util.HashMap;
 9 import java.util.Map;
10 import freemarker.template.Configuration;
11 import freemarker.template.Template;
12 import freemarker.template.TemplateException;
13
14 public class DocumentHandler {
15    private Configuration configuration = null;
16
17    public DocumentHandler() {
18       configuration = new Configuration();
19       configuration.setDefaultEncoding("utf-8");
20    }
21
22    public void createDoc() {
23       // 要填入模本的数据文件
24       Map dataMap = new HashMap();
25       getData(dataMap);
26       // 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,
27       // 这里我们的模板是放在com.havenliu.document.template包下面
28       configuration.setClassForTemplateLoading(this.getClass(), "/com/test/freemarker/report");
29       Template t = null;
30       try {
31          // test.ftl为要装载的模板
32          t = configuration.getTemplate("test.ftl");
33          t.setEncoding("utf-8");
34       } catch (IOException e) {
35          e.printStackTrace();
36       }
37       // 输出文档路径及名称
38       File outFile = new File("D:/test.doc");
39       Writer out = null;
40       try {
41          FileOutputStream fos = new FileOutputStream(outFile);
42          OutputStreamWriter oWriter = new OutputStreamWriter(
43  fos,"UTF-8");//这个地方对流的编码不可或缺,使用main()单独调用时,应该可以,但是如果是web请求导出时导出后word文档就会打不开,并且包XML文件错误。主要是编码格式不正确,无法解析。
44          out = new BufferedWriter(oWriter);
45          /** out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8")); **/
46       } catch (Exception e1) {
47          e1.printStackTrace();
48       }
49       try {
50          t.process(dataMap, out);
51          out.close();
52       } catch (TemplateException e) {
53          e.printStackTrace();
54       } catch (IOException e) {
55          e.printStackTrace();
56       }
57    }
58
59    /**
60     * 注意dataMap里存放的数据Key值要与模板中的参数相对应
61     * @param dataMap
62     */
63    private void getData(Map dataMap) {
64       dataMap.put("title_name", "用户信息");
65       dataMap.put("user_name", "张三");
66       dataMap.put("org_name", "微软公司");
67       dataMap.put("dept_name", "事业部");
68    }
69 }

三、生成的Word结果如下:

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

四、总结

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

  转载自:http://blog.csdn.net/xiexl/article/details/6747767

时间: 2024-10-30 00:49:18

FreeMarker(XML模板)导出word的相关文章

C#,WPF使用word模板导出word文档

使用word模板导出word文档,首先需要在word模板中插入书签: 根据创建的书签名和位置,将需要写入的内容插入到word文件中. 需要引用  Microsoft.Office.Interop.Word;在添加引用-程序集中搜索可以找到. using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Windows; usin

java使用freemarker作为模板导出Excel表格

1:首先新建一个excel表格自己弄好格式如下图 2:把excel 表格另存为xml格式文件如下图 3:这个时候的文件就是xml 格式的文件了,在myeclipse里面项目工程里面新建一个文件后缀为.ftl 然后把弄好的xml文件内容直接复制粘贴到.fl文件里面 如图 4:好了,现在我们直接java 后台action 类代码如下 /** * 导出订单表 * @throws Exception */ public void exportOrder() throws Exception{ HttpS

利用模板导出文件(二)之jacob利用word模板导出word文件(Java2word)

先下载jacob.jar包. 解压后将jacob.dll放到windows/system32以下或\jre\bin以下. 将jacob.jar增加项目. 这样项目的环境基本上搭建完毕,接下来就是书写相关的代码: /** * 传入数据为HashMap对象,对象中的Key代表word模板中要替换的字段.Value代表用来替换的值. * word模板中全部要替换的字段(即HashMap中的Key)以特殊字符开头和结尾. * 如:$code$.$date$--.以免执行错误的替换. * 全部要替换为图片

按照word/Excel模板导出word/excel

最近项目要实现下载打印的功能,想了想,用水晶报表实在是大材小用, 用office组件直接就可以实现这一功能. 引用类 using Microsoft.Office.Interop.Word; 建立两个实体类 一个是导出word需要替换内容的配置,一个是替换内容的实体 public class AgentInfoEntity     {                 private string comname; public string ComName         {          

freemarker根据模板生成word文件实现导出功能

一.准备工作 1.创建一个03的word文档,动态的数据用占位符标志占位(如testname).然后另存为word2003的xml文件. 2.格式化xml文件,占位符的位置用${testname}代替,若有多行格式相同数据等,用List循环. 注意:不要用Eclipse工具去格式化xml文件(会导致导出的word文件不能用office软件打开,但是PDF能打开,估计是pdf的容错率高于office),推荐使用firstObject工具格式化xml文件. 3.将xml文件(也可以改成ftl格式)存

使用Spire.Doc组件利用模板导出Word文档

以前一直是用Office的组件实现Word文档导出,但是让客户在服务器安装Office,涉及到版权:而且Office安装,包括权限配置也是比较麻烦. 现在流行使用第三方组件来实现对Office的操作,有NPOI,Spire等第三方组件.开始考虑的是NPOI,毕竟它在操作Excel方面还是很强大的:但是不知道是它本身没有,还是我没找到,无法实现利用Word模板的标签插入内容,纯靠代码去生成Word文档,排版是个大问题.最终找到了Spire.Doc组件,轻松实现! Spire的官网地址:https:

java导出word文档

使用freemarker模板导出word文档,用的比较多.这里也是采用的这种方式. 1  编辑一个word文件的模板,用于在程序中需要读入填充在模板中的数据先用字母代替,注意word版本为word2003或高于这个版本: 如:test.doc 2 把模板另存为xml文件: 如:test.xml 3 在xml中查找之前用字母代替的值 加上${} ,如${test}  ${guojia},把文件名改为test.ftl; 4 在项目的WebContent目录下新建一个文件夹,把test.xml放进去:

利用html模板生成Word文件(服务器端不需要安装Word)

利用html模板生成Word文件(服务器端不需要安装Word) 由于管理的原因,不能在服务器上安装Office相关组件,所以只能采用客户端读取Html模板,后台对模板中标记的字段数据替换并返回给客户端的方法来实现,经过测试这种方法也是一种不错的选择! 首先自己写一个html网页模板,代码如下: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>

站在巨人的肩膀上——人事项目数据导出word

最近在做人事项目中的,数据导出word,具体的说就是从web客户端页面获取信息,添加到信函模板中,再导出为word文档.总结一下,学会了两种方法,1.通过将word模板转换为html文件,输出word.2.利用第三方组件Aspose.Words操作word模板,输出word. 一.通过将word模板转换为html文件,输出word 1.制作word模板,在word文档中要添加内容的地方输入占位符. 2.把word模板另存为html文件. 文件-另存为-网页htm文件. 3前台代码 <asp:Bu