我正在编写一个后台服务应用程序,它必须自动从Excel 2003文件中读取数据。但无论我尝试什么,方法OlePropertyGet()在尝试从地址“00000800”读取时总是会导致EAccessViolation错误。
错误总是发生在此代码段的最后一行,并且似乎与方法接收的参数无关:
Variant excel, workbooks;
try
{
excel = GetActiveOleObject("Excel.Application");
}
catch(...)
{
excel = CreateOleObject("Excel.Application");
}
workbooks = excel.OlePropertyGet("Workbooks");
我已经对此进行了一些广泛的谷歌搜索,但没有找到任何甚至远程帮助,只有this论坛帖子,其中某人有相同的问题,但没有提供任何有关原因或解决方案的信息(有点可笑的是,作者曾提到他知道原因,但不说它是什么!)。
我愿意接受有关导致此问题的原因以及如何解决此问题的任何想法,以及Excel OLE自动化的替代方法。
答案 0 :(得分:2)
我的猜测是它的空指针问题..
看起来GetActiveOleObject()
和CreateOleObject()
都不起作用。
在致电OlePropertyGet
之前,请尝试检查'excel'的有效性。
我想你应该确保安装了Excel。
答案 1 :(得分:1)
您可以使用Visual Studio Tools for Office(请参阅http://msdn.microsoft.com/en-us/library/d2tx7z6d.aspx)。
或者您可以使用ATL支持来实例化办公室提供的对象模型。
答案 2 :(得分:0)
您的代码可能无法成功解析“Excel.Application”,从而导致空指针。它使用该字符串的注册表查找来标识Excel。听起来你错过了那个注册表项。
答案 3 :(得分:0)
我使用这样的代码来确定创建对象的有效性(在C ++ Builder中):
Varaint excel = GetActiveOleObject("Excel.Application");
TAutoDriver<IDispatch> dispatcher;
dispatcher.Bind(excel, false);
if (dispatcher.IsBound())
{
Variant workbooks = excel.OlePropertyGet("Workbooks");
}