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); } }
客户要求用程序生成标准的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); } }
发表评论
-
MyBatis的动态SQL详解
2012-08-19 20:44 767MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我 ... -
spring-动态装配bean
2012-03-19 20:04 1026http://uu011.iteye.com/admin/bl ... -
XSocket的学习和总结(一)
2012-03-14 14:20 860http://blog.csdn.net/lizhi20040 ... -
xsocket基础学习一
2012-03-14 09:55 11741、这个开源的框架只需要有一个J2SE5.0就行了不需要其他的 ... -
io与nio的区别
2012-03-14 09:52 943io:提供读写操作 nio提供读写操作,基本单位为byteB ... -
java生成word,html文件并将内容保存至数据库
2012-03-03 11:32 1022在最近的一个项目中需要将一段字符类型的文本存为word,htm ... -
Jacob解决Word文档的读写问题
2012-03-03 11:19 1143转于:北极之光的博客 标签:jacob word com 表格 ... -
Jacob解析word
2012-03-03 11:17 886由于项目需要,取得word的内容,因研究了下Jacob,尽管P ... -
Java服务器端List对象转换为JSON对象并返回客户端实例
2011-04-26 01:53 887http://apps.hi.baidu.com/share/ ... -
如何将tomcat启动注册为系统服务
2011-04-06 04:02 955曾经做过J2EE开发的朋友,一定对Tomcat这个东西最熟 ... -
添加tomcat 服务删除
2011-04-06 03:15 1367tomcat服务删除 关键字: tomcat服务删除 命令行 ... -
如何用Java操作Word, Excel, PDF文档
2011-04-05 03:27 862http://java.ccidnet.com/art/353 ... -
javascript 关闭
2011-03-31 10:32 0http://www.abab123.com/bbs/down ... -
定数显示通知
2011-03-30 11:56 0window.setInterval('shows()',10 ... -
两个LIST比对筛选返回LIST比对结果(转)
2011-03-28 11:09 1334两个LIST比对筛选返回LIST比对结果 不知道大家有没有碰到 ... -
map 转换Set遍历
2011-03-28 10:25 1010Map map=new HashMap(); map.put( ... -
java实现mysql 数据库备份
2011-03-21 16:55 1165//db数据库 //ip 备份数据库地址 //user用户名 ...
相关推荐
5. **生成Word文档**:运行Java程序,Freemarker引擎将数据解析并填充到模板中,最终输出符合原始设计要求的Word文档。 ### 3. 实际案例分析 假设我们需要生成一份报告,该报告包含多个章节,每个章节又有各自的...
在Java代码中,你需要加载XML模板,创建数据模型(通常是一个Map或自定义对象集合),然后使用FreeMarker的`Template`类将数据模型合并到模板中,最终生成Word文档。这个过程通常涉及以下步骤: - 加载XML模板文件...
### Java生成Word文档:利用Freemarker框架 #### 一、引言 在现代企业级应用开发中,经常需要将数据库中的数据导出为Word文档,以满足业务报告、统计报表等多种需求。Java作为一种广泛使用的编程语言,在处理这类...
- **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....
《使用Java生成带数据图表的Word文档——easypoi-jfree详解》 在现代办公环境中,生成带有数据图表的报告文档是一项常见的任务。在Java领域,easypoi-jfree是一个强大的工具,它允许开发者方便地在Word文档中插入...
#### 二、Freemarker命令符号详解 在Freemarker中,命令符号是模板语言的核心组成部分之一,它们用于执行各种操作,如条件判断、循环迭代等。下面是一些常用的命令符号及其解释: - **`is_collection`**:判断给定...
1. **World转PDF**: World文档是WPS Office或早期的Microsoft Word使用的文件格式,通常包含文字、图像和排版。将World文档转换为PDF的主要目的是保持文档的原始格式不受浏览器或操作系统差异的影响,以及确保接收方...
提供的Word文档说明可能包含了项目结构、数据库设计、部署步骤等内容,这对于理解和运行项目至关重要。 **10. 部署与运行** 在本地运行此项目,需要安装Tomcat或Jetty等应用服务器,设置好环境变量,导入项目到IDE...