摘要:本文總結(jié)了四種Delphi訪問和控制Word的方法,對(duì)DDE動(dòng)態(tài)數(shù)據(jù)交換技術(shù)操縱Word文檔的方法進(jìn)行了比較詳細(xì)的敘述,并就實(shí)現(xiàn)Delphi對(duì)Word文檔自接操作進(jìn)行了簡單舉例。
關(guān)鍵詞:Delphi;Word;訪問和控制
中圖分類號(hào):TP312文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2008)14-20867-02
1 引言
Delphi是一個(gè)高效的可視化數(shù)據(jù)庫管理系統(tǒng)開發(fā)工具,具有功能強(qiáng)大、結(jié)構(gòu)嚴(yán)謹(jǐn)、開發(fā)周期短、編譯運(yùn)行速度快、處理數(shù)據(jù)庫方便快捷等特點(diǎn)。Delphi 7.0更是成倍地增強(qiáng)數(shù)據(jù)庫和網(wǎng)絡(luò)處理功能,它封裝了大量組件,并完全公開VCL以及CLX源代碼,是專業(yè)數(shù)據(jù)庫程序最理想的開發(fā)工具。在對(duì)Microsoft的產(chǎn)品Office的訪問與控制力而言,Delphi也表現(xiàn)得毫不遜色,本文就Delphi與Word相結(jié)合進(jìn)行簡略論述,內(nèi)容包括Delphi訪問和控制Word的幾種方法,用Delphi生成Word報(bào)告以及動(dòng)態(tài)結(jié)構(gòu)表格。
Word是世界上使用范圍最為廣泛的文字處理系統(tǒng)。雖然許多應(yīng)用程序開發(fā)上具都有其自身的報(bào)表生成系統(tǒng),但用Word作為應(yīng)用程序的報(bào)表輸出上具卻具有許多不可替代的優(yōu)點(diǎn):
(1)可以生成圖、文、表并茂的文檔;
(2)可以生成更為復(fù)雜的報(bào)表,包括多層次嵌套表格、斜線表格等;
(3)用戶可以定制和修改文檔模板;
(4)用戶可以對(duì)生成的文檔做進(jìn)一步的加上;
(5)生成的文檔,用戶可以進(jìn)行轉(zhuǎn)儲(chǔ)和發(fā)布。
可見,用Word作為應(yīng)用程序的報(bào)表輸出上具有可以進(jìn)一步擴(kuò)展應(yīng)用程序的功能,提高系統(tǒng)數(shù)據(jù)資料的利用率和可共享性,便于用戶對(duì)所生成的報(bào)表或文檔進(jìn)行二次加工和重復(fù)使用,這是那些應(yīng)用程序開發(fā)上具自帶的報(bào)表生成系統(tǒng)所不可比擬的。
Word絕不僅僅是一個(gè)文字處理系統(tǒng),它是一個(gè)集成化環(huán)境,它集成了VB可以通過編程來實(shí)現(xiàn)對(duì)Word功能的擴(kuò)展。Word提供的強(qiáng)大的編程接口技術(shù)使得我們利用各種編程上具通過程序?qū)ζ溥M(jìn)行控制成為可能。
2 Delphi訪問和控制Word的幾種方法
一般的,Delphi訪問和控制Word的方法可以分為四種,即使用OLE(對(duì)象鏈接嵌入)、使用Delphi提供的Servers控件、直接使用COM(組件對(duì)象模型)技術(shù)、通過DDE(動(dòng)態(tài)數(shù)據(jù)交換)技術(shù)調(diào)用Word。
2.1 使用OLE技術(shù)
OLE(對(duì)象鏈接嵌入),是Microsoft公司同計(jì)算機(jī)界合作并發(fā)展起來的產(chǎn)品規(guī)范,能夠共享應(yīng)用程序的信息資源。
(1)使用Tole Container控件調(diào)用Word
System面板上的Tolecontainer控件能夠在應(yīng)用程序的窗口上創(chuàng)建一個(gè)OLE用戶區(qū)域,用于實(shí)現(xiàn)Delphi與外部某個(gè)對(duì)象包括Word的接口。該方法是一種簡單的OLE嵌入.能夠直接調(diào)用Word文檔。使用時(shí)只需要調(diào)用Tolecontainer的Run方法就可以將Word文檔直接啟動(dòng)。而且,這樣的啟動(dòng),Word文檔與Delphi程序從界而上看是個(gè)整體,怎樣靈活操縱Word文件是這種方法的難點(diǎn)。
(2)用Create Ole Object方式調(diào)用Word
本方法是使用Create Ole Objects方式創(chuàng)建并調(diào)用Word,實(shí)際上是OLE的另一種應(yīng)用形式,這種方式能夠做到靈活地控制Word文件,能夠使用Word的所有屬性,包括自己編寫的VBA宏代碼,可以對(duì)Word文檔實(shí)現(xiàn)較完美的控制。該方法的難點(diǎn)在于需要自己編寫所有對(duì)異常事件的處理過程,需要程序員具備定的編程經(jīng)驗(yàn)。
2.2 使用Delphi提供的Servers控件
Delphi控件而板上有組Servers控件,能非常方便地訪問Office對(duì)象。使用Delphi中提供的相應(yīng)的控件來操縱Word的優(yōu)點(diǎn)就是在編程時(shí)Delphi能夠?qū)崿F(xiàn)友好的代碼提示,總體上看能夠較好地實(shí)現(xiàn)Delphi對(duì)Word的控制。其難點(diǎn)在于一些重要的Word功能,如實(shí)現(xiàn)自己編寫的VBA宏代碼有些繁瑣.控制難度偏大。在該方式下,Word文檔與Delphi程序分屬兩個(gè)窗體。
2.3 直接使用COM技術(shù)
從結(jié)構(gòu)上講,COM是OLE的核心。使用COM技術(shù)的方法是將Office 2000軟件日錄中文件MSWORD9.OLB中的類庫個(gè)部導(dǎo)入Delphi中。(其他版本的Office導(dǎo)入相應(yīng)的文件),利用COM技術(shù)進(jìn)行使用。整體上與使用Delphi的Servers控件相似,故而其優(yōu)缺點(diǎn)也與使用Servers控件大體相同。
2.4 通過DDE技術(shù)實(shí)現(xiàn)Delphi調(diào)用Word
DDE是建立在Windows內(nèi)部消息系統(tǒng)、全局原子和共享全局內(nèi)存基礎(chǔ)上的一種協(xié)議。用來協(xié)調(diào)Windows應(yīng)用程序之問的數(shù)據(jù)交換和命令調(diào)用.可以作為不同程序在運(yùn)行期間實(shí)現(xiàn)對(duì)數(shù)據(jù)的動(dòng)態(tài)交換的一種通用技術(shù)。
由于篇幅的限制。本文只對(duì)DDE動(dòng)態(tài)數(shù)據(jù)交換技術(shù)操縱Word文檔的方法進(jìn)行敘述。
該方法也是通過VBA來實(shí)現(xiàn)對(duì)Word的調(diào)用。DDE協(xié)議使用三級(jí)命名:服務(wù)(service)、主題(topic)和數(shù)據(jù)項(xiàng)(items)來標(biāo)識(shí)DDE所傳遞的數(shù)據(jù)單元。服務(wù)使應(yīng)用程序具有了提供給其他程序的數(shù)據(jù)交換能力,一般服務(wù)就是應(yīng)用程序的文件名;主題是對(duì)服務(wù)器有意義的信息單元,許多服務(wù)器都有默認(rèn)的主題System,每次DDE客戶與服務(wù)程序之間的對(duì)話都是先由客戶啟動(dòng)的,所以在每次客戶啟動(dòng)之前,DDE服務(wù)器必須先投入運(yùn)行。以Word作為要連接的服務(wù)器,在與其建立連接之前要先設(shè)定好連接的服務(wù)與主題,在本文示例中分別設(shè)定這兩項(xiàng)為:“Winword”和“System”,當(dāng)設(shè)置好連接后就可以通過Delphi提供的DDE Client Conv組件的OpenLink函數(shù)打開與這個(gè)服務(wù)的連接,剩下的工作就是向Word服務(wù)器發(fā)送和執(zhí)行宏命令,用該組件的函數(shù)Execute Macro來實(shí)現(xiàn)。具體示例如下:
加入DDE客戶端組件:新建一App工程Word DDE,然后在Component Palette組件條的System屬性頁里選擇DdeClientConv組件,并把它拖放到窗體上。修改其Name屬性為DDE Client。
添加同DDE服務(wù)進(jìn)行交互的代碼:在工程上添加一個(gè)過程Run Macro,用于打開與Word服務(wù)器之間的鏈接,并通知服務(wù)器執(zhí)行由Macro標(biāo)識(shí)的宏命令,讓W(xué)ord按用戶的意圖完成響應(yīng)的動(dòng)作。完成之后由客戶力斷開這次連接,完成一次會(huì)話。下面是上述過程的實(shí)現(xiàn)代碼:
procedure TForml.RunMacro Macro: pChar); varp Macro:array 0..80] of Char;
beginDDE Client.SetLinlk 'Winword','System');//設(shè)置連接
DDE Client.OpenLink;//按設(shè)置打開連接
StrpCopy pMacro, Macro);
if Not DDE CIient.Execute Macro pMacro,1) then//執(zhí)行宏命令
Show Message 'Unable to Execute Macro');
DDE CIient.Close Link; //斷開連接
end;
宏命令的執(zhí)行:宏(Macro)是客戶程序要服務(wù)器完成的一些操作指令,對(duì)于特定的Microsoft Word而言,多是字處理方面的宏命令.這此宏命令完成的功能大多在Word的菜單下都能找到與之相匹配的菜單。可以向窗口添加個(gè)按鈕或是菜單然后在其處理函數(shù)中添加執(zhí)行宏的代碼如下:
procedure TForml.Buttonl Cliclk Sender:TObject);
begin
//創(chuàng)建一個(gè)新文檔.宏[FileNew]由函數(shù)Runl Macro通知Word
Run Macro [FileNew];
end;
3 用Delphi控制Word的具體實(shí)例
3.1 創(chuàng)建Word及Word文檔
創(chuàng)建并獲取Word Application和Word Docrunent對(duì)象的實(shí)例是對(duì)Word進(jìn)行控制的基礎(chǔ)。Delphi中,可以通過靜態(tài)和動(dòng)態(tài)兩種方法來實(shí)現(xiàn)。
(1)靜態(tài)方法
在Form中加入TWord Application和TWord Docrunent控件的實(shí)例Word Application和Word Docrunent對(duì)象,然后在相應(yīng)的事件中加入如下處理程序:
Word Applicationl connect//啟動(dòng)Word
Word Applicationl Window State=wdWindowStateMininizg//窗口最小化
Vi'orrLlpplicationL Activate //激活Word
Word Docrunentl Connect//連接Word文檔
Word Docrunentl ActiVate//激活Word文檔
Word Applicationl Visible=1//窗口隱藏
啟動(dòng)后,便可引用Word Applicationl Active Docrunent指代Word的活動(dòng)文檔,引用Word Applicatictnl Selection指代Word活動(dòng)文檔中當(dāng)前的光標(biāo)位置或選擇集,進(jìn)而對(duì)他們的子對(duì)象和屬性進(jìn)行控制。
(2)動(dòng)態(tài)方法相應(yīng)過程中的程序?yàn)?
… …
Var Word AppTWord Application
Word Doc,DotFile,DocFile OleVariant,
Begin
WordApp=TWordApplication Create(n il);//啟動(dòng)Word
WordApp Visible=False//窗口隱藏
DotFile=ExtractFilePath(Application ExeName)+‘Kcdjdot’;
DotFile=False
WordDoc=WordApp Documents Add(DotFile,DocFile);//用模板創(chuàng)建Word文檔;
在上面的例子中,變量WordApp、WordDoc分別儲(chǔ)存Word應(yīng)用程序和Word文檔的實(shí)例。需要注意的是,存儲(chǔ)Word及其子對(duì)象的所有變量都必須是0 leVariant類型?!癒cdjdot”是應(yīng)用程序目錄下的一個(gè)Word模板文件。
用靜態(tài)方法啟動(dòng)Word,在激活Word之前決不能隱藏Word窗口,否則就會(huì)出錯(cuò)。這樣,在啟動(dòng)Word的過程中Word窗口總是要閃現(xiàn)一下,不能真正實(shí)現(xiàn)“后臺(tái)運(yùn)行”,很不美觀。雖然可以用窗口最小化的方式彌補(bǔ)一下,但終究不是一個(gè)真正的程序員所追求的完美效果。用動(dòng)態(tài)方法啟動(dòng),完全克服了上述缺點(diǎn),似乎運(yùn)行速度也更快一些。
3.2 關(guān)閉Word及保存Word文檔
為釋放內(nèi)存,Word文檔生成完畢后要關(guān)閉Word。同時(shí)對(duì)生成的Word文檔進(jìn)行保存。下面的示例程序中,先打開一個(gè)保存文件對(duì)話框,以對(duì)話框中的文件名保存Word文檔,然后退出Word應(yīng)用程序:
IF SaveDialogl.Execute then begin
DocFile=SaveDialogl.FileName
DocSaveAs(DocFile);//保存Word文檔
WordApp Quit//關(guān)閉Word
End;
4 結(jié)束語
通過上面的介紹不難看出在Delphi中靈活操縱Word文檔,主要是利用VBA。我們也可以使用Office的其他VBA對(duì)其他Office工具如Microsoft Execl, Microsoft Access進(jìn)行調(diào)用。要實(shí)現(xiàn)Delphi對(duì)Office工具的完全控制,實(shí)現(xiàn)其所有功能,需要我們不斷地學(xué)習(xí)與摸索,挖掘Delphi的內(nèi)涵,感受Delphi的魅力。
參考文獻(xiàn):
[1] 于永生. 怎樣在Delphi中操縱Word文檔[J]. 科技情報(bào)開發(fā)與經(jīng)濟(jì),2006,16(2):228-229.
[2] 趙良輝. Delphi中報(bào)表的多種實(shí)現(xiàn)方法研究[J]. 現(xiàn)代制造工程,2004,(3):25-27.
[3] 陳省. Delphi深度探索[M]. 北京:電子工業(yè)出版社,2004:193-233.
[4] 徐新華. Delphi 5高級(jí)編程GUI編程[M]. 北京:人民郵電出版社,2000.
[5] 葛濤. Delphi中運(yùn)用FastRepoit設(shè)計(jì)和制作報(bào)表[J]. 微型電腦應(yīng)用,2004,(3):63-65.
[6] 高駿. 使用Delphi直接編輯演示文稿的實(shí)現(xiàn)方法[J]. 河南師范學(xué)院學(xué)報(bào)(自然科學(xué)版),2005,33(3):144-146.
注:本文中所涉及到的圖表、注解、公式等內(nèi)容請(qǐng)以PDF格式閱讀原文