此代码通过功能区在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
有什么想法吗?理想情况下,我想通过名称访问工作表。谢谢!
答案 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简化了它。
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();
}
}
的名称。
以下内容会返回单个匹配的Worksheet
或Worksheet
。
null
如果可能有多个名称相同,请改用var worksheet =
Globals.ThisWorkbook.Worksheets.Cast<Worksheet>()
.SingleOrDefault(w => w.Name == "worksheet_name");
和Where()
。
ToList()