天天看點

Office插件程式設計[轉]

基于VS 2005環境的MS office自動化開發之熟悉環境篇

出處:Clever101 作者:佚名 日期:2010-4-3 23:50:24 [大 中 小] 評論: 0 | 我要發表看法

 進行MS office自動化開發最好的工具或許是VBA,但是很多時候我們的應用系統往往和MS office的檔案打交道,比如生成word檔案和EXCEL報表等等,是以學習一下主流的開發工具關于MS office自動化的知識還是很有必要的。從今天起,我将推出一些基于VS 2005環境的MS office自動化開發的一些入門文章。第一篇是關于熟悉開發環境。

      這次我使用的是VS C++ 2005。經過一番折騰,我感覺VS C++ 2005對MS office自動化開發的支援還比不上VC 6.0。我這麼說是有根據的,因為基于VC 6.0和基于VS 2005環境的MS office自動化開發我都做過。在VC 6.0,你隻需要找到TpyeLib那個dll檔案(或tlb檔案、olb檔案),選擇你要用的類,然後VC 6.0為你自動生成.h檔案和.cpp檔案,這樣你就可以直接使用其中定義的類了。

        我原以為VS C++ 2005會沿用VC 6.0的做法。但我發現VS C++ 2005采用了新的做飯,這也倒沒什麼,問題嚴重的是這種新的方式居然對MS office自動化開發支援比較的糟糕(Word操作部分)。

       進行MS office自動化開發,做法基本都是選擇MS office的元件,然後導出你要使用的接口類,這在VC 6.0和VS C++ 2005都是一樣。下面我以一個簡單例子說明一下VS C++ 2005的具體做法,對應的ms office版本是office 2003。

      首先用VS 2005建立一個單文檔工程Owner,然後為工程添加一個類,選擇“TypeLib中的MFC類”,具體如下圖:

Office插件程式設計[轉]

單擊“添加”按鈕後出現下圖,從下圖我們看出VS 2005比VC 6.0的一點進步,這裡多了一個導出來源:系統資料庫。系統資料庫的好處是名字直覺,否則比如選擇檔案,你要操作word,你還要費一番心思去搜尋操作word的類到底藏在哪個dll檔案或olb檔案、或tlb檔案之中呢?

      基于顧名思義的原則,我們在可用的類型庫中選擇Micro Word 11.0 Object Library<8.3>。這時出現一大堆接口類,我們也不知道該用哪個,幹脆一古腦把它們全導入進來,具體如下圖:

Office插件程式設計[轉]

    單擊“完成”按鈕後,你可以發現工程在一時之間出現了一大堆.h檔案:CAddIn.h、CAddIns.h……你可能會疑惑,對應的cpp檔案呢?對不起,VS 2005并沒有為你生成。這時你或許感受到VS 2005和VC 6.0在office自動化開發的一點差別了吧。

 既然一夜之間來了那麼多新丁,先編譯一下吧,OK,編譯通過,這時你會說:VS 2005和VC 6.0的做法也不過大同小異罷了。先别那麼早下結論,開始編碼:

#include "CApplication.h"

CApplication app;

 先編譯一下,這時出現了一些你想象不到的編譯錯誤:

 1>f:\mytest\mytest\src\intdir\debug\owner\msword.tlh(1073) : error C2786: “BOOL (__stdcall *)(HDC,int,int,int,int)”: __uuidof 的操作數無效

1>f:\mytest\mytest\src\intdir\debug\owner\msword.tlh(1073) : error C2923: “_com_IIID”:“Rectangle”不是參數“_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”: 未專用化的類模闆不能用作模闆變量,該變量屬于模闆參數“_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!這是怎麼回事?抱歉,我也不知道為什麼會出現這種問題。我初步估計為VS C++ 2005對MSWORD.olb這個元件支援得并不好,對其它一些元件可以支援。在這裡我提供一個解決方案。在CApplication.h中将系統自動生成的:

#import "C:\\Program Files\\Microsoft Office\\OFFICE11\\MSWORD.OLB" no_namespace

注釋掉。然後添加如下代碼:

#import "C:\Program Files\Common Files\Microsoft Shared\Office11\MSO.DLL"

#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類了(注意是重新生成),盡管還有一些警告。

上一篇: Axure中繼器

繼續閱讀