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