基于COM组件的Word试卷生成技术的研究

2015-11-17 11:56周文君刘柱鸿
电脑知识与技术 2015年24期

周文君 刘柱鸿

摘要:该文分析了COM组件技术,并对Word对象中的重要接口进行了说明,采用COM组件技术,将数据库中的试卷输出到Word软件中,生成Word试卷,并对试卷中各个组成部分进行自动格式化处理,可供直接打印输出,提高了工作效率。

关键词:COM组件技术;Word格式试卷;试卷输出;Office编程

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)24-0062-02

在智能题库系统的设计中,当系统按照组卷约束成功组卷之后,每一份试卷的相关信息都保存在数据库中,根据需要读取数据库中的信息进行试卷输出。常见的考试形式有在线考试和线下考试两种,针对线上考试,试卷通常输出为HTML文档;针对线下考试,试卷通常输出为Word文档。在高级语言中实现对Word文档的控制需要导入COM组件,通过COM组件中提供的各种对象的属性和方法来实现对Word文档的操控。本文基于Visual Studio2010平台,采用C#编程语言,引入COM组件实现对Word 2010文档的控制,自动生成格式规范的Word试卷。

1 COM组件技术

组件技术的出现是为了实现组合软件。组件实际上是一些小功能专一的可执行程序,它们可以为操作系统、应用程序提供服务。利用已有的组件,用户可以高效地创建一个应用程序,当应用需要升级或是重新定制时,只需要将其中的某一些组件用新的替换掉就可以,而不需要全盘重来,这样大大地提高了软件生产力。

COM(组件对象模型,Component Object Model)是微软公司推出的产品,在进行COM组件开发时,微软对其的定位是“基于对象的程序设计模型”,其主要目的在于促进软件的互操作性。COM组件的特性是与平台无关、与语言无关,可以在任意一种平台下,使用各种不同的高级语言去调用COM组件。无论是采用哪一种开发平台,也无论采用何种程序设计风格,进行组件开发都需要遵循相关的标准,只有按照统一的标准进行开发,软件中所涉及的各种类型的组件之间才能实现互相访问和协同工作。

2 Word对象模型解析

在项目中添加好相应的COM组件后,就可以使用组件中提供的接口来实现Word编程[3]。Word编程中所有相关的类和对象都在Microsoft.Office.Interop.Word命名空间中进行定义。下面介绍Word对象模型中的5大对象。

1)Application对象,表示Word应用程序,是所有其他对象的父级。Word应用程序中所有打开的Word文档都在该对象的Documents集合中;访问ActiveDocument属性可以获取焦点所在的活动Document对象。

2)Document对象,表示一个Word文档文件,可以使用Application.Documents的Add方法(或Open方法)来创建(或打开)一个新的Document对象,当新建或打开一个Word文档时,就是创建了一个Document对象,该对象自动添加到Documents集合中,使用该对象的Save方法(或是SaveAs方法)可以保存(或是另存为)文档。

3)Selection对象:代表Word文档中的选定区域,可以是一块连续的选区,也可以是非连续的选区,如何没有选择任何区域,则表示光标所在的位置。任何时候都只存在一个Selection对象。

4)Bookmark对象:代表文档中的书签,是一块连续的区域,既可用于标识一个位置,也可以当成一个文本容器。文档中可以定义多个书签。

5)Range对象,表示Word文档中一块连续的区域,它由一个起始位置和一个结束位置定义。同一个Word文档中可以有多个Range对象。

3 生成Word试卷

3.1 添加Word 2010的COM组件

不同的Word版本,其COM组件的名称也稍有不同,对于特定的Word版本,需要引入相应的COM组件进行开发。例如,Word2003的COM组件名为Microsoft Word1 1. 0 Object Library,而Word2010的COM组件名为Microsoft Word 14.0 Object Library。

添加方式为:在工程资源管理器中“添加引用”>“com”选项卡>在下拉列表中选“Microsoft word 14.0 Object Library”。添加好COM组件之后,会在工程里多出两个新的引用:Microsoft.Office.Core和Microsoft.Office.Interop.Word。

3.2 调用Word试卷模板生成新文档

每个学校的试卷通常都有默认的格式,有竖排的,也有横排的,也有A3纸张的也有A4幅面的,页面设置也可能各不相同。通过调用Word试卷模板来生成Word试卷,可以解决复杂的页面格式控制问题,注意不同的Word版本,其模板文件的扩展名也不同。试卷模板中包含固定的信息,主要是试卷属性名;要动态生成的内容先预置好文本框或标签。

通过以下代码调用Word试卷模板来创建一个新文档:

Object template=TestPaperTemplateName;

//TestPaperTemplateName为模板文件的路径和文件名

