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. 


本文标签: 模板 生成 文档 数据