2

我正在编写一个后台服务应用程序,它必须自动从 Excel 2003 文件中读取数据。但无论我尝试什么,方法 OlePropertyGet() 总是在尝试从地址“00000800”读取时导致 EAccessViolation 错误。

该错误总是发生在此代码片段的最后一行,并且似乎与方法接收的参数无关:

Variant excel, workbooks;

try
{
    excel = GetActiveOleObject("Excel.Application");
}
catch(...)
{
    excel = CreateOleObject("Excel.Application");
}

workbooks = excel.OlePropertyGet("Workbooks");

我对此进行了一些广泛的谷歌搜索,但没有发现任何有帮助的东西,只有这个论坛帖子有人有同样的问题,但没有提供有关原因或解决方案的任何信息(有一点有点好笑作者提到他知道原因,但没有说是什么!)。

我愿意接受有关导致此问题的原因以及如何解决此问题的任何想法,以及 Excel OLE 自动化的替代方法。

4

4 回答 4

2

我的猜测是它的空指针问题..

它看起来既不工作GetActiveOleObject()也不CreateOleObject()工作。

在调用之前尝试检查“excel”的有效性OlePropertyGet

我想你应该确保你已经安装了 Excel。

于 2009-09-04T13:57:59.747 回答
1

您可以使用 Visual Studio Tools for Office(请参阅http://msdn.microsoft.com/en-us/library/d2tx7z6d.aspx)。

或者您可以使用 ATL 支持来实例化 office 提供的对象模型。

于 2009-04-03T14:06:26.967 回答
0

我使用这样的代码来确定创建对象的有效性(在 C++ Builder 中):

Varaint excel = GetActiveOleObject("Excel.Application");
TAutoDriver<IDispatch> dispatcher;
dispatcher.Bind(excel, false);

if (dispatcher.IsBound())
{
    Variant workbooks = excel.OlePropertyGet("Workbooks");   
}
于 2013-06-24T04:39:21.940 回答
0

您的代码可能无法成功解析“Excel.Application”,从而导致出现空指针。它使用带有该字符串的注册表查找来识别 Excel。听起来您缺少该注册表项。

于 2010-01-13T15:16:41.017 回答