用Delphi進行word開發

一劍平江湖發表於2013-12-11

使用以CreateOleObjects方式呼叫Word

實際上還是Ole,但是這種方式能夠真正做到完全控制Word檔案,能夠使用Word的所有屬性,包括自己編寫的VBA巨集程式碼。
-----------------------------------------

Word巨集編輯器
Word能夠真正地進行VBA程式碼的編輯,可以編寫窗體、函式。
進入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直接呼叫相應巨集來達到目的。
[b]五、Word命令巨集的詳細描述[/b]
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 書籤

OleWord時一些用用的程式碼

一、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:文件切換,在文件從自己修改的文稿和其他人修改的文稿之間切換產生事件,主要處理設定文件許可權等

------------------------------

例項

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtnrs,comobj, Word2000, OleServer;

type
  TForm1 = class(TForm)
    OleContainer1: TOleContainer;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var 
FWord :Variant; 
FDoc :Variant; 
strSQL :string;
begin
//首先創造物件,如果出現異常就做出提示
try
FWord := CreateOleObject('Word.Application');
//WOrd程式的執行是否可見,值為false時,程式在後臺執行。
FWord.Visible := True;
except
messagebox(0,'建立word物件失敗!','警告',MB_OK+MB_ICONINFORMATION);
exit;
end;

//現在開啟的Word中,建立一個新的頁面,然後在其中鍵入需要的內容
try
FDOC :=FWord.Documents.Add;
{對於Word的新頁面}
FWord.Selection.Font.Name :='宋體';
FWord.Selection.Font.Size :=20; 
FWord.Selection.Font.Bold :=2; 
FWord.Selection.paragraphs.Alignment := wdAlignParagraphCenter;
FWord.Selection.TypeText(' 新夏旅遊減肥 ');
FWord.Selection.Typeparagraph;//換行
FWord.Selection.Typeparagraph;//換行
FWord.Selection.paragraphs.Alignment := wdAlignParagraphLeft;
FWord.Selection.Font.Size :=10;
FWord.Selection.Font.Bold :=0;
FWord.Selection.TypeText(' 現將我社組團部的');
FWord.Selection.TypeText(' 新夏旅遊減肥 ');
FWord.Selection.TypeText('團計劃發出,各地請按下列行程做接待,並及早落實'+
'團隊計劃和選派優秀導遊員。各地代訂住宿、火車票、機票務必安排好接待,日程'+ 
'如有變更,及時與下站接待社或本社聯絡,各地接團時請舉【xxxx歡迎你】接站牌。');
FWord.Selection.Typeparagraph;//換行
FWord.Selection.Typeparagraph;//換行
FWord.Selection.TypeText('請速回傳真確認,謝謝合作!');
FWord.Selection.Typeparagraph;//換行
FWord.Selection.Typeparagraph;//換行

FWord.Selection.TypeText('人數:'); 
FWord.Selection.TypeText('0');
FWord.Selection.TypeText('國籍:'); 
FWord.Selection.TypeText('I DO NOT KNOW');
FWord.Selection.TypeText('等級:'); 
FWord.Selection.TypeText('8星級');
FWord.Selection.Typeparagraph;//換行 
FWord.Selection.TypeText('這裡是團隊安排');
FWord.Selection.Typeparagraph;//換行
FWord.Selection.TypeText('早上:起床 然後 餓一頓--->減肥');
FWord.Selection.Typeparagraph;//換行
FWord.Selection.TypeText('中午:運動完畢 然後 餓一頓--->減肥');
FWord.Selection.Typeparagraph;//換行
FWord.Selection.TypeText('晚上:自己搭車回家 然後 請 餓一頓--->未餓死的減肥成功!');
FWord.Selection.Typeparagraph;//換行 
FWord.Selection.TypeText('TO: ');
FWord.Selection.TypeText('12345678901234567890'); 
FWord.Selection.Typeparagraph;//換行 
FWord.Selection.TypeText('TEL: '); 
FWord.Selection.TypeText('12345678901234567890'); 
FWord.Selection.Typeparagraph;//換行
FWord.Selection.TypeText('FAX: ');
FWord.Selection.TypeText('12345678901234567890'); 
FWord.Selection.Typeparagraph;//換行 
FWord.Selection.Typeparagraph;//換行 
FWord.Selection.TypeText('______________________________________________');
FWord.Selection.Typeparagraph;//換行 
FWord.Selection.Typeparagraph;//換行 
FWord.Selection.TypeText('FROM: '); 
FWord.Selection.TypeText('中國XXXX地');
FWord.Selection.Typeparagraph;//換行 
FWord.Selection.TypeText('TEL: '); 
FWord.Selection.TypeText('久動久動久不動');
FWord.Selection.Typeparagraph;//換行 
FWord.Selection.TypeText('FAX: ');
FWord.Selection.TypeText('你猜你猜你猜猜猜');
FWord.Selection.Typeparagraph;//換行

Except 
on e: Exception do 
Messagebox(0,Pchar(e.Message),'警告',MB_OK+MB_ICONINFORMATION); 
end; 
//儲存文件 
FWord.Caption := '組團計劃儲存在: '+ExtractFilePath(application.ExeName)+'Reports\GroupPlan.doc'; 
FDOC.SaveAS('d:\GroupPlan.doc');
if messagebox(0,'組團計劃已經儲存成功!'+chr(13)+chr(13)+
'單擊【確定】退出Word,返回到程式中!','您確信要退出Word嗎?', 
MB_YESNO+MB_ICONINFORMATION+MB_DEFBUTTON2)=IDYES then 
begin
FWord.Quit; 
FWord := Unassigned; 
end;

//重新整理ole顯示
OleContainer1.CreateObjectFromFile('d:\GroupPlan.doc',false);
OleContainer1.DoVerb(ovShow);
form1.Height:=form1.Height+30;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  APPLICATION.Terminate;
end;

end.

相關文章