文章轉自:https://blog.csdn.net/iko2008/article/details/5342464
OLE自動化是不同應用程序之間進行通訊的一個標準。OLE自動化的工作方式是:通訊被動方(OLE服務器)應用程序向通訊主動方(OLE客戶機)應用程序提供一個以上可供其調用的OLE自動化對象類型,OLE客戶機通過引用這些對象實現對OLE服務器的調用,然後通過設置對象的屬性和使用對象的方法操縱OLE服務器應用程序,完成兩者之間的通訊。
Powerbuilder7.0
在POWERBUILDER7.0代碼中調用OLE服務器的方法如下:
(1) 聲明一個對象變量:
OLEObject wordapp
(2)使用Create語句創建該對象,其語法如下:
wordApp = Create OLEObject
(3)根據自己使用OLE服務器的對象類型,利用ConnectToNewObject(string aparam)函數建立連接,根據返回參數判斷OLE服務器連接是否成功,參數aparam表示所連接的服務器類型,對於office2000套件中的應用程序提供如下幾種常用的服務器標識:
"Word.Application"
"Word.Document"
"Excel.Application"
"Excel.Worksheet"
對於word分兩種,一種是創建面向應用程序的服務器對象"Word.Application",另一個是創建單個文檔的服務器對象"Word.Document",二者的區別在於使用的範圍不同,本文我們創建面向應用程序的服務器對象,代碼實現如下:
int ret
// 連接" word.application "服務器,同時判斷連接是否成功
ret = wordApp.ConnectToNewObject( "word.application" )
if ret < 0 then
MessageBox("信息提示","你的WORD無法正常運行,請重新安裝!")
return
end if
(4)通過設置對象的屬性和使用對象的方法,實現對OLE服務器的操縱。
對象類型採用Word宏語言WordBasic的大多數語句和函數作爲它的方法。也就是說,一旦在POWERBUILDER7.0中創建了一個Word服務器對象,就可以通過該對象使用大多數WordBasic語句或函數,從而可以近乎完美地操縱Word或Word文檔。例 如,下列語句在POWERBUILDER7.0代碼中使用WordBasic的FileNewDefault語句創建一個Word新文檔:
wordApp.Application.FileNewDefault(file_name)
(5)調用結束後,使用關鍵字的destroy,釋放該變量佔用的資源。如:
destroy wordapp
實例
本例將使用POWERBUILDER7.0編寫一個簡單的數據庫應用程序。該程序從數據庫中取出數據,然後通過OLE自動化將這些數據輸入至Word,並按照Word的排版格式編排成一個表格。例中使用的數據庫是POWERBUILDER7.0自含的EAS Demo DB V3.db數據庫,數據檢索結果取自examples數據表。本例稍加改動,即可作爲數據庫應用程序的報表生成功能模塊使用。
首先,創建一個名爲pbtoword的應用,在該應用中的open事件中添加數據庫連接代碼如下:
SQLCA.DBMS = "ODBC"
SQLCA.Database = "EAS Demo DB V3"
SQLCA.AutoCommit = False
SQLCA.DBParm = "ConnectString='DSN=EAS Demo DB V3;UID=dba;PWD=sql'"
connect;
創建窗口w_main,設置其標題title 屬性爲“word_OLE自動化演示程序”。然後在該窗體中加入三個控件:數據窗口dw_1,“開始數據填寫”按鈕cb_start,“程序結束”按鈕cb_end並設置有關屬性,完成上述工作後,點擊窗口預覽運行菜單,屏幕布局應如下圖示。
接着需要編寫POWERBUILDER7.0代碼來實現與Word的連接。本實例的代碼清單如下(注:代碼中wordapp使用得語句WordBasic宏語言的語句,這些語句的使用方法請參閱WordBasic宏語言有關資料,或直接再word中查看visual basic編輯環境中的對象瀏覽器):
(1)在w_main的open事件中加入數據窗口的數據連接代碼:
dw_1.settransobject(sqlca)
dw_1.retrieve()
(2)命令按鈕 cb_start 鼠標單擊事件代碼,該事件使用WordBasic宏語言在Word2000中製作一個表格,並將當前數據數據窗口中的數據依次插入表格單元。
constant integer ppLayoutBlank = 12
OLEObject wordapp
wordapp = CREATE OLEObject
int ret
// 連接" word.application "服務器,同時判斷連接是否成功
ret = wordApp.ConnectToNewObject( "word.application" )
if ret < 0 then
MessageBox("信息提示","你的WORD無法正常運行,請重新安裝!")
return
end if
word.application.ScreenUpdating()
wordapp.Visible = True //使得word2000的使用過程可見
long ll_colnum,ll_rownum
constant long wdWord9TableBehavior = 1
constant long wdAutoFitFixed = 0
constant long wdCell = 12
string ls_value
//得到數據窗口數據的列數與行數(行數應該是數據行數 + 1)
ll_colnum = Long(dw_1.object.datawindow.column.count)
ll_rownum = dw_1.rowcount() + 1
wordapp.Documents.Add("C:/WINDOWS/Application Data/Microsoft/Templates/Normal.dot",False,0)
wordapp.ActiveDocument.Tables.Add(wordapp.Selection.Range, ll_rownum, ll_colnum,wdWord9TableBehavior,wdAutoFitFixed)
string ls_colname
integer i,j
for i = 1 to ll_colnum
//得到標題頭的名字
ls_colname = dw_1.describe('#' + string(i) + ".name") + "_t"
ls_value = dw_1.describe(ls_colname + ".text")
wordapp.Selection.TypeText(trim(ls_value))
wordapp.Selection.MoveRight(wdCell)
next
dw_1.setredraw(false)
wordapp.Selection.MoveLeft(wdCell)
for i = 2 to ll_rownum
for j = 1 to ll_colnum
dw_1.scrolltorow(i - 1)
dw_1.setcolumn(j)
ls_value = dw_1.gettext()
wordapp.Selection.MoveRight(wdCell)
wordapp.Selection.TypeText(ls_value)
next
next
dw_1.setredraw(true)
constant long wdFormatDocument = 0
//保存新建的文檔
wordapp.ActiveDocument.SaveAs("sample.doc", 0,False,"",True,"",False,False,False, False,False)
//打印該word文檔
wordApp.Application.printout()
//斷開OLE連接,釋放wordapp對象
destroy wordapp
(3)命令按鈕 cb_end 鼠標單擊事件代碼
close(parent)
幾點說明
①在本程序運行之前,Word2000必須已經成功安裝,否則系統將產生一個POWERBUILDER7.0可捕獲的錯誤。讀者可以在代碼中加入錯誤處理代碼以處理這些錯誤。
②若本程序運行時Word尚未運行,OLE自動化將試圖啓動它。因此程序代碼中不必包括一條分開的指令來啓動Word。若Word是由POWERBUILDER7.0應用程序啓動的,那麼程序結束時Word2000將自動關閉;否則,Word將繼續運行。
③本實例使用的大部分WordBasic語句都與Word2000文檔的插入點有關,如果在本程序運行過程中人爲地移動了插入點,則有可能導致表格的混亂和錯誤。爲了避免這種情況發生,本程序在執行插入操作之前使用ScreenUpdating語句將Word屏幕更新關閉,使用戶在執行插入操作時不能移動插入點。
從上述實例可以看到,通過OLE自動化,使我們在開發新的應用程序時可以“借用”現成的應用程序的部分或全部功能,從而大大地減輕開發的工作量,縮短開發週期,使開發工作事半功倍。這就是OLE自動化帶給開發人員的好處。