【问题标题】:Get the current Workbook Object in C#在 C# 中获取当前的工作簿对象
【发布时间】:2011-10-27 13:39:32
【问题描述】:

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

然而,实际获取当前的 Workbook 对象被证明是相当烦人的,我正在使用 ExcelDNA 添加功能,但是,我似乎无法将有效的 Workbook COM 对象传递给我的函数。

【问题讨论】:

    标签: c# excel excel-dna


    【解决方案1】:

    如果你需要找到C#的activeworkbook,如果你正在使用Office Interop,你可以试试这种代码:

    (Workbook)Globals.ThisAddIn.Application.ActiveWorkbook;
    

    [Source]

    【讨论】:

    • @AdamNumberFive,是的。通过使用您拥有的 excel 应用程序实例并查看 ActiveWorkbook 属性,您可以对 excel COM 对象执行几乎相同的操作。
    • 这每次都有效,不像 Marshal.GetActiveObject("Excel.Application"); 有时会触发新的 Excel 实例
    • 源不再可用。我不能让它工作。有人可以为此发布一个好的来源吗?非常感兴趣,因为 Marshal 也在为我创建新的 Excel 实例。
    【解决方案2】:

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

    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
    

    然后我会试试你有什么,看看它是如何工作的

    希望对你有帮助

    【讨论】:

    • 优秀。您先生是我的英雄,这解决了我遇到的一个相当烦人的问题,我猜需要一双新的眼睛!非常感谢。
    • 是的,没问题,如果您有任何问题,请告诉我。希望对你有帮助!!!!
    • 您需要从 Excel-DNA 调用 ExcelDnaUtil.Application 以确保您获得正在运行的 Excel 进程的 Application 对象,而不是 Marshal.GetActiveObject 最后激活的 Excel 实例会回来的。
    • @RussellSaari 感谢您的回答。如果打开了两个 Excel 实例,则此方法始终返回首先打开的实例。即第二个工作簿将永远不会被返回,即使它是活动的。无论文件是用什么实例打开的,如何获取当前工作簿?
    【解决方案3】:

    正如@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。有什么改变吗?这仍然应该工作吗?
    • 我在 ExcelFunction 参数中有 IsThreadSafe = true。一旦我删除它,我就能获得 excel 参考。
    【解决方案4】:

    GetActiveObject() 查看运行对象表 (ROT),并为您提供最后打开的 Excel 实例,该实例可能与前 Z 顺序 Excel 窗口不对应。

    遍历 Z 顺序并找到匹配的工作簿。

    查看此链接:- https://social.msdn.microsoft.com/Forums/office/en-US/060000d8-a899-49bf-a965-0576dee958d4/how-to-get-active-application?forum=exceldev

    【讨论】:

      猜你喜欢
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      • 2020-03-02
      • 2015-02-19
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多