使用Jacob生成Word实现文档自动化的方法研究
总第19卷219期2017年11月
大众科技
Popular Science & Technology
Vol.19 No.11
November 2017
使用Jacob生成Word实现文档自动化的方法研究
肖洋1邓钦元2
( 1.91404部队,河北秦皇岛066000; 2.潼南人民医院,重庆400000)
【摘要】基于软件测评项目管理文档自动化的需求,如何通过Jacob控制Word操作。首先对比了目前Java环境下常用 的几种文档自动化方案,其次对Jacob和Word的相关技术原理进行了研究和论述,最后通过项目实例的代码比对,阐述了如何 将V B A代码转换为Jacob执行代码,形成的方法可以推广到其它MSOffice产品的自动化操作。
【关键词】Jacob;JNI;Word操作;CO M组件;V B A;文档自动化
【中图分类号】TP311 【文献标识码】A【文章编号】1008-1151(2017)11-0019-03
The method of using Jacob to generate Word to implement document automation
Abstract:With the background of the requirement of the document automatic system for software testing,the article demonstrates how to operate Word through Jacob.First,several schemes which frequently usesd for document automatic in Java environment are compared.Second,the principle of Jacob and Word are analyzed and discoursed.Last,through the comparison of the projects codes,the article demonstrates how to translate VBA codes to Jacob codes,the method can be applied to other MSOffice products.
Key words: Jacob;JNI;Word operation;COM;VBA;document automatic
在软件测试项目的工程管理中,会产生大量的日志、周报、任务表、周例会纪要、跟踪报告、评审文件等管理文档,全部由手工编辑,极易发生时间、工作量、数值计算等文档 性错误,本文的研宄目的是开发一款文档自动化生成软件,按照一定格式生成管理文档,尽量避免人工编制文档过程中 由于遗漏或疏忽而造成的错误。软件采用B/S框架模式,服 务端代码采用Java Servlet开发,W eb页面采用HTML5和 Jquery开发,软件的设计结构如图1所示。
用户在Web页面进行参数输入后,向服务端的Servlet发 起请求,Servlet调用数据处理程序将输入参数处理为可用数 据,然后将数据发送至各个文档生成子程序,由子程序调用 Jacob实现对Word的操作,达到自动化生成文档的目的,最 后将各类文档压缩后回传给W eb端的用户。其中,软件开发 的难点与核心技术是通过Jacob操作Word,以下内容即对该 技术的使用方法研宄。
图1软件设计结构图1相关技术现状
通过Java操作Word有多种技术方法,常用技术有Jacob、Apache POI、XML、Java2Word、iText、JSP等,各有优缺点,以下仅对主流的几种方法进行对比,如表1所示:
表1技术方法优缺点对比
技术方法优点缺点
J a c o b支持M S O f f i c e全部操作代码繁琐,不易理解
A p a c h e P O I使用简单不能支持复杂格式
X M L代码量少,样式、内容易控制模板设计复杂,标记繁琐
J a v a2W o r d功能强大,使用简单不支持07版本后的W o r d
软件开发方案选择通过Jacob来控制Word,主要考虑在 文档生成中,有大量的表格、Excel图形需要根据用户输入来 动态生成,模板无法完全定制,而且考虑到今后的功能扩展,因此,选择技术复杂但是功能全面的Jacob来实现文档生成。2关键技术原理
通过Jacob控制Word,首先需要了解Word和Jacob的相关背景以及操作原理。
Word属于MSOffice下的一个应用,MSOffice是微软基 于Windows平台的办公软件合集,还包括PPT、Excel、Access 等,可以采用V B A开发的宏进行自动化操作,而其它常用开 发语言如C++、Java与MSOffice都不存在通信接口,因此无
【收稿日期】2017-10-12
【作者简介】肖洋( 1982—),91404部队工程师,从事软件测试与开发工作;邓钦元( 1982—),女,重庆人,潼南人 民医院工程师。
法对Word这类软件进行直接的操作,微软为了解决这类问题,推出了 C O M组件技术,类似于通用的外部接口标准,通过 C O M组件可以实现各类应用的互连互通。M SO ffice中的 ActiveX对象即采用CO M标准开发的组件,其它开发语言可 以通过ActiveX来调用VBA,实现对MSOffice的控制。
Jacob是一个开源的第三方中间件,全称Java COM Bridge,即Java与C O M组件的桥梁,其技术本质是通过晚期绑定方 式(类似Java反射)来调用C O M组件,通过JNI技术实现 的Variant,Dispatch等接口,能让Java代码调用Windows平台 下的CO M组件或者Win32系统库,包括MSOffice的ActiveX 对象。
Jacob操作Word的第一步,是如何实现与C O M的连接,首先需要初始化CO M进程,并创建一个Word的ActiveX对 象,如以下代码所示:
Private ActiveXComponent word=null;
ComThread.InitSTA();
word=new ActiveXComponent("Word.Application");
这里需要了解W ord常用的对象模型:应用程序对象 Application、文档对象 Document、Selection 对象、Range 对 象、Bookmark对象等。
其中,应用程序对象Application表示Word应用程序,是
所有其它对象的父级,可通过其属性和方法来控制Word环境,如以下代码所示:
//word界面显隐true显示false隐藏
word.setProperty("Visible",new Variant(true));
//禁用宏
word.setProperty("AutomationSecurity",new Variant(3));
文档对象Document表示一个文档及其所有内容;Selection对象表示当前所选的区域,所有的文档集合中只会 有一个Selection对象,如果文档中没有选中任何内容,Selection对象表示插入光标;Range对象表示文档中的相邻区 域,通常是Selection的选中区域,但不可见;Bookmark对象 通常用作书签来标记文档位置。
Jacob主要包含了 ActiveXComponent类和 JacobObject类,其中 JacobObject包含两个子类 Dispatch和 Variant。Dispatch 是一种支持链式操作的调用处理对象,代表C O M自动化组件 中的对象,提供了访问CO M对象的API。常用的方法函数有 call、invoke、get、put,详细应用如表2所示:
表2 D ispatch常用方法
方法方法说明
c a l l()调用C O M对象,返回V a r i a n t类
i n v o k e()调用C O M对象的方法,不返回值
g e t()获取C O M对象,返回V a r i a n t类
p u t()设置C O M对象属性
函数返回的Variant类映射COM对象中的Variant数据结 构,提供Java和C O M的数据交互,是一种用于封装参数的 数据类型,可再次封装为Dispatch对象,从而实现链式操作。
ActiveXComponent类实际继承自Dispatch类,在内部封 装了 Dispatch对象,使用该类加载CO M组件,并且提供了访 问C O M组件对象的属性和方法的接口。ActiveXComponent 类提供了比Dispatch类更方便的获取属性和设置属性的方法:getProperty(),setProperty()。
通过Dispatch,Jacob实现了与W ord的连接,如以下代码所示:
/
/ 所有 word文档集合
documents= Property("Documents").toDispatch();
//新增word文档
doc= Dispatch.call(documents,"Add").toDispatch();
到目前为止,通过Jacob己经实现新增一个Word文档的 功能,初步达到控制Word的功能,以下内容将详细阐述如何 实现Word的复杂控制。
3使用方法详细研究
Jacob操作W ord的实质是:Jacob通过JN I接口来调用 W ord的ActiveX组件,通过该组件调用V B A代码,从而实 现Word文档的自动化生成,过程如图2所示:
图2 Jacob调用过程
以在文档中查询一段特定格式的文字并进行替换的Word 操作为例,比如查一段红、加粗的文字text1,替换为普 通格式的文字text2,通过W ord的宏将该操作进行录制,获 得V B A代码如下:
With Selection.Find.Font
.Bold= True
.Color= wdColorRed
End With
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text= "text1"
.Replacement.Text= "text2"
.Forward= True
.Wrap= wdFindContinue
.Format= True
.
MatchCase= False
.MatchWholeWord= False
.MatchByte= True
End With
Selection.Find.Execute
分析该段代码,通过V B A文档可知,Selection是对象,Find是对象,Font也是对象,第一段代码(With对)主要描 述从Selection对象中到Find对象即被查的对象,设置该 对象的字体属性:粗体属性Bold = True,颜属性Color = wdColorRed。第二段代码表示设置Replacement对象即替换内 容的格式属性为ClearFormatting,代表“取消在查或替换操 作中所指定文本的文本格式和段落格式。”即普通格式。第三
段代码详细设定了查内容和替换内容,以及查动作的具 体行为:Forward表示是否向前搜索;W rap表示是否从头开 始;Format表示格式是否有效;MatchCase表示是否区分大 小写等,关于Find对象的参数有20余个,详细说明可参见 V B A文档。
现在将V B A代码转换为Jacob可用代码:
首先需要从Word中获取Selection对象,可以理解为获取 Word操作光标:
Dispatch (word,"Selection").toDispatch();
通过Selection对象获取Find对象:
Dispatch find= word.call(selection, "Find").toDispatch();
设置Find对象的各类属性:
//设置要查的内容
Dispatch.put(find, "Text",toFindText);
//向前查
Dispatch.put(find, "Forward", "True");
//全字匹配
Dispatch.put(find, "MatchWholeWord", "True");
//查并选中
Dispatch.call(find,"Execute").getBoolean();
//插入要替换的内容
Dispatch.put(selection,"Text",newText);
至此,已经实现了通过Jacob查、替换Word文档中文 本的操作,通过V B A文档,可以发现其实完成这类操作不止 一种方法,比如直接调用F in d对象的Execute函数:Dispatch.call(find,"Execute",new Variant(toFindText),new Variant〇,new Variant〇,new Variant〇,new Variant(),new Variant〇, new Variant(),new Variant(),new Variant(),new Variant(newText), new Variant(2),new Variant(),new Variant(),new Variant(),new Variant〇).getBoolean〇;
将所需参数按顺序填入,后经对比验证,这种方法跳过 了查的操作直接替换,效率更高,所以通过宏录制V B A代 码的方式虽然简单但不一定高效。
研究的难点是在根据参数动态生成表格并填写内容,比如日志的生成,日志一般按周填写,内容受到项目的实际周 期、工作量、人员、分工、角等各种因素交叉影响,比如 一个任务可能跨度好几周,其中某周又有新任务的并行实施,某些任务只能由项目负责人完成等等情况,如图3所示,同一个日志模板,需要覆盖测试过程的五个阶段21个任务,任 务的执行周期与实际要求一致,可能有的任务需要好几周,有的只需要一天,一个阶段结束后可能数周内都不会有开始 新的测试阶段,因此中间的日志就没有填写的必要,实际上 每个测试项目的日志都不可能一样,因此,简单的文本替换 就不太适用这种复杂情况,需要新的解决方法。
睐踪日志―
项目名铷PRJ_NAME織测试r
填表P PRJ_TEAM|ip周起止日酚W e e k S t a r l^W e e k E n d*3
任务名称-—
星期,星期二<-星期三<-星麵 <;星期&星期六<-星期少
i m i胳i m i胳i m i胳工作量停工作喇胳i m i进度-工作量辦
图3日志需求示例图
首先需要解决如何根据个人分工来填写任务内容,将模 板内容复制进新建文档后,填写任务一般采用查书签的方 式来填写内容,填写表格,而且是行数不固定的表格,因此 采用先查表格对象的方式:
Dispatch tables= (doc,"Tables").toDispatch();
再查表格末行:
Dispatch cell = Dispatch.call(table, "Cell",new Variant(1), new Variant⑴).toDispatch();
Dispatch.call(cell,"Select");
在最后末行后添加新行:
Dispatch.call(rows,"Add",new Variant(row));
最后在末行通过移动表格C ell距离的方式进行内容填写: Dispatch.call(selection, "MoveRight",new Variant(12));
这里经常出现的问题是Java代码的运行速度常常超过 Jacob控制Word的光标移动速度,因此在移动填写表格时,需要加一点延时。
综上所述,在项目实践中,通过Jacob控制Word有以下几个要点:(1)配置环境,进行Jacob与Word的连接;(2)创建 或打开文档后,获取文档Document的句柄;(3)通过宏录制文 档操作或查看文档,记录V B A操作函数;(4)按照Jacob方法 将V B A函数进行转换;(5)复杂操作一般采用宏录制的方法进 行记录;(6)简单、重复的操作一般采用直接调取V B A函数。4结语
文档自动化的应用领域比较特殊、专业,比如很多知名 杂志的投稿格式就使得很多人望而却步,如果引入文档自动 生成格式的解决方案,将很大提高稿件的编辑工作效率,现 实中,使用Jacob作为技术方案的项目相对较少,主要原因是 在于转换V B A代码为Jacob代码的难度较大,有较高开发成 本,但是Jacob可以借助Java以B/S的方式部署,方便使用,可以达到在任何地点都能调用文档生成的目的。
(下转第39页)
u/-C''>=yl'E ui2
—^u2r e l(CB)+ u2r e l(1)+ U2r e l(2) + U2(3) + U2r e l(4) + U2(5)
0.0052 + 0.0032 2 + 0.0044 2 + 0.0145 2 + 0.0046 2 + 0.0084 2 = 1.89%
(2)合成标准不确定度word参考文献自动生成
u= C•uc(c')=1.14mg/L x1.8900 =0.022mg/L
4.1扩展不确定度
根据测量不确定度评估指南,为了测量结果间可以相互 比,按惯例在确定扩展不确定度时,在置信概率P= 95 %,
取包含因子& = 2,因此对该水中氨氮检测能力验证项目的
相对扩展不确定度为:
U r、C 0、=k • u c=
2 x 0.022 mg /L = 0.044 mg /L(k = 2)
由实验数据的平均值计算得该水中氨氮的最佳估计值为
C0-1.14mg/L,故其扩展不确定度为:
urel(C) —C ±U r(C0) — 1.14 ± 0.04mg/L
4.2该水中氨氮含量的检测结果报告
P( #) = 1.14 ± 0.04 mg/L,k = 2
(上接第21页)
文章从技术现状、关键原理研宄以及方法的详细解释,通
过项目代码逐步展示其优点:一是效率高,生成文档速度快;
二是可以解决各类复杂报表的生成问题,Jacob可以转换绝大
多数Word操作,深入浅出,降低了 Jacob类项目的编码难度。
简单、实用是开发人员永远的追求目标,Jacob开源项目
实现了一种简单、灵活的Ja va与CO M通信方式,随着文档
自动化需求的增多,Jacob这类技术也将不断进步、日趋成熟,
逐步被推广应用。
【参考文献】
[1]crown_0726.基于 freeMaker和 Jacob的word导出[J/OL].
m.blog.csdn/crown_0726/article/details/44726663
,2015(3):3.
[2]邵长鲁,葛洪伟,杨金龙.基于Jacob与POI操作复杂报表的
动态模板法[J].计算机应用与软件,2014(3):329.
[3]肖寒.基于jaco b开源技术下的推荐书快速录入方案研究
[J].数字技术与应用,2013(12):85.
[4]lzhui1987.C# 中操作 Word-Word 对象模型介绍[J/OL].
m.blog.csdn/hyman_c/article/details/53097741,20
16(11):2.
[5]车晓波,闫旭琴,刘晓建.基于Jacob的Word文档操作技术
[J].科技创新导报,2013(4):29-30.
文章同时测定了国家水质氨氮的质控样(BW0598)标准
值及扩展不确定度为:9.92 ± 0.50 p g/m L,k—2。与本实
验室测定结果为:10.300g/m L,相符合。
通过水中氨氮含量检测结果不确定度分析和评定看出,
其扩展不确定度与相应标准物质相当,主要的不确定度来源
于试样溶液含量重复性测量误差,其次是仪器,拟合标准曲 线,试样溶液定容体积。为了尽量减少重复性测量的不确定 度,在实验工作中,可以采用提高准确移取溶液的准确度等
级的移液管来移取试样溶液以减小重复性测量不确定度,和
通过熟练操作可降低测定氨氮标准系列溶液配制以及试样溶
液定容体积的不确定度值。
【参考文献】
[1]中国合格评定国家认可委员会.CNAS-CL10:2006.检测和
校准实验室能力认可准则在化学检测领域的应用说明
[Z].北京:中国合格评定国家认可委员会,2012.
[2]HJ535-2009.水质氨氮的测定,纳氏试剂分光光度法[S].
北京:中国环境科学出版社,2010.
[3]JJF1059.1-2012.测量不确定度评定与表示[S].北京:中国
质检出版社,2013.
[4]JJ196-2006.中华人民共和国国家计量检定规程《常用玻
璃量器》[S].北京沖国计量出版社,2007.
[5]中国合格评定国家认可委员会.CNAS-CL06:化学分析中
不确定度的评估指南[M].北京沖国计量出版社,2006.
5结论
[6]张家付,徐汀荣.结合JACOB的JCA资源适配器设计与实
现[J].计算机应用与软件,2009(5):85.
[7]熊瑜容,柴毅,王淑娟.基于VC++的WORD文档自动生成
技术[J].计算机时代,2010(1):52-54.
[8]桑银邦,王成良.X M L数据交换在Office二次开发中的应
用[J].计算机工程,2010,36(22):78.
[9]陶元芳,张长利,苗苗.实现文档自动化的几种方法[J].机械
工程与自动化,2009(6):193-195.
[10]姜照林.用V C实现W ord文档自动化[J].嘉兴学院学报,
2007(3):68-71.
[11] 陶元芳,卫良保.VC++命令文件式参数绘图类库[J].太原
重型机械学院学报,2003(4):284-289.
[12] 李春燕,俞集辉,刘林.O L E自动化技术在文档信息管理中
的应用[J].计算机应用,2001(7):81-82.
[13] 李向前,黄莺.浅谈文档一体化与办公自动化[J].河北职业
技术学院学报,2006(2):95-96.
[14] 李瑞,李永刚.JAVA中基于JACOB的COM组件调用研究
[J].微计算机信息,2007(15):168-170.
[15] 王春明,朱晓辉,陆天捷.基于JACO B的Word文档自动生
成技术研究[J].南通职业大学学报,2012,26(1):77-80.
[16] 梁志里.基于Jacob的文档安全管理的实现[J].计算机技术
与发展,2011,21(2):185-188,197.
[17] 金保华,李金旭,赵丽辉,等.基于J A C O B的Java通用
WordWriter组件设计[J].郑州轻工业学院学报(自然科学
版),2011,26(3):100-103.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。