`
uu011
  • 浏览: 31798 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

详解FreeMarker生成复杂Word文档

    博客分类:
  • java
 
阅读更多
http://www.java.sh/web/freemarker/2012/02/5f84f4d93550710101355ad226780046.html
客户要求用程序生成标准的word文档,要能打印,而且不能变形,以前用过很多解决方案,都在客户严格要求下牺牲的无比惨烈。

  POI读word文档还行,写文档实在不敢恭维,复杂的样式很难控制不提,想象一下一个20多页,嵌套很多表格和图像的word文档靠POI来写代码输出,对程序员来说比去山西挖煤还惨,况且文档格式还经常变化。

  iText操作Excel还行。对于复杂的大量的word也是噩梦。

  直接通过JSP输出样式基本不达标,而且要打印出来就更是惨不忍睹。

  Word从2003开始支持XML格式,用XML还做就很简单了。

  大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。经测试这样方式生成的word文档完全符合office标准,样式、内容控制非常便利,打印也不会变形,生成的文档和office中编辑文档完全一样。

  看看实际效果

  首先用office【版本要2003以上,以下的不支持xml格式】编辑文档的样式,图中红线的部分就是我要输出的部分:



  将编辑好的文档另存为XML





  再用Firstobject free XML editor将xml中我们需要填数据的地方打上FreeMarker标记



  最后生成的文档样式





  主要程序代码:


?code 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; 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; 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/havenliu/document/template"); Template t=null; try { //test.ftl为要装载的模板 t = configuration.getTemplate("test.ftl"); } catch (IOException e) { e.printStackTrace(); } //输出文档路径及名称 File outFile = new File("D:/temp/outFile.doc"); Writer out = null; try { out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile))); } catch (FileNotFoundException e1) { e1.printStackTrace(); } try { t.process(dataMap, out); } catch (TemplateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 注意dataMap里存放的数据Key值要与模板中的参数相对应 * @param dataMap */private void getData(Map dataMap) { dataMap.put("author", "张三"); dataMap.put("remark", "这是测试备注信息"); List _table1=new ArrayList (); Table1 t1=new Table1(); t1.setDate("2010-10-1"); t1.setText("制定10月开发计划内容。"); _table1.add(t1); Table1 t2=new Table1(); t2.setDate("2010-10-2"); t2.setText("开会讨论开发计划"); _table1.add(t2); dataMap.put("table1", _table1); List _table2=new ArrayList (); for(int i=0;i<5;i++) { Table2 _t2=new Table2(); _t2.setDetail("测试开发计划"+i); _t2.setPerson("张三——"+i); _t2.setBegindate("2010-10-1"); _t2.setFinishdate("2010-10-31"); _t2.setRemark("备注信息"); _table2.add(_t2); } dataMap.put("table2", _table2); } }
分享到:
评论

相关推荐

    java带格式导出WORD文档

    5. **生成Word文档**:运行Java程序,Freemarker引擎将数据解析并填充到模板中,最终输出符合原始设计要求的Word文档。 ### 3. 实际案例分析 假设我们需要生成一份报告,该报告包含多个章节,每个章节又有各自的...

    Freemakerxml转word详解.doc

    在Java代码中,你需要加载XML模板,创建数据模型(通常是一个Map或自定义对象集合),然后使用FreeMarker的`Template`类将数据模型合并到模板中,最终生成Word文档。这个过程通常涉及以下步骤: - 加载XML模板文件...

    java导出word

    ### Java生成Word文档:利用Freemarker框架 #### 一、引言 在现代企业级应用开发中,经常需要将数据库中的数据导出为Word文档,以满足业务报告、统计报表等多种需求。Java作为一种广泛使用的编程语言,在处理这类...

    word文档专用

    - **freemarker-2.3.19.jar**:FreeMarker是一个强大的模板引擎,用于生成文本输出。 - **hibernate-jpa-2.0-api-1.0.1.Final.jar**:Hibernate JPA 2.0 API是Java Persistence API的一个实现。 - **hibernate3....

    easypoi-jfree:Java生成字带数据图表

    《使用Java生成带数据图表的Word文档——easypoi-jfree详解》 在现代办公环境中,生成带有数据图表的报告文档是一项常见的任务。在Java领域,easypoi-jfree是一个强大的工具,它允许开发者方便地在Word文档中插入...

    freemark学习文档

    #### 二、Freemarker命令符号详解 在Freemarker中,命令符号是模板语言的核心组成部分之一,它们用于执行各种操作,如条件判断、循环迭代等。下面是一些常用的命令符号及其解释: - **`is_collection`**:判断给定...

    world转pdf转swf

    1. **World转PDF**: World文档是WPS Office或早期的Microsoft Word使用的文件格式,通常包含文字、图像和排版。将World文档转换为PDF的主要目的是保持文档的原始格式不受浏览器或操作系统差异的影响,以及确保接收方...

    java商城网站

    提供的Word文档说明可能包含了项目结构、数据库设计、部署步骤等内容,这对于理解和运行项目至关重要。 **10. 部署与运行** 在本地运行此项目,需要安装Tomcat或Jetty等应用服务器,设置好环境变量,导入项目到IDE...

Global site tag (gtag.js) - Google Analytics