`
Harold_xlp
  • 浏览: 159202 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Freemarker+XML导出Word

 
阅读更多

   本来来自http://blog.csdn.net/xiexl/article/details/6747767;

 在Web应用中,有时需要按照固定的模板将数据导出到Word,如流程审批单,在流程处理完成后将处理过程按照流程单的要求导出,有时程序中需要实现生成标准Word文档,要求能够打印,并且保持页面样式不变,常见的方案有POI、iText、JACOB、JSP几种方式,POI读取Word文档比较适合、对于生成文档样式比较难控制,iText操作Excel还可以,对Word的操作功能有限,JACOB操作Word实现复杂,并且无法将服务部署到Linux平台,要求安装office,对于实现固定格式的报表实现困难,对于JSP直接输出方式样式控制难。

Word从2003开始支持XML格式,用XML+Freemarder还做就很简单了,大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。经测试这样方式生成的word文档完全符合office标准,样式、内容控制非常便利,打印也不会变形,生成的文档和office中编辑文档完全一样。具体实现过程如下:

1、  首先用office【版本要2003以上,以下的不支持xml格式】编辑文档的样式,将需要动态填充的内容使用Freemarker标签替换:Word文档样式如下:

 

2、  将Word文档另存为XML格式,将后缀名“xml”修改为“ftl”

3、  使用Freemarker填充内容,代码如下:

 
  1. package com.test.freemarker.report;  
  2.   
  3.    
  4.   
  5. import java.io.BufferedWriter;  
  6.   
  7. import java.io.File;  
  8.   
  9. import java.io.FileOutputStream;  
  10.   
  11. import java.io.IOException;  
  12.   
  13. import java.io.OutputStreamWriter;  
  14.   
  15. import java.io.Writer;  
  16.   
  17. import java.util.HashMap;  
  18.   
  19. import java.util.Map;  
  20.   
  21.    
  22.   
  23. import freemarker.template.Configuration;  
  24.   
  25. import freemarker.template.Template;  
  26.   
  27. import freemarker.template.TemplateException;  
  28.   
  29.    
  30.   
  31. public class DocumentHandler {  
  32.   
  33.    private Configuration configuration = null;  
  34.   
  35.    
  36.   
  37.    public DocumentHandler() {  
  38.   
  39.       configuration = new Configuration();  
  40.   
  41.       configuration.setDefaultEncoding("utf-8");  
  42.   
  43.    }  
  44.   
  45.    
  46.   
  47.    public void createDoc() {  
  48.   
  49.       // 要填入模本的数据文件   
  50.   
  51.       Map dataMap = new HashMap();  
  52.   
  53.       getData(dataMap);  
  54.   
  55.       // 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载,   
  56.   
  57.       // 这里我们的模板是放在com.havenliu.document.template包下面   
  58.   
  59.       configuration.setClassForTemplateLoading(this.getClass(),  
  60.   
  61.             "/com/test/freemarker/report");  
  62.   
  63.       Template t = null;  
  64.   
  65.       try {  
  66.   
  67.          // test.ftl为要装载的模板   
  68.   
  69.          t = configuration.getTemplate("test.ftl");  
  70.   
  71.          t.setEncoding("utf-8");  
  72.   
  73.       } catch (IOException e) {  
  74.   
  75.          e.printStackTrace();  
  76.   
  77.       }  
  78.   
  79.       // 输出文档路径及名称   
  80.   
  81.       File outFile = new File("D:/test.doc");  
  82.   
  83.       Writer out = null;  
  84.   
  85.       try {  
  86.   
  87.          out = new BufferedWriter(new OutputStreamWriter(  
  88.   
  89.                 new FileOutputStream(outFile), "utf-8"));  
  90.   
  91.    
  92.   
  93.       } catch (Exception e1) {  
  94.   
  95.          e1.printStackTrace();  
  96.   
  97.       }  
  98.   
  99.       try {  
  100.   
  101.          t.process(dataMap, out);  
  102.   
  103.          out.close();  
  104.   
  105.       } catch (TemplateException e) {  
  106.   
  107.          e.printStackTrace();  
  108.   
  109.       } catch (IOException e) {  
  110.   
  111.          e.printStackTrace();  
  112.   
  113.       }  
  114.   
  115.    }  
  116.   
  117.    
  118.   
  119.    /** 
  120.  
  121.     * 注意dataMap里存放的数据Key值要与模板中的参数相对应 
  122.  
  123.     *  
  124.  
  125.     * @param dataMap 
  126.  
  127.     */  
  128.   
  129.    private void getData(Map dataMap) {  
  130.   
  131.       dataMap.put("title_name""用户信息");  
  132.   
  133.       dataMap.put("user_name""张三");  
  134.   
  135.       dataMap.put("org_name""微软公司");  
  136.   
  137.       dataMap.put("dept_name""事业部");  
  138.   
  139.    }  
  140.   
  141. }  

4、  生成的Word结果如下:

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

 

 

分享到:
评论

相关推荐

    java web+freemarker导出word

    java web+freemarker 导出word 单个字符串${name}, 列表<#list tail as item> ${item.id} ,附有源码,导出word的word模板 以及另存为的xml文件和 ftl模板,只需要改下里面的查询数据库即可

    freemarker+action+word

    对于Word文档生成,Freemarker模板会被转化为符合Word格式的XML,再由Apache POI解析并写入到Word文件中。 例如,一个常见的应用场景可能是企业报表系统:用户在网页上选择特定条件后,后台Action处理查询请求,...

    java使用freemarker模板技术导出word

    Java 使用 FreeMarker 模板技术导出 Word 是一种常见的数据动态生成文档的方法,它结合了 Java 的编程能力和 FreeMarker 模板引擎的强大功能,能够帮助开发者高效地生成结构化的 Word 文档。FreeMarker 是一个开源的...

    freemarker模板导出word循环图片表格源码和详细教程

    在本教程中,我们将探讨如何利用Freemarker模板来导出Word文档,并实现循环插入图片和表格的功能。这对于需要批量生成定制化报告或者文档的应用场景非常有用。 首先,我们需要了解Freemarker的基本语法。在...

    java freemarker导出word -包含多张图片导出

    在Java应用中,使用FreeMarker导出Word文档可以提供灵活的文本和数据结合的方式,尤其适用于生成报告、合同等复杂格式的文档。本篇将详细介绍如何使用FreeMarker与Java结合来导出包含多张图片的Word文档。 1. **...

    freemarker 导出word表格

    总结,FreeMarker导出Word表格的核心在于理解XML结构,创建FreeMarker模板,以及正确地绑定数据。这个方法的好处是可以将格式设计与数据分离,使得数据的更新和格式的维护变得更加灵活和高效。在处理大量数据的导出...

    Java项目中利用Freemarker模板引擎导出--生成Word文档

    基于Java语言来导出Word文档的方式也有很多种,如Jacob,Apache POI,Freemarker,PageOffice,java2word 等等。。。。 在这里将通过Freemarker这个模板引擎来实现导出 Word,项目不限于Swing,SSH,SSM,Spring ...

    Java freemarker 根据模板 导出word.rar

    springboot 根据word模板,导出word,设置好word2003模板,利用 word2003->另存为 2003.xml->.ftl。然后根据ftl,填充数据导出word. 生成xml或者 flt文件后可以用 vs或者 IDEA 格式化代码,方便阅读

    java利用FreeMarker导出word

    Java利用FreeMarker导出Word是一项常见的技术需求,尤其在企业级应用中,常常需要将动态数据生成为Word文档,例如报告、合同等。FreeMarker是一个模板引擎,它能将Java对象的数据绑定到模板上,生成HTML、XML或者如...

    使用FreeMarker实现导出word实例

    在本例中,我们将探讨如何利用FreeMarker来实现Word文档的导出。FreeMarker的工作原理是,它将数据模型与模板结合,生成最终的输出文档。在Java应用中,这通常涉及创建一个FreeMarker配置对象,加载模板文件,设置...

    freemarker导出Excel、Word、HTMLdemo

    - 导出Word文件可以借助于Apache POI或OpenOffice API。流程与导出Excel相似,只是模板需要按照Word文档的结构设计。 - 模板设计上,可以使用Freemarker的文本、段落、列表等指令创建Word文档的结构,用`<#assign>...

    Java 用Freemarker导出word文档总结

    在Java中利用FreeMarker导出Word文档,可以极大地提高代码的可维护性和灵活性。 首先,我们需要了解FreeMarker的基础知识。FreeMarker是一个基于模板的视图技术,它将数据模型和视图模板分离,使得开发者可以专注于...

    freeMarker导出word两种方式最全代码样例.rar

    本示例主要探讨了使用FreeMarker导出Word的两种方法:通过生成XML模板和通过HTML模板直接导出。 1. **生成XML方式模板并附带图片导出** 在这种方法中,首先我们需要创建一个XML模板,该模板定义了Word文档的结构和...

    Java用freemarker导出word例子

    在Java中,我们需要以下步骤来使用`Freemarker`导出Word: 1. **配置Freemarker**: 首先,你需要添加`freemarker`的依赖到项目中,通常是在`pom.xml`中添加Maven依赖或在`build.gradle`中添加Gradle依赖。然后,...

    Java用freemarker导出word文档

    `Java用freemarker导出word文档`这个主题涉及到的技术点主要包括Java的Freemarker模板引擎和处理Word文档的相关库。Freemarker是一个强大的、基于模板的生成器,广泛用于Web应用中的动态HTML生成。在这里,它被用来...

    基于Freemarker和xml实现Java导出word

    基于Freemarker和xml实现Java导出word Freemarker是一种基于模板的Java模板引擎,它可以将数据和模板结合,生成最终的文档。在这里,我们主要介绍了基于Freemarker和xml实现Java导出word的方法。 Freemarker的优点...

    生成WORD freemarker导出WORD

    本项目“生成WORD freemarker导出WORD”正是这样一个解决方案,它允许开发者使用FreeMarker模板来创建和导出Microsoft Word文件。 首先,我们要理解FreeMarker的工作原理。FreeMarker是一个基于Java的模板语言,它...

    freemarker-2.3.30模板word导出.zip

    压缩包可能包含一份指南,详细说明如何配置和使用提供的Java代码和模板来导出Word文档。这可能涵盖模板的编写规则,数据模型的设计,以及执行导出的步骤。 6. **模板设计**: 在Freemarker中,模板通常包含文本和...

Global site tag (gtag.js) - Google Analytics