使用Visual Studio Enterprise 2015和office 2013 pro,我創建了Excel 2013插件,當我調試它時,我無法引用Application.Workbook對象!下面是一個小例子:Office 2013 c#插件 - 空工作簿對象HRESULT:0x800A03EC錯誤
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,我收到錯誤:
「‘System.Runtime.InteropServices.COMException’類型的異常出現在ExcelAddIn1.dll但不在用戶代碼中處理「。
在應用程序對象許多屬性的檢查(快速手錶)具有值:
{System.Reflection.TargetInvocationException:異常已被調用的目標拋出。 ---> System.Runtime.InteropServices.COMException:舊格式或無效類型庫。 (異常來自HRESULT:0x80028018(TYPE_E_INVDATAREAD))」
看來申請對象有沒有工作簿,除其他問題 我敢肯定,代碼是好的,但也許有一些錯誤與我的.NET。框架或Office版本或建立設置? 任何人都可以擺脫任何光線就這個嗎?
**編輯** 1
因此,基於理查德摩根的建議我嘗試以下,已經看到,有可能是沒有當原始代碼運行時的活動工作簿:
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.COMException - 舊格式或無效的類型庫
進一步的搜索有發現這可能是由於Excel和VS代碼之間的區域設置不匹配造成的,但我在此檢查了區域匹配。
編輯2
因此,也許我是很愚蠢的在這裏!進一步閱讀表明應用程序的.ThisWorkbook屬性返回對包含該代碼的工作簿的引用。由於這是一個加載項,代碼包含在.dll中。相反,我使用了.ActiveWorkbook,它返回了一個引用而不會引發異常!
http://stackoverflow.com/help/mcve – xxbbcc
你確實有一個參考設置爲「Microsoft.Office.Interop」?如果是這樣,也許使用'Excel.Workbook'而不是'var' –
感謝xxbbcc這現在是一個mcve – Flakker