Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Office 2013 c#加载项-空工作簿对象HRESULT:0x800A03EC错误_C#_.net_Excel_Ms Office_Office Interop - Fatal编程技术网

Office 2013 c#加载项-空工作簿对象HRESULT:0x800A03EC错误

Office 2013 c#加载项-空工作簿对象HRESULT:0x800A03EC错误,c#,.net,excel,ms-office,office-interop,C#,.net,Excel,Ms Office,Office Interop,使用Visual Studio Enterprise 2015和office 2013 pro,我创建了一个Excel 2013加载项,调试它时,我无法引用应用程序。工作簿对象!下面是一个简单的例子: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Linq; using Excel = Microsoft.Office.Interop.E

使用Visual Studio Enterprise 2015和office 2013 pro,我创建了一个Excel 2013加载项,调试它时,我无法引用应用程序。工作簿对象!下面是一个简单的例子:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
using Microsoft.Office.Tools.Excel;

namespace ExcelAddIn1
{
    public partial class ThisAddIn
    {
         private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            var app = Globals.ThisAddIn.Application;
            var wb = app.ThisWorkbook;
        }

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }

        #region VSTO generated code

        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisAddIn_Startup);
            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
        }

        #endregion
    }
}
在尝试分配wb时,我收到错误:

“ExcelAddIn1.dll中发生类型为“System.Runtime.InteropServices.COMException”的异常,但未在用户代码中处理”

在检查(快速观察)应用程序对象时,许多属性具有以下值:

{System.Reflection.TargetInvocationException:调用的目标已引发异常。-->System.Runtime.InteropServices.COMException:旧格式或无效的类型库。(来自HRESULT的异常:0x80028018(type_E_INVDATAREAD))”

除其他问题外,应用程序对象似乎没有工作簿。 我确信代码是正确的,但我的.Net framework或office版本或构建设置可能有问题? 有人能解释一下吗

**编辑1**

因此,根据Richard Morgan的建议,我尝试了以下方法,在看到原始代码运行时可能没有活动工作簿:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
using Microsoft.Office.Tools.Excel;

namespace ExcelAddIn1
{
    public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {

            this.Application.WorkbookActivate += new Excel.AppEvents_WorkbookActivateEventHandler(WorkWithWorkbook);
        }

        private void WorkWithWorkbook(Microsoft.Office.Interop.Excel.Workbook workbook)
        {
            // Workbook has been opened. Do stuff here.
            var app = Globals.ThisAddIn.Application;
            Excel.Workbook wb = app.ThisWorkbook;
        }

        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }

        #region VSTO generated code

        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisAddIn_Startup);
            this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown);
        }

        #endregion
    }
}
因此,在执行WorkWithWorkbook()时,我希望有一个ActiveWorkbook可以获得引用。不幸的是,我仍然得到COMException,其中包含:

“来自HRESULT:0x800A03EC的异常”

对应用程序对象的进一步检查显示工作簿集合已部分填充,但许多属性仍引用:

System.Runtime.InteropServices.ComeException-旧格式或无效的类型库

进一步的搜索表明,这可能是由于Excel和VS代码之间的区域设置不匹配造成的,但我已经检查了在这种情况下区域是否匹配

编辑2


因此,也许我在这里太傻了!进一步阅读表明,应用程序的.ThisWorkbook属性返回对包含代码的工作簿的引用。由于这是一个外接程序,代码包含在.dll中。因此,我使用了.ActiveWorkbook,它返回了一个引用而不引发异常!

,因为该外接程序-在工作簿中不包含代码的情况下,
应用程序。未设置ThisWorkbook
属性。
应用程序。ThisWorkbook
属性用于返回对包含代码的工作簿的引用,但不存在此类工作簿

为了获取对当前打开的工作簿的引用并执行代码,应改用
应用程序.ActiveWorkbook
引用。

这是奇怪的代码:

private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
    this.Application.WorkbookActivate += new Excel.AppEvents_WorkbookActivateEventHandler(WorkWithWorkbook);
}

private void WorkWithWorkbook(Microsoft.Office.Interop.Excel.Workbook workbook)
{
    // Workbook has been opened. Do stuff here.
    var app = Globals.ThisAddIn.Application;
    Excel.Workbook wb = app.ThisWorkbook;
}
那么,Excel为您提供了刚刚激活的准确的
工作簿
,然后您自己运行代码来解决它

对此要非常小心

我们的VSTO Excel加载项中的
ActiveWorkbook
ThisWorkbook
存在问题,特别是当用户“做点什么”启动我们的VSTO代码时,但他们打开了其他Excel文件,或者我们的VSTO任务需要一些时间,同时他们切换到另一个工作簿

确保代码处理正确文件的最佳(唯一?)方法是始终使用
工作簿
,该工作簿将传递给
OnActivate
函数

private void WorkWithWorkbook(Microsoft.Office.Interop.Excel.Workbook workbook)
{
    //  Do some stuff directly with "workbook" 
    //  
}
至于0x800A03EC错误,它似乎是Excel的通用“这可能意味着任何东西”COM错误之一


当我们试图确定应该使用哪个Excel
工作簿
对象时,我们也看到了这一点。

您是否确实有一个指向Microsoft.Office.Interop的引用集?如果有,可以使用
Excel.工作簿
而不是
var
谢谢xxbbcc这现在是一个mcvethanks宏,但明确说明了类型这个答案有用吗?是的,这很奇怪,但对于这个例子,我刚刚选择了我在列表中看到的第一个事件,它保证工作簿处于活动状态!