使用VC編程來(lái)操縱Office。你可以實(shí)現(xiàn)諸如:Word文件打印、傳送數(shù)據(jù)到Word文檔、發(fā)送E-MAIL、自動(dòng)產(chǎn)生表格、Excel數(shù)據(jù)統(tǒng)計(jì)、圓餅圖,直方圖顯示、自動(dòng)報(bào)表生成、播放幻燈、doc,txt,HTML,rtf文件轉(zhuǎn)換、中文簡(jiǎn)繁體轉(zhuǎn)換、拼音或筆畫(huà)排序......只要是Office能夠?qū)崿F(xiàn)的功能,都可以在你寫(xiě)的程序中調(diào)用。仔細(xì)閱讀下面的說(shuō)明,并下載源文件進(jìn)行參考,你就可以一步一步地掌握這個(gè)技術(shù)。祝朋友們學(xué)習(xí)快樂(lè)。
一、概念 Microsoft 的 Office 產(chǎn)品中,都提供了OLE Automation 自動(dòng)化程序的接口。如果你使用VB,VBA 和 Script 腳本調(diào)用 Office 功能的話(huà),其實(shí)比使用 VC 調(diào)用要簡(jiǎn)單的多。比如在 WORD 中,調(diào)出菜單“工具(T)\宏(M)\錄制新宏(R)”,這時(shí)候它開(kāi)始記錄你在 WORD 中任何菜單和鍵盤(pán)的操作,把你的操作過(guò)程保存起來(lái),以便再次重復(fù)調(diào)用。而保存這些操作的記錄,其實(shí)就是使用了 VBA 程序(Visual Basic for Application)。而我們下面要實(shí)現(xiàn)的功能,也同樣要參考 VBA 的方法。
二、結(jié)構(gòu)層次 為了更有邏輯,更有層次地操作 Office,Microsoft 把應(yīng)用(Application)按邏輯功能劃分為如下的樹(shù)形結(jié)構(gòu)
Application(WORD 為例,只列出一部分)
Documents(所有的文檔)
Document(一個(gè)文檔)
......
Templates(所有模板)
Template(一個(gè)模板)
......
Windows(所有窗口)
Window
Selection
View
Selection(編輯對(duì)象)
Font
Style
Range
......
......
只有了解了邏輯層次,我們才能正確的操縱 Office。舉例來(lái)講,如果給出一個(gè)VBScript語(yǔ)句是:
application.ActiveDocument.SaveAs "c:\abc.doc"
那么,我們就知道了,這個(gè)操作的過(guò)程是:第一步,取得Application;第二步,從Application中取得ActiveDocument;第三步,調(diào)用 Document 的函數(shù) SaveAs,參數(shù)是一個(gè)字符串型的文件名。
三、基本步驟
(1)創(chuàng)建(或打開(kāi)已有的)一個(gè) MFC 的程序工程
(2)Ctrl+W 執(zhí)行 ClassWizard(本文按照 VC6 操作,例子程序也是在VC6 下編寫(xiě)測(cè)試的)
(3)Add Class...\From a type Library... 在 Office 目錄中,找到你想使用的類(lèi)型庫(kù)。(我使用的是 Office2000,其Word 的類(lèi)型庫(kù)文件,保存在 C:\Program Files\Microsoft Office\Office\MSWORD9.OLB)根據(jù)你 Office 的版本,可以使用下表列出的類(lèi)型庫(kù)文件
Office 版本和類(lèi)型
|
類(lèi)型庫(kù)文件
|
Office 版本和類(lèi)型
|
類(lèi)型庫(kù)文件
|
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)選擇類(lèi)型庫(kù)文件后,在彈出的對(duì)話(huà)窗中繼續(xù)選擇要添加的類(lèi)。具體選擇什么類(lèi),要看你將來(lái)在程序中打算調(diào)用什么功能。當(dāng)然,你也可以不用考慮這么多,用鼠標(biāo)和Shift鍵配合,全部選擇也可以。
(5)初始化COM。方法一,找到App的InitInstance()函數(shù),在其中添加 AfxOleInit()函數(shù)的調(diào)用;方法二,在需要調(diào)用COM功能的地方 CoInitialize(NULL),調(diào)用完畢后 CoUninitialize()。
(6)在你需要調(diào)用 Office 功能函數(shù)的 cpp 文件中
#include <atlbase.h> // 為了方便操作 VARIANT 類(lèi)型變量,使用 CComVariant 模板類(lèi)
#include "頭文件.h" // 具體的頭文件名,是由裝載類(lèi)型庫(kù)的文件名決定的。(鼠標(biāo)雙點(diǎn)包裝類(lèi)的文件,就可以看到)
// 比如使用 msword9.olb類(lèi)型庫(kù),那么頭文件是 msword9.h
(7)好了,現(xiàn)在開(kāi)始寫(xiě)程序吧。另外要說(shuō)明的是,步驟3和4,其實(shí)也可以使用 #import 方式引入類(lèi)型庫(kù)。
四、實(shí)現(xiàn)技巧
在書(shū)寫(xiě)調(diào)用 Office 函數(shù)的過(guò)程中,最困難的是確定函數(shù)的參數(shù),一般情況下,參數(shù)都是 VARIANT 類(lèi)型的變量指針。那么到底具體我們應(yīng)該怎么寫(xiě)那?推薦兩個(gè)方法,其一是閱讀有關(guān) VBA 的書(shū)籍;其二,是使用 Office 中自帶的“宏”功能。強(qiáng)烈推薦大家使用第二個(gè)方法,把你要完成的功能,在 Office 的操作環(huán)境中,用宏錄制下來(lái),然后觀察分析錄制后的函數(shù)和參數(shù),就可以在 VC 中使用了。舉一個(gè)例子:
ActiveDocument.SaveAs FileName:="Hello.doc", FileFormat:=wdFormatDocument _
, LockComments:=False, Password:="", AddToRecentFiles:=True, _
WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _
SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _
False
以上是在 Word 中錄制的一個(gè)保存文件的宏,而在 VC 中對(duì)應(yīng)的函數(shù)原型為
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)
分析對(duì)照后,我們就能看出,參數(shù) FileName 是字符串 VARIANT(VT_BSTR),參數(shù) LockComments 是布爾VARIANT(VT_BOOL),等等。參數(shù) FileFormat := wdFormatDocument 是什么類(lèi)型那?其實(shí)這是一個(gè)表示保存的時(shí)候指定文件類(lèi)型的常量,而且顯然是 DWORD 類(lèi)型VARIANT(VT_I4)。那么常量的數(shù)值又是多少那?很簡(jiǎn)單,寫(xiě)一個(gè)宏,調(diào)用函數(shù) MsgBox 顯示一下不就都知道啦?!
五、步步為營(yíng) 特別提示一:編譯執(zhí)行前,一定要先關(guān)閉 KV 實(shí)時(shí)監(jiān)視病毒的功能(KV 的程序會(huì)干擾我們的調(diào)用,瑞星的則沒(méi)關(guān)系)。
特別提示二:在例子程序中,為了表現(xiàn)程序的關(guān)鍵部分,沒(méi)有或很少使用了條件判斷。為了實(shí)現(xiàn)你程序的健壯性,請(qǐng)自己加上條件判斷和異常處理。
Step1:如何啟動(dòng)和關(guān)閉 WORD,及 VARIANT 的最基本的使用方法
Step2:和 Step1 同樣功能,用 CComVariant 改進(jìn)了 VARIANT 的使用方式
Step3:在 Step2 的基礎(chǔ)上,新建一個(gè) WORD 文檔,并從程序中傳送一些字符到 WORD
Step4:在 Step3 的基礎(chǔ)上,保存 WORD 文檔
Step5:一個(gè)小應(yīng)用舉例,把輸入的漢字按照“筆畫(huà)”排序
Step6:一個(gè)小應(yīng)用舉例,盜竊正在使用的 WORD 文檔
以上這6個(gè)小程序中,都有詳細(xì)的注釋。大家閱讀后慢慢體會(huì)并實(shí)驗(yàn),你就可以自由地操縱任何一個(gè) Office 啦。