Microsoft Word是一個集成化環境,是美國微軟公司的字處理系統,但是它決不僅僅是一個字處理系統,它集成了Microsoft Visual Basic,可以通過編程來實現對Word功能的擴展。
Microsoft Visual Basic在word中的代碼即Word的宏,通過編寫Word宏,可實現一些文檔處理的自動化,如實現文檔的自動備份、存盤等,可擴展Word文檔的功能,因此,能夠充分利用Word的特性,甚至使Word成為自己軟件的一部分。Word的宏既有有利的一部分,因為它能夠幫助我們實現文檔的自動化,但是Word的宏也不是純粹的有利,有時它可能危害我們的文檔、計算機系統甚至網絡,從最開始的Taiwan NO1宏病毒到現在的Melissa宏病毒,從最開始的簡單的提示,耗盡系統資源到現在的亂發電子郵件,將個人的信息發送到網絡上,甚至向硬盤的Autoexec.bat(自動批處理文件)中添加Deltree C: -y,破壞整個Windows系統。
Word中內嵌的Com技術
可以說Word是對Com技術支持最好的軟件,這樣說似乎是太極端了一點,但是Word提供的強大的編程接口技術卻能夠是我們通過程序控制Word的任何一部分。無論是文件的打開、存盤、打印還是文檔中表格的自動繪制。
通過編程軟件,可以靈活的操縱word,這裡只以Borland Delphi為例,進行詳細描述:
1、在Delphi中調用Word軟件/文件的方法
在Word中調用Word軟件,歸納起來有三種可通過Delphi的控件TOleContainer 將Word嵌入的方法
a.使用Delphi提供的Servers控件調用Word,使用Word的屬性
b.通過真正的Com技術,將Office軟件目錄中文件MSWORD9.OLB中的類庫全部導入Delphi中,
c.使用CreateOleObject將啟動Word,然後以Ole方式對Word進行控制。
2、對幾種方法的難易程度的判別
a.通過Delphi的控件TOleContainer 將Word嵌入
這是最簡單的Ole嵌入,能夠直接將Word文檔調用,只需要使用ToleContainer.Run就可以將Word文檔直接啟動。且這樣啟動的Word文檔與Delphi程序是一個整體(從界面上看),但是它存在不可克服的缺點,即不能通過Delphi控制Word文檔,也就不能實現將靈活操縱Word的目的。
b.使用Delphi提供的Servers控件調用Word,使用Word的屬性。
使用Delphi的Servers控件來操縱Word,在編程時Delphi能夠實現代碼提示,總體上看能夠較好的實現Delphi對Word的控制,但是還有一些Word的功能不能在Delphi中調用(比如自己編寫的VBA宏代碼)。
且實現功能時本來在VBA代碼中可選則參數在Delphi調用的時候必須添加,否則,連編譯都不能通過。
這種方式啟動的Word與Delphi程序分屬兩個窗體。此辦法僅能作為一個參考。
c.通過真正的Com技術,將Office軟件目錄中文件MSWORD9.OLB中的類庫全部導入Delphi中,利用Com技術編程,利用真正的Com技術,將MsWord9.OLD文件類庫導入,然後利用Com技術進行使用。
整體上類似使用Delphi的Servers控件,稍微比Servers控件麻煩,優缺點與Servers控件相同。
d.使用CreateOleObject將啟動Word,然後以Ole方式對Word進行控制。
這種辦法是使用以CreateOleObjects方式調用Word,實際上還是Ole,但是這種方式能夠真正做到完全控制Word文件,能夠使用Word的所有屬性,包括自己編寫的VBA宏代碼。
與Servers控件和com技術相比,本方法能夠真正地使用Word的各種屬性,和在VBA中編寫自己的代碼基本一樣,可以缺省的代碼也不需要使用。
本方式啟動的Word與Delphi程序分屬兩個窗體。
缺點是使用本方法沒有Delphi代碼提示,所有異常處理均需要自己編寫,可能編寫時探索性知識比較多。
Word宏編輯器
進入Word宏編輯器的方法:工具->宏->Visual Basic編輯器,可進入Visual Basic編輯器界面。Word的Visual Basic編輯器界面和真正的Visual Basic編輯器基本相同,在此不再向詳述。
在VBA代碼中,可以添加用戶窗體、模塊、類模塊。用戶窗體、模塊、類模塊的概念和Visual Basic完全相同。注釋也與Visual Basic完全相同。
可以將光標停留在窗體、模塊的任何一個子程序上,直接按“F5”運行當前子程序。
Word的宏的概述
Word充分地將文檔編輯和VB結合起來,真正地實現文檔的自動化。使用Word編程,類似於使用Visual Basic,所不同的是,在Word中,能夠直接運行某一個子程序,直接看見結果,Word的宏,
只能解釋運行,而Visual Basic,現在已經能夠編寫成真正的機器碼,從代碼的保護上來說,應該盡可能地減少Word的VBA代碼數量,尤其是關鍵的代碼。
VBA宏,可分成四種:
1、和命令名相同的宏
如FileSave,FileOpen,如果在VBA代碼中包含與Word同名的函數,則直接執行這些VBA代碼,忽略Word本身的命令。
2、Word內特定的宏
這些宏包含AutoExec(啟動 Word 或加載全局模板)、AutoNew(每次新建文檔時)、AutoOpen(每次打開已有文檔時)、AutoClose(每次關閉文檔時),AutoExit(退出 Word 或卸載全局模板時)。
如果VBA代碼中含有這些名稱的函數,則滿足相應的條件,相應代碼就自動執行。
3、相應事件的VBA宏
這些宏是由事件觸發的宏,如Document_Close在文檔關閉的時候觸發事件,Document_New在新建文檔的時候觸發,Document_Open在打開文檔的時候觸發。
4、獨立的宏
自己編寫的VBA代碼,即不屬於上面幾種情況的VBA代碼,可以被其他VBA代碼調用,更重要的是,可以被其他程序調用。
這樣,我們就可以屏棄Word自動執行的宏,通過Delphi直接調用相應宏來達到目的。
Word命令宏的詳細描述
Word本身的命令函數包含很多,但是無論是word聯機幫助還是MSDN幫助,都沒有這方面的介紹,因此只能憑自己的實驗取探索,初步探測的函數如下:
宏名 解釋 FileNew 新建 FileNewDefault 新建空白文檔 FileSaveAs 另存為 FileOpen 打開 FileClose 關閉 FilePrint 打印 FilePrintPreview 打印預覽 ToolsCustomize 工具欄裡面的自定義 ToolsOptions 工具選項 ToolsRevisions 突出顯示修訂 ToolsReviewRevisions 接受或拒絕修訂 ToolsRevisionMarksAccept 接受修訂 ToolsRevisionMarksReject 拒絕修訂 ToolsRevisionMarksToggle 修訂 ToolsMacro 宏 ToolsRecordMacroToggle 錄制新宏 ViewSecurity 安全性 ViewVBCode 查看VB編輯器環境 FileTemplates 模板和可加載項 ToolsProtectUnprotectDocument 解除對文檔的保護 InsertHyperlink 插入超級鏈接 EditHyperlink 編輯超級鏈接 DeleteHyperlink 刪除超級鏈接 EditLinks 查看、刪除鏈接 EditPasteAsHyperlink 粘貼超級鏈接 FormatStyle 樣式 EditBookMark 書簽下面舉例說明:
一、Delphi程序啟動Word
采用CreateOleObjects的方法來啟動Word,調用VBA代碼,具體實現過程為:
首先使用GetActiveOleObject('Word.Application')判斷當前內存中是否存在Word程序,如果存在,則直接連接,如果沒有Word程序,則使用CreateOleObject('Word.Application')啟動Word
二、Delphi程序新建Word文稿
格式:WordDocuments.Add(Template,NewTemplate,DocumentType,Visible)
Template: 使用模板的名稱,
NewTemplate: 新建文檔的類型,True表示為模板,False表示為文檔
DocumentType: 文檔類型,默認為空白文檔
Visible: 打撈的窗口是否可見
舉例:Doc_Handle:=Word_Ole.Documents.Add(Template:='C:\Temlate.dot',NewTemplate:=False);
三、Delphi程序打開Word文稿
格式:WordDocuments.Open(FileName,ConfirmConversions,ReadOnly,PassWordDocument,
PasswordTemplate,Revent,WritePasswordDocument,WritePassWordTemplate,Format,Encoding,Visible)
FileName: 文檔名(包含路徑)
Confirmconversions: 是否顯示文件轉換對話框
ReadOnly: 是否以只讀方式打開文檔
AddToRecentFiles: 是否將文件添加到"文件"菜單底部的最近使用文件列表中
PassWordDocument: 打開此文檔時所需要的密碼
PasswordTemplate: 打開此模板時所需要的密碼
Revert: 如果文檔已經,是否重新打開文檔
WritePasswordDocument: 保存對文檔更改時所需要的密碼
WritePasswordTemplate: 保存對模板進行更改時所需要的密碼
Format: 打開文檔時所需使用的文件轉換器
Encoding: 所使用的文檔代碼頁
Visible: 打開文檔的窗口是否可見
舉例:
Doc_Handle:=Word_Ole.Documents.open(FileName:=Doc_File,ReadOnly:=False,
AddToRecentFiles:=False);
四、Delphi程序保存Word文稿
格式:WordDocuments.SaveAs(FileName, FileFormat, LockComments, Password,
AddToRecentFiles, WritePassword, ReadOnlyRecommended, EmbedTrueTypeFonts, SaveNativePictureFormat, SaveFormsData, SaveAsAOCELetter)
FileName: 文件名。默認為當前文件夾和文件名。
FileFormat 文檔保存的格式。
LockComments 如果為 True,則此文檔只允許進行批注。
Password 打開文檔時的口令。
AddToRecentFiles 如果為True,則將文檔添至"文件"菜單中最近使用的文檔列表中。
WritePassword 保存對文檔的修改所需的口令。
ReadOnlyRecommended 如果為 True,在每次打開文檔時,Word 將建議用戶采用只讀方式。
EmbedTrueTypeFonts 如果為 True,則將文檔與 TrueType 字體一起保存。
SaveNativePictureFormat 如果為 True,則從其他系統平台(例如 Macintosh)導入的圖形僅保存其 Windows 版本。
SaveFormsData 如果為 True,則將窗體中用戶輸入的數據存為一條數據記錄。
SaveAsAOCELetter 如果文檔包含一個附加,當此屬性值為 True 時,將文檔存為一篇 AOCE 信箋(同時保存郵件)。
舉例:
Word_Ole.Documents.SaveAs(FileName:=Doc_File,FileFormat=wdFormatDocument,AddToRecentFiles=False);
五、從數據庫讀取文件到本地硬盤和從本地硬盤讀取文件到數據庫
在數據庫上使用Image二進制字段保存,使用Stream流的方式。
創建文件流:
Word_FileStream:=TFileStream.Create(Target_Name,fmOpenWrite or fmCreate);
Word_FileStream.Position:=0;
保存到數據庫的Image字段:
TBlobField(AdoQuery1.FieldByName(Column_Name)).SaveToStream(Word_FileStream);
從數據庫讀取文件到本地硬盤:
TBlobField(ADOQuery1.FieldByName(Column_Name)).loadfromStream(Word_FileStream);
釋放文件流:
Word_FileStream.Free;
六、全局消息的定義
因為word和Delphi程序是兩個軟件,相互之間通訊比較麻煩,所以使用全局消息的方法進行。全局消息必須首先注冊,Windows返回系統空閒的消息號,當注冊的消息相同時,Windows系統返回同一個值,這樣就保證了使用這個消息號在兩個程序之間通訊。
定義消息的辦法:
szMessageString: pchar = 'XIDIAN_11_Stone';
FMyJoinMessage := RegisterWindowMessage(szMessageString);
發送消息的方法:
SendMessage(對方句柄,消息,消息附帶短變量,消息附帶長變量)
七、Delphi程序接收消息的方法
Delphi接收消息有兩種,一是重載特定消息,二是重載WndProc函數,在裡面選擇相應消息進行處理。
方法一,每次只能處理一條消息,而法二能夠同時處理多條消息。
對於法二,聲明如下:
procedure WndProc(var Message: TMessage);override
必須注意,使用時需要在處理完自己消息處理後繼承WndProc(Message)函數,否則系統會崩潰!
八、Word中Combo對話框的動態生成以及Change事件
建立類模塊Combohander,在內部定義事件
Public WithEvents ComboBoxEvent As Office.CommandBarComboBox
定義Combo控件產生事件的模塊
Dim ctlComboBoxHandler As New ComboBoxHandler
產生Combo對話框
Set Cbo_ChooseDoc = CommandBars("添加的菜單").Controls.Add(Type:=msoControlComboBox, Temporary:=True)
進行文件句柄設置,以產生Combo_Change事件
Set ctlComboBoxHandler.ComboBoxEvent = Cbo_ChooseDoc
產生事件後,在類模塊Combohander內選擇ComboBoxEvent的Change事件,即可書寫事件代碼
Sub ComboBoxEvent_Change(ByVal Ctrl As Office.CommandBarComboBox)
九、一些Word的事件
VBA代碼中處理的Word事件有:Document_Close
Application事件中需要處理的有:DocumentBeforeClose,DocumentChange。
Document_Close:事件在文檔關閉時產生事件
DocumentBeforeClose:在文檔被關閉以前先於Word判斷文檔是否保存,給出相應提示並進行相應處理。
DocumentChange:文檔切換,在文檔從自己修改的文稿和其他人修改的文稿之間切換產生事件,主要處理設置文檔權限等。