【问题标题】:getting worksheet by name in vsto workbook application在 vsto 工作簿应用程序中按名称获取工作表
【发布时间】:2018-03-21 11:40:47
【问题描述】:

此代码通过功能区在 VSTO excel 工作簿应用程序中将工作表添加到我的工作簿:

Globals.ThisWorkbook.Worksheets.Add();
Excel.Window window = e.Control.Context;
Excel.Worksheet activeWorksheet =((Excel.Worksheet)window.Application.ActiveSheet);

添加的工作表也是活动的(显然)。如何在工作簿应用程序中获取现有工作表 - 最好按名称?

这给了我(在我添加上面的工作表之前)正确的 2,因为有 2 个工作表:

var nows = Globals.ThisWorkbook.Worksheets.Count;

有人会认为我至少可以像这样通过索引访问工作表:

var ws = Globals.ThisWorkbook.Worksheets[0];

但这会引发此异常:

$exception {"无效索引。(来自 HRESULT 的异常:0x8002000B (DISP_E_BADINDEX))"} System.Runtime.InteropServices.COMException

有什么想法吗?理想情况下,我想通过 name 访问工作表。谢谢!

【问题讨论】:

    标签: c# vsto office-interop


    【解决方案1】:

    您可以使用 LINQ 在集合中查询您感兴趣的 Worksheet 的名称。

    以下返回单个匹配的Worksheetnull

    var worksheet =
        Globals.ThisWorkbook.Worksheets.Cast<Worksheet>()
                                       .SingleOrDefault(w => w.Name == "worksheet_name");
    

    如果可能有多个同名,请改用Where()ToList()

    var worksheet =
        Globals.ThisWorkbook.Worksheets.Cast<Worksheet>()
                                       .Where(w => w.Name == "worksheet_name")
                                       .ToList();
    

    【讨论】:

      【解决方案2】:

      更新:对不起,我错过了你说的最后一行:

      理想情况下,我想通过 name 访问工作表。谢谢!

      实际上 Excel Ole 自动化允许您通过 same 索引器按名称访问工作表:

      代替:

      var ws = Globals.ThisWorkbook.Worksheets[1];
      

      ...只需使用:

      var ws = Globals.ThisWorkbook.Worksheets["Foo"];
      

      在这种情况下,看起来 c# 的索引器实际上是简写:

      var ws = Globals.ThisWorkbook.Worksheets.Item("Foo");
      

      ...Item() 中传递的参数是一个对象(就 COM 而言,Variant)。 COM 集合的约定是公开一个带有参数的 Item 属性(是的,您没看错),但 VB 和 .NET 对其进行了简化。

      Tell me more


      原答案:

      Excel Interop via .NET 是通过 Ole 自动化实现的,从历史上看,大多数东西都是通过使用 基于 1 的数组的 Visual Basic(不是 VB.NET)应用程序来访问的。不是 0

      访问第一个元素的正确语法是:

      var ws = Globals.ThisWorkbook.Worksheets[1];
      

      【讨论】:

      • 谢谢是有道理的 - 但我不一定知道索引 1 是工作簿 X 而索引 2 是工作簿 Y。我想我需要通过 worksheet.Name 计算索引到名称的映射?
      • @cs0815 如果他们使用从零开始的数组,对您来说没有什么不同。仍然需要映射
      • @cs0815 请查看更新。我没有看到你有问题的最后一句话
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多