
- 類型:編程工具大。1.43G語(yǔ)言:中文 評(píng)分:6.7
- 標(biāo)簽:
進(jìn)行MS office自動(dòng)化開(kāi)發(fā)最好的工具或許是VBA,但是很多時(shí)候我們的應(yīng)用系統(tǒng)往往和MS office的文件打交道,比如生成word文件和EXCEL報(bào)表等等,因此學(xué)習(xí)一下主流的開(kāi)發(fā)工具關(guān)于MS office自動(dòng)化的知識(shí)還是很有必要的。從今天起,我將推出一些基于VS 2005環(huán)境的MS office自動(dòng)化開(kāi)發(fā)的一些入門(mén)文章。第一篇是關(guān)于熟悉開(kāi)發(fā)環(huán)境。
這次我使用的是VS C++ 2005。經(jīng)過(guò)一番折騰,我感覺(jué)VS C++ 2005對(duì)MS office自動(dòng)化開(kāi)發(fā)的支持還比不上VC 6.0。我這么說(shuō)是有根據(jù)的,因?yàn)榛赩C 6.0和基于VS 2005環(huán)境的MS office自動(dòng)化開(kāi)發(fā)我都做過(guò)。在VC 6.0,你只需要找到TpyeLib那個(gè)dll文件(或tlb文件、olb文件),選擇你要用的類,然后VC 6.0為你自動(dòng)生成.h文件和.cpp文件,這樣你就可以直接使用其中定義的類了。
我原以為VS C++ 2005會(huì)沿用VC 6.0的做法。但我發(fā)現(xiàn)VS C++ 2005采用了新的做飯,這也倒沒(méi)什么,問(wèn)題嚴(yán)重的是這種新的方式居然對(duì)MS office自動(dòng)化開(kāi)發(fā)支持比較的糟糕(Word操作部分)。
進(jìn)行MS office自動(dòng)化開(kāi)發(fā),做法基本都是選擇MS office的組件,然后導(dǎo)出你要使用的接口類,這在VC 6.0和VS C++ 2005都是一樣。下面我以一個(gè)簡(jiǎn)單例子說(shuō)明一下VS C++ 2005的具體做法,對(duì)應(yīng)的ms office版本是office 2003。
首先用VS 2005新建一個(gè)單文檔工程O(píng)wner,然后為工程添加一個(gè)類,選擇“TypeLib中的MFC類”,具體如下圖:
單擊“添加”按鈕后出現(xiàn)下圖,從下圖我們看出VS 2005比VC 6.0的一點(diǎn)進(jìn)步,這里多了一個(gè)導(dǎo)出來(lái)源:注冊(cè)表。注冊(cè)表的好處是名字直觀,否則比如選擇文件,你要操作word,你還要費(fèi)一番心思去搜索操作word的類到底藏在哪個(gè)dll文件或olb文件、或tlb文件之中呢?
基于顧名思義的原則,我們?cè)诳捎玫念愋蛶?kù)中選擇Micro Word 11.0 Object Library<8.3>。這時(shí)出現(xiàn)一大堆接口類,我們也不知道該用哪個(gè),干脆一古腦把它們?nèi)珜?dǎo)入進(jìn)來(lái),具體如下圖:
單擊“完成”按鈕后,你可以發(fā)現(xiàn)工程在一時(shí)之間出現(xiàn)了一大堆.h文件:CAddIn.h、CAddIns.h……你可能會(huì)疑惑,對(duì)應(yīng)的cpp文件呢?對(duì)不起,VS 2005并沒(méi)有為你生成。這時(shí)你或許感受到VS 2005和VC 6.0在office自動(dòng)化開(kāi)發(fā)的一點(diǎn)區(qū)別了吧。
既然一夜之間來(lái)了那么多新丁,先編譯一下吧,OK,編譯通過(guò),這時(shí)你會(huì)說(shuō):VS 2005和VC 6.0的做法也不過(guò)大同小異罷了。先別那么早下結(jié)論,開(kāi)始編碼:
CApplication app;
先編譯一下,這時(shí)出現(xiàn)了一些你想象不到的編譯錯(cuò)誤:
1>f:\mytest\mytest\src\intdir\debug\owner\msword.tlh(1073) : error C2786: “BOOL (__stdcall *)(HDC,int,int,int,int)”: __uuidof 的操作數(shù)無(wú)效
1>f:\mytest\mytest\src\intdir\debug\owner\msword.tlh(1073) : error C2923: “_com_IIID”:“Rectangle”不是參數(shù)“_Interface”的有效模板類型變量
1> c:\program files\microsoft visual studio 8\vc\platformsdk\include\wingdi.h(3514) : 參見(jiàn)“Rectangle”的聲明
1>f:\mytest\mytest\src\intdir\debug\owner\msword.tlh(1073) : error C3203: “_com_IIID”: 未專用化的類模板不能用作模板變量,該變量屬于模板參數(shù)“_IIID”,應(yīng)為real 類型
1>f:\mytest\mytest\src\intdir\debug\owner\msword.tlh(7113) : warning C4003: “ExitWindows”宏的實(shí)參不足
1>f:\mytest\mytest\src\intdir\debug\owner\msword.tlh(7113) : error C2059: 語(yǔ)法錯(cuò)誤: “常量”
1>f:\mytest\mytest\src\intdir\debug\owner\msword.tlh(13448) : error C2146: 語(yǔ)法錯(cuò)誤: 缺少“;”(在標(biāo)識(shí)符“Fonts”的前面)
1> f:\mytest\mytest\src\intdir\debug\owner\msword.tlh(13448) : error C4430: 缺少類型說(shuō)明符- 假定為int。注意: C++ 不支持默認(rèn)int
這時(shí)你可能會(huì)大呼:My God!這是怎么回事?抱歉,我也不知道為什么會(huì)出現(xiàn)這種問(wèn)題。我初步估計(jì)為VS C++ 2005對(duì)MSWORD.olb這個(gè)組件支持得并不好,對(duì)其它一些組件可以支持。在這里我提供一個(gè)解決方案。在CApplication.h中將系統(tǒng)自動(dòng)生成的:
注釋掉。然后添加如下代碼:
#import "c:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.olb"
#import "c:\Program Files\Microsoft Office\Office11\MSWORD.olb" \
rename("ExitWindows","_ExitWindows")
#import "c:\Program Files\Microsoft Office\Office11\EXCEL.exe" \
rename("DialogBox","_DialogBox") \
rename("RGB","_RGB") \
exclude("IFont","IPicture")
這樣做之后再選擇“重新生成”重新編譯整個(gè)工程就可以順利使用CApplication類了(注意是重新生成),盡管還有一些警告。
另外在每次編譯時(shí)不時(shí)出現(xiàn)下面這個(gè)討厭的對(duì)話框:
我還沒(méi)找到辦法去掉這個(gè)對(duì)話框。