周文君 劉柱鴻
摘要:該文分析了COM組件技術(shù),并對Word對象中的重要接口進行了說明,采用COM組件技術(shù),將數(shù)據(jù)庫中的試卷輸出到Word軟件中,生成Word試卷,并對試卷中各個組成部分進行自動格式化處理,可供直接打印輸出,提高了工作效率。
關(guān)鍵詞:COM組件技術(shù);Word格式試卷;試卷輸出;Office編程
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2015)24-0062-02
在智能題庫系統(tǒng)的設(shè)計中,當系統(tǒng)按照組卷約束成功組卷之后,每一份試卷的相關(guān)信息都保存在數(shù)據(jù)庫中,根據(jù)需要讀取數(shù)據(jù)庫中的信息進行試卷輸出。常見的考試形式有在線考試和線下考試兩種,針對線上考試,試卷通常輸出為HTML文檔;針對線下考試,試卷通常輸出為Word文檔。在高級語言中實現(xiàn)對Word文檔的控制需要導入COM組件,通過COM組件中提供的各種對象的屬性和方法來實現(xiàn)對Word文檔的操控。本文基于Visual Studio2010平臺,采用C#編程語言,引入COM組件實現(xiàn)對Word 2010文檔的控制,自動生成格式規(guī)范的Word試卷。
1 COM組件技術(shù)
組件技術(shù)的出現(xiàn)是為了實現(xiàn)組合軟件。組件實際上是一些小功能專一的可執(zhí)行程序,它們可以為操作系統(tǒng)、應用程序提供服務。利用已有的組件,用戶可以高效地創(chuàng)建一個應用程序,當應用需要升級或是重新定制時,只需要將其中的某一些組件用新的替換掉就可以,而不需要全盤重來,這樣大大地提高了軟件生產(chǎn)力。
COM(組件對象模型,Component Object Model)是微軟公司推出的產(chǎn)品,在進行COM組件開發(fā)時,微軟對其的定位是“基于對象的程序設(shè)計模型”,其主要目的在于促進軟件的互操作性。COM組件的特性是與平臺無關(guān)、與語言無關(guān),可以在任意一種平臺下,使用各種不同的高級語言去調(diào)用COM組件。無論是采用哪一種開發(fā)平臺,也無論采用何種程序設(shè)計風格,進行組件開發(fā)都需要遵循相關(guān)的標準,只有按照統(tǒng)一的標準進行開發(fā),軟件中所涉及的各種類型的組件之間才能實現(xiàn)互相訪問和協(xié)同工作。
2 Word對象模型解析
在項目中添加好相應的COM組件后,就可以使用組件中提供的接口來實現(xiàn)Word編程[3]。Word編程中所有相關(guān)的類和對象都在Microsoft.Office.Interop.Word命名空間中進行定義。下面介紹Word對象模型中的5大對象。
1)Application對象,表示W(wǎng)ord應用程序,是所有其他對象的父級。Word應用程序中所有打開的Word文檔都在該對象的Documents集合中;訪問ActiveDocument屬性可以獲取焦點所在的活動Document對象。
2)Document對象,表示一個Word文檔文件,可以使用Application.Documents的Add方法(或Open方法)來創(chuàng)建(或打開)一個新的Document對象,當新建或打開一個Word文檔時,就是創(chuàng)建了一個Document對象,該對象自動添加到Documents集合中,使用該對象的Save方法(或是SaveAs方法)可以保存(或是另存為)文檔。
3)Selection對象:代表Word文檔中的選定區(qū)域,可以是一塊連續(xù)的選區(qū),也可以是非連續(xù)的選區(qū),如何沒有選擇任何區(qū)域,則表示光標所在的位置。任何時候都只存在一個Selection對象。
4)Bookmark對象:代表文檔中的書簽,是一塊連續(xù)的區(qū)域,既可用于標識一個位置,也可以當成一個文本容器。文檔中可以定義多個書簽。
5)Range對象,表示W(wǎng)ord文檔中一塊連續(xù)的區(qū)域,它由一個起始位置和一個結(jié)束位置定義。同一個Word文檔中可以有多個Range對象。
3 生成Word試卷
3.1 添加Word 2010的COM組件
不同的Word版本,其COM組件的名稱也稍有不同,對于特定的Word版本,需要引入相應的COM組件進行開發(fā)。例如,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 調(diào)用Word試卷模板生成新文檔
每個學校的試卷通常都有默認的格式,有豎排的,也有橫排的,也有A3紙張的也有A4幅面的,頁面設(shè)置也可能各不相同。通過調(diào)用Word試卷模板來生成Word試卷,可以解決復雜的頁面格式控制問題,注意不同的Word版本,其模板文件的擴展名也不同。試卷模板中包含固定的信息,主要是試卷屬性名;要動態(tài)生成的內(nèi)容先預置好文本框或標簽。
通過以下代碼調(diào)用Word試卷模板來創(chuàng)建一個新文檔:
Object template=TestPaperTemplateName;
//TestPaperTemplateName為模板文件的路徑和文件名
Word.Application word = new Word.Application();
//創(chuàng)建word對象
Word.Documentmydoc = word.Documents.Open(ref template);
//根據(jù)模板文件創(chuàng)建一個空文檔,mydoc表示創(chuàng)建的Document對象
3.3 特定位置信息的處理
試卷頭部中有關(guān)于一份試卷的基本信息,如課程名稱、學年學期、適用班級等等信息,信息量不少,且內(nèi)容顯示的格式都不太相同,待填寫的位置還有下劃線,增加了處理難度。如果采用逐行輸出,格式處理起來就很麻煩,下劃線的長度也不是很好控制,代碼行也相應較多;如果采用表格形式控制輸出,就會有很多的單元格要進行合并和拆分,且看起來不太美觀;比較理想的處理方式是在試卷模板中,將待待填入信息的地方都添加文本框,設(shè)置好文本框的格式,然后在源代碼文件中動態(tài)地逐個訪問文本框,并填入相關(guān)內(nèi)容??梢允褂肦ange對象來處理這類特定位置信息。
Word對象中的WdStoryType屬于枚舉類型,同一類之間的對象是鏈表的形式連接在一起的。其中wdTextFramStory代表文本框架部分,通過判斷Range對象的StoryType屬性是否為來wdTextFramStory定位到文本框中,然后逐個遍歷。
使用如下代碼可以實現(xiàn)對文本框的控制:
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文檔中,表格是一種重要的信息呈現(xiàn)形式,它既可以承載內(nèi)容,又可以起到格式控制的作用,被得到廣泛的使用。
使用如下代碼可以實現(xiàn)對表格的控制:
Word.Tablemytable; //聲明Word表格
mytable = mydoc.Tables.Add(mysel.Range, rows,cols, ref myobj, ref myobj);//生成rows行cols列的表格
mytable.Columns[i].Width =35;//設(shè)置第i列的寬度
mytable.Rows[j].Height=40;//設(shè)置第j 行的高度
mytable.Cell(j, i).Range.InsertAfter(“abcd”);//在指定單元格當前光標后插入內(nèi)容
mytable.Rows.Add(1);//往表格中添加一行
3.5 圖片的處理
在COM組件編程中將Word文檔中的圖片分為兩種,即Shape對象和InLineShape對象,Shape對象可浮于文字之上,且可放置在文檔中的任意位置;而InLineShape對象為嵌入式圖形對象,在排版上以文字的的方式進行排版。
在試卷中經(jīng)常會出現(xiàn)圖片,有些圖片是題干內(nèi)容,有些圖片是選擇題中的選項,這些圖片都需要同文字流一起排版,因此將其作為InLineShape對象進行處理。InLineShapes是InLineShape對象的集合??梢允褂梦臋n對象Document中的InLineShapes集合的AddPicture()方法實現(xiàn)向Word文檔中插入圖片。此外,設(shè)置InLineShape對象的Width和Height屬性可以調(diào)整圖片的寬和高。
使用下面的代碼插入圖片并設(shè)置相關(guān)的屬性:
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;// 設(shè)置圖片寬度
shape.Height=300f;//設(shè)置圖片高度
3.6 生成Word試卷的算法流程圖
試卷內(nèi)容顯示可以以段落的形式,也可以是表格的形式,考慮到表格可以更方便地將題號與題目內(nèi)容分開,本文最后還是選用了表格的形式。根據(jù)試題的數(shù)量N先初始化一個N行2列的表格,每道題目占一行,第1列用來寫題號,第2列用來寫題目內(nèi)容。表格行數(shù)可根據(jù)需要進行添加,如需要添加題型標題行、需要添加作答區(qū)時應增加表格行,作答區(qū)的空白范圍通過設(shè)置當前行的行高來進行控制。
將一套試卷的所有試題從數(shù)據(jù)庫中讀取出來,保存至ADO的DataTable對象中,且按照題型排好序,然后采用圖1中所示的算法,將試題按照用戶所要求的格式寫入到Word文檔中,即生成Word格式的試卷。
參考文獻:
[1] 趙春海.COM組件的設(shè)計與使用[J].邵陽學院學報:自然科學版,2009(3).
[2] 王二暖.基于C#的Word 2010文檔自動生成系統(tǒng)[J].電腦開發(fā)與應用,2011,24(5):48-50.
[3] 陳輝.Word對象模型在智能組卷中的應用[J].現(xiàn)代電子技術(shù),2012(4).
[4] 趙春海.COM組件的設(shè)計與使用[J].邵陽學院學報:自然科學版,2009(3).
[5] 李志云.C#對SQL Server中的數(shù)據(jù)導入導出[J].電腦編程技巧與維護,2009(17).