互操作的唯一标识符.列表对象从VSTO - c#

本文关键字:VSTO 对象 列表 唯一 标识符 互操作 | 更新日期: 2023-09-27 18:07:57

我需要一种方法来插入(或使用一个已经实现的属性,可以作为)一个唯一标识符到Microsoft.Office.Interop.Excel.ListObject实例。

问题是,当我创建一个新的ListObject作为:

var excelTable = worksheet.ListObjects.Add(ExcelInterop.XlListObjectSourceType.xlSrcExternal, DUMMY_CONNECTIONSTRING, false, true, cellRange);

我不能依靠excelTableName属性在集合中浏览它,因为用户可以在之后的任何时候更改该属性的值。

浏览完对象属性后,我发现没有任何东西可以开箱使用(例如,像标签属性,它存在于Microsoft.Office.Tools.Excel.ListObject类型的对象中,由于依赖关系,此时我不能使用)…和其他奇怪的东西,如DisplayName,似乎不仅无法直接设置,而且还反映了Name属性在任何时候都具有的完全相同的值(为什么你要有2个属性在任何时候反映相同的值?)。

我想过要么创建我自己的实现这个类或可能使用Comment属性来存储GUID(我不知道为什么有点感觉不对):

excelTable.Comment = Guid.NewGuid().ToString();
你能提出另一种方法来完成这项任务吗?非常感谢!

互操作的唯一标识符.列表对象从VSTO - c#

这是相当令人沮丧的,没有"标签"(或类似的)属性,你可以设置在Excel对象。我和你面临着同样的问题。您可以使用以下两个选项:

  • 可选文本属性(对于表格,只有右键单击表格,选择表格和可选文本才能看到)。这可能比Comment简洁一点,因为Comment的UI总是可见的。
  • 还可以生成一个包装器对象,它包含对ListObject的直接引用。因此,每个创建的ListObject对应一个包装器对象。在您再次保存/打开工作簿之前,此操作可以正常工作。如果您需要能够在重新打开工作簿后再次识别表,您仍然需要在注释或替代文本中写入一些id。你也许可以通过使用BeforeSave和AfterSave等事件(在保存之前添加替代文本,以便保存到磁盘,然后在保存后再次删除,以便用户看不到它)来做一个干净的实现。当工作簿打开时,加载包装器对象并删除可选文本)。