Word.Application word = new Word.Application();

//创建word对象

Word.Documentmydoc = word.Documents.Open(ref template);

//根据模板文件创建一个空文档,mydoc表示创建的Document对象

3.3 特定位置信息的处理

试卷头部中有关于一份试卷的基本信息,如课程名称、学年学期、适用班级等等信息,信息量不少,且内容显示的格式都不太相同,待填写的位置还有下划线,增加了处理难度。如果采用逐行输出,格式处理起来就很麻烦,下划线的长度也不是很好控制,代码行也相应较多;如果采用表格形式控制输出,就会有很多的单元格要进行合并和拆分,且看起来不太美观;比较理想的处理方式是在试卷模板中,将待待填入信息的地方都添加文本框,设置好文本框的格式,然后在源代码文件中动态地逐个访问文本框,并填入相关内容。可以使用Range对象来处理这类特定位置信息。

Word对象中的WdStoryType属于枚举类型,同一类之间的对象是链表的形式连接在一起的。其中wdTextFramStory代表文本框架部分,通过判断Range对象的StoryType属性是否为来wdTextFramStory定位到文本框中,然后逐个遍历。

使用如下代码可以实现对文本框的控制:

Word.StoryRangessr = mydoc.StoryRanges;

foreach (Word.Range r in sr)

{ Word.Range r1 = r;

if (Word.WdStoryType.wdTextFrameStory == r.StoryType)

{ intContentValue = 1;

do {

r1.Text = ContentValue.ToString();

ContentValue++;

r1 = r1.NextStoryRange;

} while (r1 != null);}}

3.4 表格的处理

在Word文档中,表格是一种重要的信息呈现形式,它既可以承载内容,又可以起到格式控制的作用,被得到广泛的使用。

使用如下代码可以实现对表格的控制:

Word.Tablemytable; //声明Word表格

mytable = mydoc.Tables.Add(mysel.Range, rows,cols, ref myobj, ref myobj);//生成rows行cols列的表格

mytable.Columns[i].Width =35;//设置第i列的宽度

mytable.Rows[j].Height=40;//设置第j 行的高度

mytable.Cell(j, i).Range.InsertAfter(“abcd”);//在指定单元格当前光标后插入内容

mytable.Rows.Add(1);//往表格中添加一行

3.5 图片的处理

在COM组件编程中将Word文档中的图片分为两种,即Shape对象和InLineShape对象,Shape对象可浮于文字之上,且可放置在文档中的任意位置;而InLineShape对象为嵌入式图形对象,在排版上以文字的的方式进行排版。

在试卷中经常会出现图片,有些图片是题干内容,有些图片是选择题中的选项,这些图片都需要同文字流一起排版,因此将其作为InLineShape对象进行处理。InLineShapes是InLineShape对象的集合。可以使用文档对象Document中的InLineShapes集合的AddPicture()方法实现向Word文档中插入图片。此外,设置InLineShape对象的Width和Height属性可以调整图片的宽和高。

使用下面的代码插入图片并设置相关的属性:

string FileName=fileName; //图片名称及路径

Word.Applicationapp=new Word.Application();

object range=app.Selection.Range;// 图片插入位置

Word.InLineShape shape=app.ActiveDocument.InLineShapes.AddPicture(FileName, ref linkToFile, refsaveWithDocument, ref range);

shape.Width=150f;// 设置图片宽度

shape.Height=300f;//设置图片高度

3.6 生成Word试卷的算法流程图

试卷内容显示可以以段落的形式,也可以是表格的形式,考虑到表格可以更方便地将题号与题目内容分开,本文最后还是选用了表格的形式。根据试题的数量N先初始化一个N行2列的表格,每道题目占一行,第1列用来写题号,第2列用来写题目内容。表格行数可根据需要进行添加,如需要添加题型标题行、需要添加作答区时应增加表格行,作答区的空白范围通过设置当前行的行高来进行控制。

将一套试卷的所有试题从数据库中读取出来,保存至ADO的DataTable对象中,且按照题型排好序,然后采用图1中所示的算法,将试题按照用户所要求的格式写入到Word文档中,即生成Word格式的试卷。

参考文献:

[1] 赵春海.COM组件的设计与使用[J].邵阳学院学报:自然科学版,2009(3).

[2] 王二暖.基于C#的Word 2010文档自动生成系统[J].电脑开发与应用,2011,24(5):48-50.

[3] 陈辉.Word对象模型在智能组卷中的应用[J].现代电子技术,2012(4).

[4] 赵春海.COM组件的设计与使用[J].邵阳学院学报:自然科学版,2009(3).

[5] 李志云.C#对SQL Server中的数据导入导出[J].电脑编程技巧与维护,2009(17).