描述:
我在通过自动化调用Excel时遇到了问题,希望高手帮忙解决一下。
开发用的环境是Windows xp sp2, Visual studio 2005, Office2003
以前用Visual studio 2002 和 2003 都没有问题,通过导入类型库调用
Excel一点问题都没有,但是使用VS2005问题就出来,google了半天,
也有人遇到同样问题,但是没有任何有效的解决办法。估计是2005才出来
的原因吧。
问题描述如下:
通过VS2005的添加类功能,选择Typelib类添加,
选择“Microsoft Excel 11.0 Object Library <1.5>”
选择接口_Application, _Workbook, _Worksheet,
由接口生成类CApplication, CWorkbook, CWorksheet.
如果单纯使用这三个类的话也没有什么问题,一切和以前一样没有问题。
但是如果选择接口Workbooks,Worksheets,生成类CWorkbooks, CWorksheets.
这个时候问题就出现了。
由此生成的头文件前面都加上了#import "C:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE"
这和以前的版本是不一样的,以前的VS版本没有这一句,应该是VS2005的新特性。
就这么使用的话,一编译会出现大量的错误,
由以前的经验可以知道是由于命名冲突导致的。于是使用rename进行重命名,
以前的错误虽然不出现了,但是又出现新的错误,于是定义namespace,还是不行,
我基本上所有能想到的组合都使用过了,还是错误。
试验中的头文件一部分代码如下:
#import "C:\\Program Files\\Common Files\\Microsoft Shared\\OFFICE11\\MSO.DLL" \
rename("RGB", "ExclRGB") \
rename("DocumentProperties", "ExclDocumentProperties") \
rename("SearchPath", "ExclSearchPath")
#import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA6\\VBE6EXT.OLB"
#import "C:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE" \
rename("DialogBox", "ExclDialogBox") \
rename("RGB", "ExclRGB") \
rename("CopyFile", "ExclCopyFile") \
rename("ReplaceText", "ExclReplaceText")
using namespace Excel;
察看了自动生成的头文件CWorkbooks.h里面的一个函数
Application get_Application()
{
Application result;
InvokeHelper(0x94, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
return result;
}
而VS2005以前的版本生成的代码如下:
LPDISPATCH get_Application()
{
LPDISPATCH result;
InvokeHelper(0x94, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
return result;
}
当然还有其他的不同。
估计就是由这个新类型Application导致的问题。
如果头文件不做任何修改如下
#import "C:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE" no_namespace
那么产生的一部分代表性错误如下:
c:\work\powerpointautomation\autoproject\autoproject\capplication.h(3) : warning C4278: 'RGB': identifier in type library 'C:\\Program Files\\Microsoft Office\\OFFICE11\\msppt.olb' is already a macro; use the 'rename' qualifier
c:\work\powerpointautomation\autoproject\autoproject\debug\msppt.tlh(414) : error C2371: 'FontPtr' : redefinition; different basic types
c:\program files\microsoft visual studio 8\vc\include\comdef.h(312) : see declaration of 'FontPtr'
c:\work\powerpointautomation\autoproject\autoproject\debug\msppt.tlh(1130) : error C2146: syntax error : missing ';' before identifier 'GetRGB'
c:\work\powerpointautomation\autoproject\autoproject\debug\msppt.tlh(1963) : error C2061: syntax error : identifier 'MsoRGBType'
这个问题困扰我很长时间了。微软这套东西是越来越复杂化,这样下去完全跟不上了。
请高手帮组解决这个问题。谢谢大家。
解决方案1:
#import "C:\Program Files\Common Files\Microsoft Shared\OFFICE11\mso.dll" rename("RGB", "MSRGB")
#import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB" raw_interfaces_only, rename("Reference", "ignorethis"), rename("VBE", "testVBE")
#import "D:\\Program Files\\Microsoft Office\\OFFICE11\\EXCEL.EXE" exclude("IFont","IPicture"), rename("RGB", "ignorethis"), rename("DialogBox", "ignorethis"), rename("VBE", "testVBE"), rename("ReplaceText", "EReplaceText"), rename("CopyFile","ECopyFile"), rename("FindText", "EFindText"), rename("NoPrompt", "ENoPrompt")
这样就可以了,我在vs2008中使用正常的,我这里也有一个导出了application,worksheet等类的头文件,如果你需要我可以发给你,我的excel在D盘