2011-10-27 23 views
6

我已經寫在C#這在Excel電子表格中創建自定義文檔屬性的應用程序的當前工作簿對象,我對這個這需要在一個工作簿對象的功能...獲得在C#

然而,實際上獲取當前的Workbook對象被證明是非常煩人的,我使用ExcelDNA來添加功能,但是,我似乎無法將我的函數傳遞給有效的Workbook COM對象。

回答

14

這是我目前的方式這樣做似乎工作得很好

using Excel = Microsoft.Office.Interop.Excel;  

然後你得到活動工作簿

 //Gets Excel and gets Activeworkbook and worksheet 
     Excel.Application oXL; 
     Excel.Workbook oWB; 
     Excel.Worksheet oSheet; 
     oXL = (Excel.Application)Marshal.GetActiveObject("Excel.Application"); 
     oXL.Visible = true; 
     oWB = (Excel.Workbook)oXL.ActiveWorkbook; 

     docProps = oWB.CustomDocumentProperties 

那我就試試你有什麼,看看它是如何工作

希望這有助於

+0

EXCELLENT。你先生是我的英雄,這已經解決了我遇到的一個相當煩人的問題,我需要一雙新的眼睛!非常感激。 –

+0

是啊沒問題如果你有任何問題讓我知道,我一直在用Excel做很多事情。我希望這可以幫助你!!!! –

+3

從Excel-DNA中,您需要調用ExcelDnaUtil.Application以確保獲得運行的Excel進程的Application對象,而不是Marshal.GetActiveObject將返回的最後一個激活的Excel實例。 – Govert

14

如果你需要找到activeworkbook與C#,如果您使用的是Office互操作,你可以嘗試這樣的代碼:

(Workbook)Globals.ThisAddIn.Application.ActiveWorkbook; 

[Source]

+0

@AdamNumberFive,是它。您可以使用excel應用程序實例來查看ActiveWorkbook屬性,但可以使用excel COM對象做幾乎相同的事情。 –

+1

這與每個時間都有效,不像'Marshal.GetActiveObject(「Excel.Application」);'有時會激發Excel的新實例 –

7

由於@Govert在他的評論上面解釋:

using Excel = Microsoft.Office.Interop.Excel; 
using ExcelDna.Integration; 

// Get the correct application instance 
Excel.Application xlapp = (Excel.Application)ExcelDnaUtil.Application; 

// Get active workbook 
Excel.Workbook wbook = xlapp.ActiveWorkbook; 
+0

我正在爲xlapp獲得NullReference。有什麼變化嗎?這是否仍然有效? – regmi