admin 管理员组文章数量: 1184232
2024年4月19日发(作者:rank函数并列排名后不占位)
第20卷第2期
●
电 脑 与 信 息 技 术
Vo1.20 No.2
Apr.2012
2 0 1 2年4月
Computer and Information Technology
文章编号:1005—1228(2012)02—0031--03
基于freemarker和XML技术的word生成方案
王庆喜,李
(安阳工学院,河南安阳
源
455000)
摘要:文章设计一种基于freemarker和XML技术的样式和内容相互分析的word动态生成方案。经测试证明,使用该方
案生成的word文档符合ofice标准,f样式、内容控制非常便利,打印也不会变形,改变了Java操作word十分困难的现状。
关键词:Word动态生成;t ̄eemarker;XML;JAVA
中图分类号:TP311.1 文献标识码:A
A word Generation Program Based on Freemarker and XML Technology
WANG Qing—xi,LI Yuan
(Anyang Institute of Technology,Anyang 455000,China)
Abstract:In this paper,a design based on ffeemarker and XML technology,is separated ̄Between style and conteng it is a
dynamically generated program of word.We tested that this desin of word ign accordance with standard of ofice,it’s f
very convenient that the control of style and conten ̄print will not be deformed,it’s not very dififcult tO the operating
ofword in java.
K叼words:dynamically generated word;freemarker;XML; A
Word是国人接触较早的办公软件,到目前为止,
大多数计算机用户早已熟悉和习惯了word的操作,
因此在程序中实现生成标准word文档的功能在很多
时候都是必不可少的,在有些地方还要求页面能够样
式不变的打印。在JAVA技术中,常见的方案有POI、
iText、JACOB、JSP几种方式【l】,POI读取Word文档比较
生成页面,通过模板显示准备的数据[2】。
FreeMarker具有如下特性:
(1)通用目标。能够生成各种文本:HTML、XML、
RTF、Java源代码等。
(2)强大的模板语言。所有常用的指令:include、条
件结构、循环结构在模板中创建和改变变量几乎在任
何地方都可以使用复杂表达式来指定值命名的宏。
(3)通用数据模型。FreeMarker不是直接反射到
Java对象,Java对象通过插件式对象封装,以变量方式
在模板中显示你可以使用抽象(接口)方式表示对象。
(4)强大的XML处理能力。能够递归遍历XML树
在模板中清楚和直觉的访问XML对象模型嘲。
本方案中主要用到两个标签:(1)插值:即¥(.一)或
样【...)格式的部分,将使用数据模型中的部分替代输出;
(2)list循环。例如:<#list[1I星期一”,”星期二”,”星
期三”,”星期四”,”星期五”,”星期六”,”星期天”】
as x>¥{x)</#list>。
1.2 XML
适合,对于生成文档样式比较难控制;iText操作Excel
还可以,对Word的操作功能有限;JACOB操作Word
实现复杂,并且无法将服务部署到Linux平台,要求安
装ofice,对于实现固定格式的报表实现困难;JSP直接
输出方式样式控制难,并且打印出的文档样式变形严
重。
1 技术说明
1.1 freemarker
FreeMarker是一个模板引擎,一个基于模板生成
文本输出的通用工具,使用纯Java编写FreeMarker被
设计用来生成HTML Web页面,特别是基于MVC模
式的应用程序。虽然FreeMarker具有一些编程的能力,
XML文档在当今的网络传输中使用越来越广泛。
但通常由Java程序准备要显示的数据,由FreeMarker
用XML文档交换信息给人们带来很多好处。首先,
收稿日期:2012-01一l1
作者简介:王庆喜(1979一),男,河南内黄人,讲师,硕士研究生,主要研究方向:计算机应用和形式化语言;李 ̄(1981-),男,河南驻马店人,讲师,硕
士研究生,主要研究方向:地理信息系统。
.
32・ 电 脑 与 信 息 技 术 2012年4月
XML文档简单且便于阅读,因为它使用的是人的语言 department}等。
而不是计算机语言;其次,XML与JAVA完全兼容.
且完全可以移植;再次,XML的可扩展性强嗍。
1.3 Word对XML的支持
Word从2003开始支持XML格式,因此本方案要
(3)代替集合数据的标签
在数据展示时,表格是及其常用的形式,比如一个
班级的学生成绩表,就需要用到表格。此时除表头外,
表格的行是根据实际需要输出动态生成的,因此需要
在模板中对行进行循环,这就需要在模板文件中加人
如下标签:
<#listls船 >
求开发者必须使用ofifce 2003或更高版本。w0rd中主
要XML标签如下:<w:body>表示正文内容;<w:p>表
示一个段落;<w:tbl>表示表格数据;<w:tblPr>、<w:
tblGrid>表示定义表格样式(可以先在word中定义好,
不用动态生成);<w: 表示表格行;<w:tc>表示单元
格;<w:br w:type=”page”,>表示分页符;<w:r>表示一个
样式串,指明它包括的文本的显示样式;(w:t>表示真
正的文本内容圈。
<w:f wsp:midR=”00B558DA”wsp:rsidTr=”00B558DA”>
<w:tc>
<w:tcPr>
<w:tcW WIW=”1704”w:type=”dxa”,>
</w:tePr>
(w:p wsp:rsidR=”00B558DA”wsp:rsidRDefault=”OOO9
2 word动态生成方案步骤
(1)使用Oficfe软件编辑好Word文档。主要编辑
文档的样式和文档中固定不变的文档内容。
(2)把编辑好的Word文档另存为XML格式的文
7B5E“
<w:pPr>
<w:rPr>
<w:rFonts w:hint=”fareast”,>
</w:rPr>
</w:pPr>
<w: >
件。通过点击文件I另存为,弹出另存为对话框,选择
保存类型为XML文档,点击保存。
(3)使用xml编辑器打开XML文件,在需要填充
数据的地方更换为freemarker标签。
(4)把XML文件的后缀名改为m,即将其修改为
FreeMarker模板文件o
<w:t>¥{a.userCode}</w:t>
</w:1r>
</ :p>
</w:tc>
</w:仕>
.
(5)用java代码来解析freeMarker模板文件并填
充数据。解析和填出数据采用freemarker提供的类来
处理。
</#list>
上述代码表示根据集合Is中的对象的个数,动态
(6)输出Wod文件。采用文件流的方式输出到指 r
定位置,可以使用绝对地址或相对地址,本文为简化问
题,采用绝对地址。
生成表格中的数据行,在行中的单元格动态的填充数
据。
3。2 java实现
(1)关键代码
Configumfion configuration=NewConigurfation():
eonfigumfion.setDefauhEneoding(”ud1.8“):
MapdataMap llewHashMap():
3方案实现
3.1 在XML文件中加入freemarker标签
(1)代替简单数据的标签
getData(dataMap);
coigfnuration.setClassForTemplateLoading(this.getClass(),"/test
插入一个简单的值,需要在freemarker模板文件
中使用插值网,例如,在学生的成绩报告单上需要学生
的院系、班级、学期等数据,就需要在模板文件中加入
如下标签:¥{department}、¥{className}和¥{semester}
等。
(2)代替对象数据的标签
动态数据比较多的时候,常常会封装成对象171,如
hemp”);
Templatet=conigurfation.getTemplate(”9fftl”):
File outFfle=new File(”D:/temp/outFfle.doe”);
FileOutputStream fos=Ilew FileOutputStream(outFile);
OutputStreamWriter oWriter=new Outpu',StreamWriter(1os,
”UTF-8”):
Writerout=newBufferedWriter(oWriter);
t.process(dataMap,out);
上所述关于学生的院系、班级、学期等,再加上学生学
号、姓名等,就可以封装成学生对象,这样就需要在模
板文件中插入如下标签:¥{student.stuNamel、¥fstudent.
out.ⅡuBh():
(2)代码说明
第20卷第2期 王庆喜等:基于f ̄eemarker和XML技术的word生成方案 ・33・
Configuration是freemarker提供的一个类,主要是
对编码和模板位置等进行配置;
Template是freemarker提供的—个模板类,负责生
成模板、处理模板等任务。如t.process(dataMap,out)就
是把dataMap中的数据填充(写入)到模板文件;
dataMap是一个自定义的HashMap,主要为模板文
word的类中的方法,就不能生成正确的文档,在打开
文档的时候会提示xml字符非法。
(2)原因:编码格式不正确,无法解析。
(3)解决办法:执行OutputStreamWriter Writer=
new OutputStreamWriter fos,"UTF-8”)语句,即使用
UTF_8编码。
件提供数据。因为篇幅的原因,代码中省略了有关数据
的内容,用getData(dataMap)表示把模板文件中需要的
数据放到了dataMap中。
5总结
本方案是在word中自定义页面样式和设计固定
内容,在java代码中把动态数据填充到模板文件,从而
动态生成用户需要的word文档,所以页面的样式容
易设计、便于控制;数据能够根据业务实际情况动态生
4常见问题及解决办法
4.1 word生成文件无法打开
(1)问题:生成的Word文档大小为O。
(2)原因:因为输出流out没有flush。
(3)解决办法:执行out.lfush()。
4.2 TemplateModelException异常
成,在程序中易于实现;另外还有效率高的特点,经测
试,生成100000行数据的表格大概4000毫秒左右,其
性能满足绝大多数用户的需要。
参考文献:
【1】刘永立,白地动.基于JAVA平台的网上成绩管理系统的设计与实
现叨.中国教育信息化,2010(1):48.52.
[2]FreeMarker.FreeMarker技术【DB/OL].http:/eemark-er.sourceforge.
net/nder.htm1.
(1)问题:出现如下异常:freemarker.template.Tem—
plateModelException:Don’t know how to present all object
of this type to a templateo
(2)原因:freemarker版本问题.
【3】Mava网.Freemarker中文教程[DB/OL].http'3/ajava.Org/booldother/
17103.htm1.
(3)解决办法:采用最新的freemarker版本,即
2-3.18版本。
4.3 web请求导出时导出后Word文档就会打不开
[4】丁跃潮,张涛.XML实用教程【M].北京:北京大学出版社,2006.
[5】但正刚,李顺.XML高级网络应用【 .北京:清华大学出版社,2000.
【6】刘永立.B/S结构教学管理系统的设计叨.电脑编程技巧与维护,
2009。18:121—123.
(1)问题:main()单独调用时,Word文档生成正
常,但是web请求导出的word文档却无法打开。如通
过form提交到某个servlet,然后此servlet中调用生成
【7】褚佳强.计算机辅助教学管理——本科毕业论文规范化排版叨.科
技资讯。2009.28:232.
(上接第23页)
参考文献:
to-Peer Media Stmamins[C].Prooeed.峥
2o02.
’
IEEE INternational Confer-
【3】Jin B.Kwon and Heon Y.Yeom.Distributed Multimedia Streaming over
Peer-to-Peer Networks[M].Euro-Par 2003 Parallel Processing,Austria:
Sp ̄Ser Berlin/Heidelberg,2004:851.
【1】Dongyan Xu.Mohamed Hefeeda,Susanne Hambrusch,eta1.On Peer-
ence on Distribute Computing System(ICDCS 2002).Wien。Austria,July
【4】刘永逸.P2P实时流媒体传输调度技术研究【D】.长沙:国防科技大
学,2005.
【2】董海韬.基于对等网络的流媒体传输系统技术[D】,北京:清华大学,
2005.
【5】杨薇薇,黄年松.一种P2P流媒体数据传输任务分派算法叨.华中科
技大学学报(自然科学版),2005,33(5):26-28.
版权声明:本文标题:基于freemarker和XML技术的word生成方案 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1713478008a636651.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论