【发布时间】:2011-10-27 13:39:32
【问题描述】:
我一直在用 C# 编写一个应用程序,它在 Excel 电子表格中创建自定义文档属性,我有一个函数用于接收工作簿对象...
然而,实际获取当前的 Workbook 对象被证明是相当烦人的,我正在使用 ExcelDNA 添加功能,但是,我似乎无法将有效的 Workbook COM 对象传递给我的函数。
【问题讨论】:
我一直在用 C# 编写一个应用程序,它在 Excel 电子表格中创建自定义文档属性,我有一个函数用于接收工作簿对象...
然而,实际获取当前的 Workbook 对象被证明是相当烦人的,我正在使用 ExcelDNA 添加功能,但是,我似乎无法将有效的 Workbook COM 对象传递给我的函数。
【问题讨论】:
如果你需要找到C#的activeworkbook,如果你正在使用Office Interop,你可以试试这种代码:
(Workbook)Globals.ThisAddIn.Application.ActiveWorkbook;
[Source]
【讨论】:
Marshal.GetActiveObject("Excel.Application"); 有时会触发新的 Excel 实例
这是我目前正在做的方式,它似乎工作得很好
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 顺序并找到匹配的工作簿。
【讨论】: