`
Harold_xlp
  • 浏览: 154436 次
  • 性别: 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模板,只需要改下里面的查询数据库即可

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

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

    java利用FreeMarker导出word

    一个java导出word的完整工程,可直接运行。利用word转换成xml格式,再转换成FreeMarker格式,生成doc文件

    Java freemarker 根据模板 导出word.rar

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

    freemarker 导出word表格

    用word编好格式,另存为xml文件,修改变量,修改成.ftl模版,然后赛数据导出。

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

    freeMarker导出word两种方式:1、生成xml方式模板并附带图片导出,2、总结生成的html模板可以直接导出word,也可以在页面查看。项目中使用过,拿出来分享

    基于Freemarker和xml实现Java导出word

    主要介绍了基于Freemarker和xml实现Java导出word,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java导出Word文档的实现.docx

    在日常的开发工作中,我们时常会遇到导出Word文档报表的需求,比如公司的财务报表、医院的患者统计报表、电商平台的销售报表等等。 导出Word方式多种多样,通常有以下几种方式: 1. 使用第三方Java工具类库Hutool的...

    freemarker.jar freemarker架包 freemarker生成excel、word、html、xml简单例子

    freemarker生成excel、word、html、xml简单例子

    freemarker 导出word功能

    java利用freemarker组件导出word功能 包含图片有xml模板,下载后可直接运行

    SpringBoot_Freemarker生成Word_多个表格+两层嵌套循环

    SpringBoot_Freemarker生成Word_多个表格+两层嵌套循环; 步骤说明: 1.用Microsoft Office Word打开word原件;将文档中需要动态生成的内容,替换为属性名 ${name} 2.另存为,选择保存类型Word 2003 XML 文档(*....

    用Freemarker生成word文档

    1.用word写一个需要导出的word模板,然后存为xml格式。 2.将xml中需要动态修改内容的地方,换成freemarker的标识符 添加图片 如果你需要在word中添加图片,那你就在第一步制作模板时,加入一张图片占位,然后打开...

    导出word和pdf模板示例文件

    freemarker+itext5实现用模板方式,导出word和pdf 的模板示例文件,使用已经简单编写的word,生成的xml文件和html.

    导出Word:POI or Freemarker

    导出word的两种方式:1.docx文本模板导出;2.docx转换为xml后的文本模板导出; 简单内容可以使用doc模板导出; 复杂内容可以使用xml模板导出(支持行、列数据自增、合并等);

    word文档生成html模板(freemarker)再转为pdf示例代码

    1、Word模板转html模板的操作步骤(图示例+操作...适合人群:需要通过法务提供的word类型的合同模板,填充数据生成pdf的人。 阅读建议:按照上述操作步骤,先看README.md文档,再看other/生成html操作步骤目录下的图片。

    freemarker模版导出

    freemarker模版导出,支持各类模版word、xml、excel等

    java使用word模板导出个人简历

    java使用word模板导出个人简历 a、处理word2003模板导出doc文件 b、处理word2007模板导出docx文件

    java导出word文档,固定模板

    使用freemarker技术,首先将word模板另存为xml文档,方便填充数据。然后将后缀名改为ftl,简单方便.

    freemarker生成复杂word

    在Web应用中,有时需要按照固定的模板将数据导出到Word,如流程审批单,在流程处理完成后将处理过程按照流程单的要求导出,有时程序中需要实现生成标准Word文档,要求能够打印,并且保持页面样式不变,常见的方案有...

Global site tag (gtag.js) - Google Analytics