软件研发与应用SOFTWARE DEVELOPMENT&APPLICATION
编程语言读取Word中表格单元格属性值的方法
林颖
(福建省邮电学校计算机专业教学部,福州350008)
摘要:在开发“Word自动阅卷系统”时,发现Word未提供表格单元格合并属性,当单元格合并后,程序无法通过行列号寻址正确读取各单元格属性值,并且系统还显示错误提示,目前可查阅的相关开发文献中都没有到解决方案。介绍了Word文档中表格各单元格的万能寻址方式,并给出了基于VB 的获取Word“单元格合并”信息的程序代码。
关键词:Word自动阅卷;VB语言;Word表格单元格寻址;Word表格单元格合并
1概述
随着智慧教学理念的深入发展,应用“Word操作题自动阅卷系统”提高《信息技术》课堂教学效率,已经成为课堂教学的迫切需求。自动测试改卷系统可以让学生随时随地进行自我测试、自我评价,大大改变以往的计算机基础学习方式[1]。
Visual Basic是由Microsoft公司开发的结构化的、模块化的、面向对象的、包含协助开发环境的事件驱动 为机制的可视化程序设计语言。Word软件是Microsoft 公司的Office产品的一个组成,因此只要在VB的编程环境中引用“Microsoft Word14.0object library”库就可以方便地读取到考生Word文件中各对象模型,并读取相应属性值与正确值进行比较,从而实现Word自动阅卷的过程,这也是目前开发Word操作题自动评卷系统的主流方法。
开发野Word操作题自动阅卷系统”时用paragraph 对象模型读取有关字体段落的属性值;用pagesetup对象模型读取页眉页脚的属性值;用shape对象模型读取各图形对象的属性值;用table对象模型读取表格属性值等。然而,Word对象模型中单元格cell对象并未开放单元格合并属性;同时只要有单元格合并发生,不但无法正确读取所有单元格的属性值,系统还显示出错误提示。查阅了很多的相关开发文献,都没有到解决的办法。在反复查阅Microsoft Word开发文档和不断测试后,终于到了Word文档中表格单元格独特的寻址方式,并试验后解决了“读取单元格合并信息”的难点,并用VB实现了对Word合并单元格信息的读取。
2 Word表格单元格寻址方式
2.1行列号寻址
在VB读取表格各单元格属性值时,通过Cell(行号,列号)来获取各单元格的属性值。例如:Cell(行
号,列号).获取单元格的值,Cell(行号,列号).range.font获取单元格的各种字体属性等。这是通过行号和列号寻址单元格,Word中行号和列号都是从1开始,例如cell(2,3).读取的是第2行第3列单元格值。各单元格行号和列号如图1所示,其中RI:单元格行号;CI单元格列号。
图1Word表格中单元格的行号和列号图示
Rl=1Cl=1RI=1CI=2RI=1CI=3RI=1CI=4RI=1CI=5
Rl=2CI=1RI=2CI=2RI=2CI=3RI=2CI=4RI=2CI=5
RI=3CI=1RI=3CI=2RI=3CI=3RI=3CI=4RI=3CI=5
RI=4CI=1RI=4CI=2RI=4CI=3RI=4CI=4RI=4CI=5
2.2指针寻址
但是,当表格中单元格合并操作后,如图2所示,此时.cell(2,3)则无法正确寻址到第2行第3列的单
图2单元格列合并
图3系统错误提示
作者简介:林颖(1973-),女,高级讲师,硕士,研究方向:计算机编程、计算机教学
。
实用第—智慧密集回回回回旦旦回B Hl®
更改行列号进行测试后,发现只有cell(2,3)和cell(3,3)无法通过行列号寻址。这说明合并单元格中只有第1个单元格可以正常以行列号寻址,其余单元格则不能通过行列号寻址。由于无法知道考生操作情况,因此在编程读取考生文件中的表格时,也不清楚哪些单元格是被合并的遥在不知道哪些单元格被合并的情况下,如何把整个表格中各单元格的信息正确读取出来呢?
此时需要一个与单元格行号和列号无关的寻址方式。反复查阅了Microsoft Word开发文档,发现cell对象有一个next[2]属性,该属性的定义是:下一个单元格。于是编写了如下程序段,不论表格中是否有单元格合并,都能正确获取各单元格的信息。
Set mycell=myword.table(1).ietm(1).cell(1,1)
'不论单元格如何合并袁第一个单元格总是存在的。
While(not mycell is nothing)
<=&
Loop
因此,不论表格中有没有单元格合并,通过cell. next的实现的指针寻址可以遍历表格中所有的单元格。3获取单元格合并信息
3.1列单元格合并
在Word的table对象模型中,[3]只能实现合并操作,无法读取单元格合并属性值遥那如何读取Word表格中单元格的合并信息呢。
逐个阅读Microsoft Word开发指南中cell的属性,初步到了解决方案:通过依次访问所有单元格,然后通过windex[4]和lumnindex[5]这两个属性得知每一个被访问到的单元格的行号和列号;用一个二维数组与该表格一一一对应,把windex和cell. columnindex相对应的二维数组元素记上标识“1"。由于那些合并的单元格,只有第一个单元格会被访问到,其余单元格都会被自动跳
过,因此对应的二维数组元素不为1。于是单元格合并情况就被二维数组自动记录下来了,算法程序如下所示:
For rowi=1To myword.Tables(1).Rows.Count
For columnj=1To myword.Tables(1).Columns.Count tablesize(rowi,columnj)=""'二维数组初始化Next
Next
Set mycell=myword.Tables(1).Cell(1,1)
'从表格第一个单元格开始Do While(Not(mycell Is Nothing))
mycell.Select
vb语言代码大全网页tablesize(mycell.RowIndex,mycell.ColumnIndex)=野1冶
Set mycell=mycell.Next'处理下一个单元格
Loop
此时,tablesize数组中记录了各单元格合并情况,通过以下程序段就可以把合并的单元格的行列号记录在tmpstr数组中。
tmpstr=""
For rowi=1To myword.Tables(1).Rows.Count
For columnj=1To myword.Tables(1).Columns.Count If tablesize(rowi,columnj)=""Then
tmpstr=tmpstr&"(野&str(rowi)&",”&str(columnj)&")"
End If
Next
运行上面这段程序后,tmpstr的值为:(2,3)(3,3),表示第2行第3列、第3行第3列被合并了。
3.2行单元格合并
但是当遇到行单元格发生合并情况时,如图4所示,测试上面的程序段后,tmpstr的值却是:(2,5)(3,5),表示2行第5列与第3行第5列被合并。显然程序运行结果是错误的。该错误说明lumnindex并不是
指单元格的列号,通过反复翻阅资料和不断改变单元格的 合并方式,运行程序段进行测试,发现columnindex是单元格在本行的数据序号遥如果本行前面有单元格合并,那columnindex就不是单元格的列号,如图5所示。
图4行单元格合并
Columnindex=2Columnindex=2Columnindex=3Columnindex=4Columnindex=5 Columnindex=1Columnindex=2Columnindex=3Columnindex=5 Columnindex=1Columnindex=2Columnindex=3Columnindex=5 Columnindex=1Columnindex=2Columnindex=3Columnindex=4Columnindex=5
图5行单元格合并后columnindex值因此仅仅依靠lumnindex这个属性值只能确定某行合并后有几个单元格,而不能确定该行哪几个单元格被合并了。然后通过测试程序,确证了行单元格合并后,cell.width是合并后的列宽值;但不论如何合并, (下转第52页
)
本运行结束时,QTP 会自动显示测试结果,如图8所示。
Iterations
Steps
Current Run "Passed
0 Failed 0 Failed 0 Warnin g s 0 Warnings 20 Passed
20 Passed
图8测试结果示意图
从运行结果的图形化界面中可以看出20次迭代和
运行步骤的状态均为“通过”,表示所有检查点都已经通
过测试。要查看其中一个迭代的运行情况,可以在QTP
左侧树形结构中选择某一个iteration ,右侧窗口会显示它
的详细信息,如图9所示,其结果也显示为“通过”。
图9单个迭代的详细信息
5结语
基于QTP 的电话拨测系统测试方法实现了拨测数
据的添加功能,实例中通过QTP 工具自动添加了 20条
号码场景的数据,少量数据的添加对于手工测试和自动
化测试的区别不是很明显,但是数据量达到成百上千条
时,自动化测试工具的优势便会显现出来。QTP 执行繁 琐的回归测试可以节约测试成本,提高测试效率。另
外,QTP 脚本能反复使用,缩短了测试周期,也提高了
软件版本的质量。
参考文献
[1] 余杰,赵旭斌•精通QTP 自动化测试技术领航
[M].北京:人民邮电出版社,2012.
[2] 夏晶.基于QTP 的功能自动化测试框架的研究与应
用[J].武汉科技大学,2010, 29 (3) : 20-21.[3] 陈能技.QTP 自动化测试进阶[M].北京:电子工
业出版社,2010.
[4] 黄彪贤,熊建斌,李振坤.金融软件功能自动化测
试的分析及应用[J] •计算机工程与设计,2012,
33 ⑵:787-792.
坐 _理 坐 _业 4 -理 9 4 ,2 卩 -3 化 9 -亠 $0 -亠 艸 垃 业 亚 3 一业一亠 9 _理 3 一业 坐 _业 9 一理 卩 -3 -亠 9
9 业-亠 W 垃 肚 £0 -业
(上接第32页)
cell.height 都只是单元格合并前的行高值。
根据以上的分析,只有把各单元格的列宽和行列号
都记录下来,才能完整地记录Word 表格中单元格的合 并信息。代码如下:
Set myeell = myword.Tables(1).Cell(1, 1)Do While (Not (myeell Is Nothing))
myeell.Seleet
tablesize(myeell.RowIndex, myeell.ColumnIndex)
=myeell.Range.Text
tmpstr = tmpstr & "(野 & str(mycell.RowIndex) & ",” & str (myeell.ColumnIndex )& 野"& str(myeell. Width) & “)”
Set myeell = myeell.Next
Text_info.Text = Text_info.Text & tmpstr & vbCrLf
(上接第42页)
和m 分别为相应字符串的长度。在未来的研究中,可以
采用其他优化算法来降低算法的时间复杂度,如KMP 等。
参考文献
[1]王曙燕,王春梅.数据结构与算法[M].北京:人
民邮电出版社,2013: 73-96.
tmpst r =""Loop
4结语
单元格指针寻址方式和单元格合并信息获取程序段
应用到Word 自动阅卷系统中,经过一学期运行测试,
评卷结果没有出现错判和误判。
参考文献
[1] 潘夏福.基于网络的Office 自动阅卷系统设计与实
现电脑编程技巧与维护,2013, (06) : 118.
[2] Microsoft.Cell. Next 属性(Word) I Microsoft Docs.[3] Microsoft. Cell 方法(Word) I Microsoft Docs.
[4] Microsoft.单兀格 RowIndex 属性(Word) I Microsoft
Docs.
[5] Microsoft.ColumnIndex 属性(Word) I Microsoft Docs.[2] 王曙燕,王春梅.C 语言程序设计教程[M].北京:
人民邮电出版社,2014: 13-34.
[3] 张德慧,周元哲.C++面向对象程序设计[M].北
京:科学出版社,2005: 16.
[4] 赵继民.利用图解法解碱基计算题[J].生物学教
学, 2009, 34 (8) :
47-49.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论