在vsto工作簿应用程序中按名称获取工作表

时间:2017-10-29 12:02:14

标签: c# vsto office-interop

此代码通过功能区在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

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

2 个答案:

答案 0 :(得分:2)

更新抱歉,我错过了你说的最后一行:

  

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

实际上,Excel Ole Automation允许您通过相同索引器按名称访问工作表:

而不是:

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

...只是使用:

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

在这种情况下,c#look indexer实际上是简写:

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

... Item()中传递的参数是一个对象(就COM而言,Variant井)。 COM集合的约定是公开一个带有参数的Item属性(是的,你读的是正确的),但VB和.NET简化了它。

Tell me more

原始答案:

通过.NET的Excel Interop是通过Ole Automation的方式,历史上可以追溯到大多数东西通过使用基于 1的arrarys的Visual Basic(不是VB.NET)应用程序访问的日子 0

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

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

答案 1 :(得分:1)

您可以使用LINQ在集合中查询您感兴趣的using System; namespace ClassLibrary2 { public class Class1 { private readonly ClassLibrary1.Class1 instance = new ClassLibrary1.Class1(); public string Test() => instance.ToString(); } } 的名称。

以下内容会返回单个匹配的WorksheetWorksheet

null

如果可能有多个名称相同,请改用var worksheet = Globals.ThisWorkbook.Worksheets.Cast<Worksheet>() .SingleOrDefault(w => w.Name == "worksheet_name"); Where()

ToList()