在C#中获取当前的工作簿对象

Ada*_*m H 10 c# excel excel-dna

我一直在用C#编写一个应用程序,它在Excel电子表格中创建自定义文档属性,我有一个函数,它接收一个工作簿对象......

但是,实际上获取当前的Workbook对象是非常烦人的,我使用ExcelDNA来添加功能,但是,我似乎无法将我的函数传递给有效的Workbook COM对象.

JMa*_*Max 16

如果您需要查找activeworkbook C#,如果您使用的是Office Interop,则可以尝试以下类型的代码:

(Workbook)Globals.ThisAddIn.Application.ActiveWorkbook;
Run Code Online (Sandbox Code Playgroud)

[ 来源 ]

  • 每次都可以使用,不像`Marshal.GetActiveObject("Excel.Application");`有时会触发Excel的新实例 (2认同)
  • 来源不再可用。我无法让它发挥作用。有人可以为此发布一个好的来源吗?非常感兴趣,因为 Marshal 也在为我创建新的 Excel 实例。 (2认同)

Rus*_*ari 15

这是我目前正在做的方式,似乎工作得很好

 using Excel = Microsoft.Office.Interop.Excel;      
Run Code Online (Sandbox Code Playgroud)

然后你得到活跃的工作簿

        //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
Run Code Online (Sandbox Code Playgroud)

然后我会尝试你所拥有的,看看它是如何工作的

希望这可以帮助

  • 从Excel-DNA中,您需要调用ExcelDnaUtil.Application以确保获得正在运行的Excel进程的Application对象,而不是Marshal.GetActiveObject将返回的最后一个激活的Excel实例. (3认同)

tun*_*lik 8

正如@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;
Run Code Online (Sandbox Code Playgroud)