【问题标题】:Excel Interop: Get named table (Range) from specific workbookExcel 互操作:从特定工作簿获取命名表(范围)
【发布时间】:2015-10-31 13:16:30
【问题描述】:

我正在尝试使用 Excel 对象库 v.15 创建一个与 Excel 交互的 WinForms 应用程序。

我正在使用它来获取 Excel 应用程序对象

(Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");

而且我知道我可以通过使用来获得我想要的命名表的范围

_application.Range["MyTableName"];

现在,我面临的问题是,如果我同时打开两个工作簿,并且每个工作簿都有一个同名的命名表,我不知道将返回哪个 Range。

Excel 应用程序是独一无二的,所以我不能简单地尝试根据窗口标题或类似的东西来获取进程。 我可以根据标题获取 Workbook 对象:

_application.Workbooks.Cast<Workbook>().FirstOrDefault(w.Name.Equals(title))

但是我无法访问特定工作簿的范围。 我知道我可以遍历 Workbook 元素的 Sheets 试图找到表格,但我想知道是否还有另一种“更清洁”的方式。

我将不胜感激。

谢谢,

【问题讨论】:

    标签: c# excel-interop


    【解决方案1】:

    我能想到的最简单/最直接的方法是遍历Names collection,检查父级,然后继续。

    例如:

    For Each NamedRange as Range in MyApplication.Names
        Dim Check as Object = TryCast(NamedRange.Parent, Workbook)
        If Check Is Nothing Then 
            Check = TryCast(NamedRange.Parent, Worksheet)
            Check = TryCast(Check.Parent, Workbook) 
        End If
    
        If Not Check Is Nothing AndAlso Check.Name = "MyWorkbook" Then 
            'Do something
        End If
    Next
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-29
      • 1970-01-01
      相关资源
      最近更新 更多