在 Visual C++ 6.0 中整合 Microsoft Office 應用程式,最常見的方式是使用 COM 自動化。透過 #import 指令匯入型別程式庫,編譯器會產生智慧型指標包裝類別,讓我們能以物件導向的方式操控 Excel、Word 等應用程式。本文示範如何在 VC6.0 中分別啟動 Excel XP (Office 10) 與 Word 2000,並執行基本操作。
首先定義是否使用 Office XP 版本的型別程式庫,並包含必要的標頭檔:
#include <ole2.h>
#include <stdio.h>
#pragma warning (disable:4146 4192 4786 4081)
#define USE_OfficeXP 1
根據 USE_OfficeXP 巨集,匯入對應版本的 DLL/OLB 檔案。注意路徑需依實際安裝位置調整,並使用 rename 避免命名衝突:
#ifdef USE_OfficeXP
#import "C:\\Program Files\\Common Files\\Microsoft Shared\\Office10\\MSO.DLL"
#import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.olb"
#import "C:\\Program Files\\Microsoft Office\\Office10\\MSWord.olb" rename("ExitWindows", "ExitWindowsEx")
#import "C:\\Program Files\\Microsoft Office\\Office10\\Excel.exe" rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") rename("DocumentProperties", "DocumentPropertiesXL") exclude("IFont","IPicture")
#else
#import "C:\\Program Files\\Microsoft Office\\Office\\MSO9.dll"
#import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB" no_namespace
#import "C:\\Program Files\\Microsoft Office\\Office\\MSWord9.OLB" rename("ExitWindows", "_ExitWindows")
#import "C:\\Program Files\\Microsoft Office\\Office\\Excel9.olb" rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") rename("DocumentProperties", "DocumentPropertiesXL") exclude("IFont","IPicture")
#endif
主函式中初始化 COM 程式庫,取得 Excel 的 CLSID,建立應用程式實例並設為可見:
int main(int argc, char* argv[])
{
VARIANT varItem;
varItem.vt = VT_I4;
varItem.intVal = 1;
::CoInitialize(NULL);
CLSID clsid;
// 啟動 Excel
CLSIDFromProgID(L"Excel.Application", &clsid);
Excel::_ApplicationPtr pApp;
pApp.CreateInstance(clsid, NULL);
pApp->PutVisible(0, VARIANT_TRUE);
// 新增活頁簿與工作表
Excel::_WorkbookPtr pWorkbook = pApp->GetWorkbooks()->Add();
Excel::_WorksheetPtr pSheet = pWorkbook->GetWorksheets()->GetItem(varItem);
Excel::RangePtr pRange = pSheet->GetUsedRange(0);
// 讀取已使用的行列數
int iColCnt = pRange->GetColumns()->GetCount();
printf("used columns is %d ", iColCnt);
int iRowCnt = pRange->GetRows()->GetCount();
printf("used rows is %d ", iRowCnt);
// 寫入儲存格並設定背景色
pRange = pSheet->GetRange(OLESTR("A1"));
pRange->Value2 = OLESTR("SOME");
Excel::InteriorPtr pInterior = pRange->GetInterior();
varItem.intVal = 0xff0000; // 紅色
pInterior->PutColor(varItem);
// 列印預覽
pSheet->PrintPreview();
::CoUninitialize();
return 0;
}
程式碼中以 #if 0 封存的區塊展示 Word 自動化的基本流程:建立文件、插入文字。若需啟用,請將 #if 0 改為 #if 1,並將 Excel 區塊註解。
_Ptr) 可自動管理參考計數,減少記憶體洩漏風險。透過 #import 与智慧型指標,VC6.0 開發者能輕鬆整合 Excel 與 Word 功能,實現報表產生、文件自動化等需求。掌握 COM 自動化基礎,可進一步擴展至 Outlook、PowerPoint 等 Office 元件。