OLE Automation應用

'2001/10/02 酷小毅(永和)
大綱:
一、 從頭說起OLE Automation (套Word製作報表)image
二、 如何取得Word Automation所提供的服務
三、 如何控制Word新增表格
四、 如何將資料插入Word表格
五、 如何在同一份文件中複製相同的表格到下一頁
六、 完整範例程式列表


相信這是每一個程式設計師都有的經驗,辛辛苦苦寫完資料庫程式之後這些程式身邊還得伴隨著一個個漂亮至制式報表,老實說我還真沒什麼美感,要我在寫完程式之後還要去編排這些報表這實在是件辛苦的差事,若能透過Automation請Word幫我們製作報表可以減輕不少的負擔,再加上Word 所建立出來的Template Files可以Reuse,只要有Microsoft Word的機器即可開啟編輯,現在要找到沒有Word的機器我想也很難找到了,以前有前輩以Delphi為範例介紹,現在小弟我就以Visual Basic為範例介紹,二話不說,我們開始吧。
如何取得Word Automation所提供的服務
下圖為建立Word Automation Application所需的程式碼,小弟我以Visual Basic為範例介紹,二話不說,我們開始吧
如何取得Word Automation所提供的服務
下圖為建立Word Automation Application所需的程式碼,小弟我以CreateObject為範例介紹,當然你也可以使用VB最簡單的方式直接引用TypeLib方式,不過這樣此程式就只能固定的被使用在所勾選的特定Word版本,因為你如果直接勾選VB會將他所使用到該元件(Component)的相關 TypeLib一起Compile在執行檔中,無形中就寫死了,一般如果是特定元件的使用(如常常可能會修改,但不改介面)我會建議以原生物件的呼叫方式,不過當然這樣就享受VB整合是開發式環境 (List Properties Method)的好處了,以我的習慣會先引用,然後待開發完成之後再將所有宣告改成Object,改以CreateObject建立原生物件不彷提供給讀者做參考。在上面的程式碼也很簡單,我先以On Error Resume Next加以宣告,若建立Word發生錯誤則秀出建立Word發生錯誤訊息。
image
如何控制Word新增表格
1.          宣告共用邊數
下方我們在Module中宣告PublicWord Application以及整個程式會使用到的相關共用變數。

image
2.          新增一個文件及取得資料庫資料表列數
下方程式會先在目前createWord中建立一份新文件,第二行會設定文件預設的擁有者,ColCountRowCount分別會取得筆者SQL ServerTable的資料欄位數目與資料筆數作為我們要新增這個Word表格的依據。
image
3.          新增表格到Word
為了讓表格建立時是出現在文件的最上方,我們必須新取得文件上方的座標,讀者應該看出第一行的(Start:=0, End:=0)所代表的意義,接著下一行在這個Range中建立這個資料表大小的表格。
image
如何將資料插入Word表格
1.          插入資料到Word
要將資料插入Word非常的簡單,相信讀者一看就知道它會寫入目前ActiveDocument下的第一個TableCell(Row, Column)中,資料來源就看你如何變化了,也可以從文字檔中或是某程式的執行結果中,本文則是以資料庫中的資料表貼的資料上Word表格為範例,比較重要的地方是.Tables.Item(Index),若文件有多頁時可以決定要插入第幾頁的表格。
image
2.          如何使Word結束時不存檔
每當我們要關閉程式時Word總是會問你要不要存檔,解決方法如下,使用wdDoNotSaveChanges常數,也可寫成如第二行。
image
如何在同一份文件中複製相同的表格到下一頁
1.          如何選擇文件中的所有內容
要複製表格及文件的所有資料第一步當然要先選擇這個文件的所有內容,有一點要注意的是選擇前您必須只保留要複製的那一頁就好,一旦複製就是複製整個文件所有的內容,包括Word11種類型的文字。
image
2.          如何複製文件並建立相同的內容至下一頁
以前筆者曾經遇到一個問題,User需要列印一整串的資料,如財務報表,它可能需要一次印一月到十二月的資料,剛好又是每月一個頁面,而每個頁面的表格又相同,而User又想一次貼完所有一到十二月資料以便預覽時能在一份文件中預覽十二個頁面的資料,這時我們就必須能夠動態的在這個Word 範本檔中新增User所需的頁面資料,可能是一到五月或三到七月等等….因為我們絕不可能在一個範本檔中一開始就儲存固定的頁面,這樣未免太沒有彈性了,筆者用底下的方法解決這個問題,不過在貼上實際得先複製,因為範本檔一開始只會有一頁。
(1).如何將游標移至文件的最底端
image
(2). 取的目前文件的總頁數
當我們複製完第一頁的資料之後就必須進行資料的處理,得知User的資料共有多少個月份(多少個頁面),以便貼上相同的表格至該頁面,而再做這些處理時有時我們必須知道目前文件中一共有多少頁,下面為取的的方法。
image
(3). 如何判斷Word是否增加新頁
在我們貼上新頁之前必須使Word增加一個新頁,底下筆者提供兩種做法,第一種做法會將游標移至底端並判斷頁數是否加一,若加一則貼上文件內容,你可以跑回圈計算頁數動態產生,讀者應看出他利用目前Tables.Item(index)下的Application物件的Selection下的TypeParagraph方法,執行這個方法就像在Word中直接按下Enter鍵件一般,Selection物件則是Word文件提供的集合物件,此物件功能非常多,在文件上的文字選取範圍段落或設定都可以利用這個物件來完成,有興趣了解這個物件可在WordVBAOnLineHelp有非常詳細的說明這邊就不深入討論,不過筆者認為利用Enter鍵換頁這其實並不是很好的做法,筆者在提另一種做法給各位參考,程式碼比較短,效能也比較快。
image
讀者發現第二種做法程式碼只要四行就完成了,利用選取物件Paragraphs物件設定新增的一個Range(新增一個空白選取範圍),接著一樣將游標指向文件的最頂端,把剛才Copy到剪貼簿的表格資料貼上去就算成功複製一個新頁面而擁有相同的表格了。
image
(4). 設為預覽列印模式
要列印當然要能夠自動設為預覽列印模式User才能夠看的清楚它所要印的文件內容,方法如下。
image
(5). 設定預覽時顯示的比例
Word的預設的預覽列印可能會讓User看不清楚字,所以當然要設定一下預覽的比例。
image
3.          範例程式執行畫面
下圖為範例程式的執行畫面,所使用的資料表共有四個欄位(ID_NO, NAME, ADDRESS, EMAIL)
image
4.          Create TABLE SQL語法
由於本文中Word表格中的資料來源是Microsoft SQL Server,下面提供建立所使用TableSQL Command
image
5.          Form完整範例程式列表
image
 image
6.          Module完整程式列表
image

留言

這個網誌中的熱門文章

軟體工程師 - 成長的 10 個階段

常見的程式碼壞味道(Code Smell or Bad Smell)

什麼是 gRPC ?