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

11

我正在使用C#编写一个应用程序,该应用程序将在Excel电子表格中创建自定义文档属性。我有一个函数来执行此操作,该函数需要输入工作簿对象...

但是,获取当前工作簿对象实际上非常令人困扰,我正在使用ExcelDNA添加功能,但是似乎无法将有效的工作簿COM对象传递给我的函数。

4个回答

18

如果你需要在 C# 中查找活动工作簿,且正在使用 Office Interop,你可以尝试以下代码:

(Workbook)Globals.ThisAddIn.Application.ActiveWorkbook;

[来源]


1
@AdamNumberFive,是的。您可以通过使用您拥有的Excel应用程序实例并查看ActiveWorkbook属性来几乎完成相同的操作。 - Michael Kingsmill
2
这个总是有效的,不像 Marshal.GetActiveObject("Excel.Application"); 有时会触发新的 Excel 实例。 - Joan-Diego Rodriguez
1
源代码不再可用。我无法让它工作。有人能发布一个好的源吗?非常感兴趣,因为Marshal也为我创建了Excel的新实例。 - Jar

16

这是我目前正在使用的方式,看起来效果非常好

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

那么我会尝试您提供的方法,看看它的效果。

希望这可以帮到您。


非常好!您是我的英雄,这解决了一个相当恼人的问题,我想需要另一对新鲜的眼睛!非常感谢。 - Adam H
没问题,我在使用Excel方面做了很多工作,如果你有任何问题,请告诉我。希望这能帮到你!!! - Russell Saari
4
在Excel-DNA中,您需要调用ExcelDnaUtil.Application方法以确保获取正在运行的Excel进程的Application对象,而不是Marshal.GetActiveObject将返回的最后激活的Excel实例。 - Govert
@RussellSaari 感谢您的回答。如果有两个Excel实例打开,这种方法总是返回最先打开的实例。即使第二个工作簿是活动的,它也永远不会被返回。如何获取当前工作簿,而不管文件是使用哪个实例打开的? - regmi

11

如@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;

我在xlapp中遇到了NullReference错误。有什么变化吗?这个还能正常工作吗? - regmi
我在Excel函数参数中设置了IsThreadSafe=true。一旦我将其删除,我就能够获得Excel引用了。 - user781700

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接