Ⅰ delphi控制word
用OLE技術,
在uses部分添加模塊,
然後,如下例子:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,ComObj;
type
TForm1 = class(TForm)
Button1: TButton;
procere Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procere TForm1.Button1Click(Sender: TObject);
var
wd,:OLEVariant;
begin
wd:=CreateOleObject('Word.Application');//建立WinWord對像
:=wd.Documents.Open('e:\a.doc'); //打開Word文檔
ShowMessage(String(wd.ActiveDocument.Name));//顯示打開的文檔名稱
//以下可以插入你自己的程序
.close;//關閉文檔
wd.Quit; //關閉程序
end;
end.
Ⅱ delphi中把查詢出來的數據導入word中
我將我的商用《旅行社管理系統》的 發團通知 部分奉獻給您,望對您有所幫助。
procere TFrmMain.N327Click(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;
strSQL :='select * From "B_T_Company_Infor"';
with dm.ClientDataSet_Temp do
begin
if Active then Active:=False;
CommandText:=strSQL;
Open;
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(dm.ClientDataSet_Temp.Fields[0].AsString);
FWord.Selection.Typeparagraph;//換行
FWord.Selection.Typeparagraph;
FWord.Selection.paragraphs.Alignment := wdAlignParagraphLeft;
FWord.Selection.Font.Size :=12;
FWord.Selection.Font.Bold :=0;
FWord.Selection.TypeText(' 現將我社組團部的');
FWord.Selection.TypeText(' ');
FWord.Selection.TypeText('團計劃發出,各地請按下列行程做接待,並及早落實'+
'團隊計劃和選派優秀導游員。各地代訂住宿、火車票、機票務必安排好接待,日程'+
'如有變更,及時與下站接待社或本社聯系,各地接團時請舉【'+
dm.ClientDataSet_Temp.Fields[0].AsString+'】接站牌。');
FWord.Selection.Typeparagraph;//換行
FWord.Selection.Typeparagraph;//換行
FWord.Selection.TypeText('請速回傳真確認,謝謝合作!');
FWord.Selection.Typeparagraph;//換行
FWord.Selection.Typeparagraph;//換行
FWord.Selection.TypeText('人數:');
FWord.Selection.TypeText('人數:');
FWord.Selection.TypeText('國籍:');
FWord.Selection.TypeText('國籍:');
FWord.Selection.TypeText('等級:');
FWord.Selection.TypeText('等級:');
FWord.Selection.Typeparagraph;//換行
FWord.Selection.TypeText('這里是團隊安排');
FWord.Selection.Typeparagraph;//換行
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(dm.ClientDataSet_Temp.Fields[0].AsString);
FWord.Selection.Typeparagraph;//換行
FWord.Selection.TypeText('TEL: ');
FWord.Selection.TypeText(dm.ClientDataSet_Temp.Fields[3].AsString);
FWord.Selection.Typeparagraph;//換行
FWord.Selection.TypeText('FAX: ');
FWord.Selection.TypeText(dm.ClientDataSet_Temp.Fields[4].AsString);
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(ExtractFilePath(application.ExeName)+'Reports\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;
end;
-----------------------------
Delphi與Word之間的融合技術(1)
一、VBA代碼含義
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中,利用Com技術編程
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能夠真正地進行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直接調用相應宏來達到目的。
五、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之間的融合技術(2)
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);
Delphi與Word之間的融合技術(3)
五、從資料庫讀取文件到本地硬碟和從本地硬碟讀取文件到資料庫
在資料庫上使用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函數,在裡面選擇相應消息進行處理。
法一,每次只能處理一條消息,而法二能夠同時處理多條消息。
對於法二,聲明如下:
procere 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:文檔切換,在文檔從自己修改的文稿和其他人修改的文稿之間切換產生事件,主要處理設置文檔許可權等