轉自:http://www.vckbase.com/document/viewdoc/?id=1174
使用VC編程來操縱Office。你可以實現諸如:Word檔案列印、傳送資料到Word文檔、發送E-MAIL、自動產生表格、Excel資料統計、圓餅圖,長條圖顯示、自動報表產生、播放幻燈、doc,txt,HTML,rtf檔案轉換、中文簡繁體轉換、拼音或筆畫排序......只要是Office能夠實現的功能,都可以在你寫的程式中調用。仔細閱讀下面的說明,並下載源檔案進行參考,你就可以一步一步地掌握這個技術。祝朋友們學習快樂。
一、概念
Microsoft 的 Office 產品中,都提供了OLE Automation 自動化程式的介面。如果你使用VB,VBA 和 Script 指令碼調用 Office 功能的話,其實比使用 VC 調用要簡單的多。比如在 WORD 中,調出菜單“工具(T)/宏(M)/錄製新宏(R)”,這時候它開始記錄你在 WORD 中任何菜單和鍵盤的操作,把你的操作過程儲存起來,以便再次重複調用。而儲存這些操作的記錄,其實就是使用了 VBA 程式(Visual Basic for Application)。而我們下面要實現的功能,也同樣要參考 VBA 的方法。
二、結構層次
為了更有邏輯,更有層次地操作 Office,Microsoft 把應用(Application)按邏輯功能劃分為如下的樹形結構
Application(WORD 為例,只列出一部分)
Documents(所有的文檔)
Document(一個文檔)
......
Templates(所有模板)
Template(一個模板)
......
Windows(所有視窗)
Window
Selection
View
Selection(編輯對象)
Font
Style
Range
......
......
只有瞭解了邏輯層次,我們才能正確的操縱 Office。舉例來講,如果給出一個VBScript語句是:
application.ActiveDocument.SaveAs "c:/abc.doc"
那麼,我們就知道了,這個操作的過程是:第一步,取得Application;第二步,從Application中取得ActiveDocument;第三步,調用 Document 的函數 SaveAs,參數是一個字串型的檔案名稱。
三、基本步驟
(1)建立(或開啟已有的)一個 MFC 的程式工程
(2)Ctrl+W 執行 ClassWizard(本文按照 VC6 操作,例子程式也是在VC6 下編寫測試的)
(3)Add Class.../From a type Library... 在 Office 目錄中,找到你想使用的類型庫。(我使用的是 Office2000,其Word 的類型庫檔案,儲存在 C:/Program Files/Microsoft Office/Office/MSWORD9.OLB)根據你 Office 的版本,可以使用下表列出的類型庫檔案
Office 版本和類型 |
類型庫檔案 |
Office 版本和類型 |
類型庫檔案 |
Access 97 |
Msacc8.olb |
PowerPoint 2000 |
Msppt9.olb |
Jet Database |
3.5 DAO350.dll |
Word 2000 |
Msword9.olb |
Binder 97 |
Msbdr8.olb |
Access 2002 |
Msacc.olb |
Excel 97 |
Excel8.olb |
Excel 2002 |
Excel.exe |
Graph 97 |
Graph8.olb |
Graph 2002 |
Graph.exe |
Office 97 |
Mso97.dll |
Office 2002 |
MSO.dll |
Outlook 97 |
Msoutl97.olb |
Outlook 2002 |
MSOutl.olb |
PowerPoint 97 |
Msppt8.olb |
PowerPoint 2002 |
MSPpt.olb |
Word 97 |
Msword8.olb |
Word 2002 |
MSWord.olb |
Access 2000 |
Msacc9.olb |
Office Access 2003 |
Msacc.olb |
Jet Database 3.51 |
DAO360.dll |
Office Excel 2003 |
Excel.exe |
Binder 2000 |
Msbdr9.olb |
Graph 2003 |
Graph.exe |
Excel 2000 |
Excel9.olb |
Office 2003 |
MSO.dll |
Graph 2000 |
Graph9.olb |
Office Outlook 2003 |
MSOutl.olb |
Office 2000 |
Mso9.dll |
Office PowerPoint 2003 |
MSPpt.olb |
Outlook 2000 |
Msoutl9.olb |
Office Word 2003 |
MSWord.olb |
(4)選擇類型庫檔案後,在彈出的對話窗中繼續選擇要添加的類。具體選擇什麼類,要看你將來在程式中打算調用什麼功能。當然,你也可以不用考慮這麼多,用滑鼠和Shift鍵配合,全部選擇也可以。
(5)初始化COM。方法一,找到App的InitInstance()函數,在其中添加 AfxOleInit()函數的調用;方法二,在需要調用COM功能的地方 CoInitialize(NULL),調用完畢後 CoUninitialize()。
(6)在你需要調用 Office 功能函數的 cpp 檔案中
#include <atlbase.h> // 為了方便操作 VARIANT 類型變數,使用 CComVariant 模板類
#include "標頭檔.h" // 具體的標頭檔名,是由裝載類型庫的檔案名稱決定的。(滑鼠雙點封裝類的檔案,就可以看到)
// 比如使用 msword9.olb類型庫,那麼標頭檔是 msword9.h
(7)好了,現在開始寫程式吧。另外要說明的是,步驟3和4,其實也可以使用 #import 方式引入類型庫。
四、實現技巧
在書寫調用 Office 函數的過程中,最困難的是確定函數的參數,一般情況下,參數都是 VARIANT 類型的變數指標。那麼到底具體我們應該怎麼寫那?推薦兩個方法,其一是閱讀有關 VBA 的書籍;其二,是使用 Office 中內建的“宏”功能。強烈推薦大家使用第二個方法,把你要完成的功能,在 Office 的作業環境中,用宏錄製下來,然後觀察分析錄製後的函數和參數,就可以在 VC 中使用了。舉一個例子:
ActiveDocument.SaveAs FileName:="Hello.doc", FileFormat:=wdFormatDocument _ , LockComments:=False, Password:="", AddToRecentFiles:=True, _ WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _ SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _ False
以上是在 Word 中錄製的一個儲存檔案的宏,而在 VC 中對應的函數原型為
void _Document::SaveAs(VARIANT* FileName, VARIANT* FileFormat, VARIANT* LockComments, VARIANT* Password, VARIANT* AddToRecentFiles, VARIANT* WritePassword, VARIANT* ReadOnlyRecommended, VARIANT* EmbedTrueTypeFonts, VARIANT* SaveNativePictureFormat, VARIANT* SaveFormsData, VARIANT* SaveAsAOCELetter)
分析對照後,我們就能看出,參數 FileName 是字串 VARIANT(VT_BSTR),參數 LockComments 是布爾VARIANT(VT_BOOL),等等。參數 FileFormat := wdFormatDocument 是什麼類型那?其實這是一個表示儲存的時候指定檔案類型的常量,而且顯然是 DWORD 類型VARIANT(VT_I4)。那麼常量的數值又是多少那?很簡單,寫一個宏,調用函數 MsgBox 顯示一下不就都知道啦?!
五、步步為營
特別提示一:編譯執行前,一定要先關閉 KV 即時監視病毒的功能(KV 的程式會干擾我們的調用,瑞星的則沒關係)。
特別提示二:在例子程式中,為了表現程式的關鍵區段,沒有或很少使用了條件判斷。為了實現你程式的健壯性,請自己加上條件判斷和異常處理。
Step1:如何啟動和關閉 WORD,及 VARIANT 的最基本的使用方法
Step2:和 Step1 同樣功能,用 CComVariant 改進了 VARIANT 的使用方式
Step3:在 Step2 的基礎上,建立一個 WORD 文檔,並從程式中傳送一些字元到 WORD
Step4:在 Step3 的基礎上,儲存 WORD 文檔
Step5:一個小應用舉例,把輸入的漢字按照“筆畫”排序
Step6:一個小應用舉例,盜竊正在使用的 WORD 文檔
以上這6個小程式中,都有詳細的注釋。大家閱讀後慢慢體會並實驗,你就可以自由地操縱任何一個 Office 啦。
六、參考:Microsoft Office Development with Visual Studio