用Delphi4.0直接控制Word97
編號: QA003053
建立日期: 2000年6月15日最後修改日期: 2000年6月15日
所屬類別:
文章:
摘要:玩過PowerBuilder的朋友一定知道,PB中最重要的技術就是它的DataWindow技術,用它來設計表單、處理資料輸入、設計報表十分方便。然而Delphi的報表支援功能遠不及PB。 Delphi的專業版中包含了QuickReport,不過它是集合由QSD AS(一家挪威公司)授權的報表元件。當然,我們也可以使用外部報表工具,例如ReportSmith或Cristal Report。不過控制稍嫌複雜,並且它們與Delphi之間缺乏集成性。
我們在開發《公文管理系統》網路版時,在實現公文印刷時,嘗試過不同的方法來實現。我們的要求是將一篇普通公文以公文格式列印出來,而使用者能對其進行排版進行一些簡單的控制。小輝剛開始是用的QuickReport來試的,效果很不盡人意,特別是對一些中文格式的支持方面;後來小輝一不作二不休,乾脆自己手工編寫打印程序,不依賴設計工具,只可惜小輝技術不到家,寫到一半就玩不下去了,只好另找出路。正好那天來了份《中國計算機報》,上面有一篇介紹如何在VB中使用Excel的文章。小輝一想:何不用Delphi將資料傳送到Word,由Word來完成編輯排版工作呢?說穿了,就是用OLE自動化技術。
小輝一試,效果竟還可以。 ——雖然對於一個程式設計師來說,自己編的程式中要掛接一個別人的應用程式才能完全實現自己的功能,就像雞群裡插隻鴨,心裡總有點那個。但由於開發任務緊,主任又隔三隔四的來催,雖然最後有點不倫不類,小輝也顧不得那麼多了。好了,廢話少說,看看小輝是怎麼實現的吧——
連結:http://www.xiaohui.com
主持人:由於原始連結已經失效。我們在這裡提供原文:
一、前言
玩過PowerBuilder的朋友一定知道,PB中最重要的技術就是它的DataWindow技術,用它來設計表單、處理資料輸入、設計報表十分方便。然而Delphi的報表支援功能遠不及PB。 Delphi的專業版中包含了QuickReport,不過它是集合由QSD AS(一家挪威公司)授權的報表元件。當然,我們也可以使用外部報表工具,例如ReportSmith或Cristal Report。不過控制稍嫌複雜,並且它們與Delphi之間缺乏集成性。
我們在開發《公文管理系統》網路版時,在實現公文印刷時,嘗試過不同的方法來實現。我們的要求是將一篇普通公文以公文格式列印出來,而使用者能對其進行排版進行一些簡單的控制。小輝剛開始是用的QuickReport來試的,效果很不盡人意,特別是對一些中文格式的支持方面;後來小輝一不作二不休,乾脆自己手工編寫打印程序,不依賴設計工具,只可惜小輝技術不到家,寫到一半就玩不下去了,只好另找出路。正好那天來了份《中國計算機報》,上面有一篇介紹如何在VB中使用Excel的文章。小輝一想:何不用Delphi將資料傳送到Word,由Word來完成編輯排版工作呢?說穿了,就是用OLE自動化技術。
小輝一試,效果竟還可以。 ——雖然對於一個程式設計師來說,自己編的程式中要掛接一個別人的應用程式才能完全實現自己的功能,就像雞群裡插隻鴨,心裡總有點那個。但由於開發任務緊,主任又隔三隔四的來催,雖然最後有點不倫不類,小輝也顧不得那麼多了。好了,廢話少說,看看小輝是怎麼實現的吧——
二、窗體設計
說穿了其實很簡單。小輝在這裡做了一個簡單的範例程式:
1. 設定窗體Form1的Font.name為'宋體',Font.size為12;
2. 窗體上依序放置lable1-labe5五個tLable控件,其caption屬性分別為'文號'、'標題'、'收文單位'、'正文'、'發文單位'
3. 在窗體上依序放置tEdit、tEdit、tEdit、tMemo、tEdit五個編輯控件,其name屬性分別為:ED_WenHao、ED_BiaoTi、ED_ShouWenDanWei、ED_ZhenWen、ED_FaWenDanWei。
4. 在窗體上依序放置兩個tButton控件,其name屬性分別為Btn_PRintToWord、btn_Quit,Caption屬性分別為'打印'和'退出'。
窗體設計格式可參考本文末附圖。
三、程式碼設計
程式段如下圖所示:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,OleCtnrs,ComObj;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
ED_WenHao: TEdit;
ED_BiaoTi: TEdit;
ED_ShouWenDanWei: TEdit;
ED_ZhenWen: TMemo;
ED_FaWenDanWei: TEdit;
Btn_PrintToWord: TButton;
Btn_Quit: TButton;
procedure Btn_PrintToWordClick(Sender: TObject);
procedure Btn_QuitClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
//開始:資料傳送到word事件
procedure TForm1.Btn_PrintToWordClick(Sender: TObject);
vAR
VarWord: Variant;// 創作WORD時所用
begin
try
// 1. 建立OleObject,連接word97
VarWord:=CreateOleObject('word.basic');
// 2. 建立Word97的新文件
VarWord.FileNew;
// 3. 設定Word97的基本狀態
VarWord.ViewZoom75; //設定顯示比例為75%
VarWord.ViewPage; //改為頁面顯示方式
// 4. 將目前資料控制項上的資訊傳送至Word97
// 4.1 傳送文號數據
VarWord.CenterPara; //居中
Varword.font('宋體'); //設定字體
VarWord.FontSize(14); //設定字號
varword.insert(#13+#13+ ED_WenHao.Text+#13+#13+#13);
// 4.2 發送標題數據
VarWord.font('黑體');
VarWord.Fontsize(16);
VarWord.insert( ED_BiaoTi.text+#13);
// 4.3 傳送收文單位數據
VarWord.LeftPara; //左對齊
VarWord.Font('宋體');
VarWord.fontSize(14);
VarWord.Insert(#13+ ED_ShouWenDanWei.Text+':'+#13);
// 4.5 傳送正文數據
VarWord.fontSize(14);
VarWord.Insert( ED_ZhenWen.Text+#13);
// 4.6 發送發文單位數據
VarWord.RightPara; //右對齊
VarWord.fontSize(14);
VarWord.Insert( ED_FaWenDanWei.Text+#13);
// 5 最後設定
VarWord.StartOfdocument; //到文首
VarWord.AppMaxiMize; //設定視窗最大化
VarWord.AppShow; //顯示應用程式
except
showmessage('運行Microsoft Word 失敗!');
end; //end of try
end;
//end:資料傳送到word事件
//開始:視窗關閉事件
procedure TForm1.Btn_QuitClick(Sender: TObject);
begin
close;
end;
//End:視窗關閉事件
end.
// 這是主程式的尾部
四、附註
一、說明
1、因只是一個演示範例,故沒有與後台資料庫連接起來,實際操作可將對應的tEdit、tMemo控件用tDBEdit、tDBMemo控件所代替,增加tTable、tDataSource等控件,連接資料庫。
2、本示便沒有考慮如何進行大量列印
3、程式在Pwin97、Delphi 4.0專業版、中文Word97下通過。
4、由於Word有不同的版本,微軟在每種外語中轉換了一些OLE自動化接口,如果用其他版本的Word,本程式運行有可能出錯。
5、可以透過word97幫助中歸結的巨集指令來得到對應的驅動指令;亦或可在Word97下點選[工具]選單-點選[自訂]-點選[鍵盤]按鈕,可以檢視到Word97中分類別顯示的Word指令。
二、優點與缺點
1、透過OLE自動化技術,將公文的排版列印工作交給Word去完成,對最終用戶而言,控制較方便。
2、在Word97的若對資料進行了修改,則不能傳回呼叫它的主程序,反映到資料庫中。這是它的不便這處。
3、本例只是在特殊情況下的一種應用,若要列印大量資料標籤,製作表格,小輝覺得還是用報表靈活一些
文章來源:小輝程式設計師之路。