所参考的文章:
http://blog.sina.com.cn/s/blog_7702cfed01017ww4.html
http://blog.csdn.net/augusdi/article/details/5781102
http://www.cnblogs.com/guobbs/p/4238857.html
开发环境:Win7专业版64位 + VS2013 + Office2007
第一步:
在stdafx.h的头文件中:
#include <afxdisp.h> // MFC 自动化类
在应用程序类的InitInstance函数中:
// 初始化 OLE 库
if (!AfxOleInit()) { AfxMessageBox(L"初始化OLE DLL失败!"); return FALSE; }
第二步:
Project->Class Wizard->Add Class->MFC Class From TypeLib,先选择要导入的组件所在的路径,即Excel.exe所在的路径,然后再选择要导入的Excel类型库中的接口。
主要关注几个_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range等几个接口。
第三步:
编译,由VS自动产生的导入代码存在以下几个问题:
(1)如果导入了多个接口,每个头文件都会把类型库导入一次,如果引用多个头文件,会导致类型库重复导入。
(2)Excel类型库中有些类型会跟MFC类库的某些类型冲突。
(3)Excel类型库的某些类型跟其他Office和VB的某些库相关,如果不导入相关库,将导致这些类型无法使用。
以上三点问题的解决方法如下:
(1)仅在_Application接口对应头文件中导入Excel类型库。
(2)对冲突的类型进行重命名。
(3)在导入Excel类型库之前,先导入Office和VB的相关库。更改后的导入类型库的代码如下(按照自己安装的Office目录做相应路径修改):
#import "C:\Program Files (x86)\Common Files\microsoft shared\OFFICE12\MSO.DLL" \
rename("RGB", "MSORGB") \
rename("DocumentProperties", "MSODocumentProperties")
using namespace Office;
#import "C:\Program Files (x86)\Common Files\microsoft shared\VBA\VBA6\VBE6EXT.OLB"
using namespace VBIDE;
#import "C:\Program Files (x86)\Microsoft Office\Office12\EXCEL.EXE" \
rename("DialogBox", "ExcelDialogBox") \
rename("RGB", "ExcelRGB") \
rename("CopyFile", "ExcelCopyFile") \
rename("ReplaceText", "ExcelReplaceText") \
no_auto_exclude
using namespace Excel;
第四步:
编译,会出现两个错误:\crange.h(335): warning C4003: “DialogBoxW”宏的实参不足
\crange.h(335): error C2059: 语法错误:“,”
双击错误提示,定位在错误行:
VARIANT DialogBox()
{
VARIANT result;
InvokeHelper(0xf5, DISPATCH_METHOD, VT_VARIANT, (void*)&result, NULL);
return result;
}
将该函数名前面加“_”下划线,即“_DialogBox()”,这样就可以编译成功了。