我正在使用C#编写一个应用程序,该应用程序将在Excel电子表格中创建自定义文档属性。我有一个函数来执行此操作,该函数需要输入工作簿对象...
但是,获取当前工作簿对象实际上非常令人困扰,我正在使用ExcelDNA添加功能,但是似乎无法将有效的工作簿COM对象传递给我的函数。
如果你需要在 C#
中查找活动工作簿,且正在使用 Office Interop,你可以尝试以下代码:
(Workbook)Globals.ThisAddIn.Application.ActiveWorkbook;
[来源]
这是我目前正在使用的方式,看起来效果非常好
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
那么我会尝试您提供的方法,看看它的效果。
希望这可以帮到您。
如@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;
GetActiveObject()函数会在运行对象表(ROT)中查找并返回最后打开的Excel实例,但这可能与顶部Z序列的Excel窗口不对应。
通过循环Z序列来查找匹配的工作簿。
Marshal.GetActiveObject("Excel.Application");
有时会触发新的 Excel 实例。 - Joan-Diego Rodriguez