我正在使用C#为Excel编写一个VSTO插件,需要将元数据绑定到在工作表中创建的表,当工作表中的表被复制时,这些表不能暴露给用户或被复制。为此,我使用了ListObject's Tag property,它工作得很好,似乎就是为这个用例而设计的。为了设置Tag属性,我创建了ListObject的VSTO对象,因为该属性在互操作对象中不可用:
foreach (Microsoft.Office.Interop.Excel.Worksheet worksheet in Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets)
{
foreach (Microsoft.Office.Interop.Excel.ListObject table in worksheet.ListObjects)
{
Microsoft.Office.Tools.Excel.ListObject vstoTable = Globals.Factory.GetVstoObject(table);
vstoTable.Tag = new Tag { Identifier = 123 };
}
}但是,一旦我为ListObject创建了VSTO对象,我就不能再更改表的名称。我仍然可以在表选项UI中对其进行编辑,但是保存工作簿将自动将其名称恢复为创建VSTO对象时的名称。我尝试处理VSTO对象,但没有成功。即使我没有设置Tag,这个问题仍然存在,仅仅创建VSTO对象似乎就足以触发这个问题。有趣的是,我还为工作表创建了VSTO对象副本,并设置了它们的Tag属性,但即使在创建了对象和设置了标记之后,我仍然可以重命名它们。
为了验证我的其他代码都没有影响到这一点,我创建了一个新的外接程序项目,其中只有上面的代码片段放在功能区按钮上,同样的问题也发生了。我还尝试使用互操作中提供的其他几个属性,以避免创建VSTO对象,但它们要么向用户公开,要么与表一起复制,要么两者兼而有之。
很明显,我不是错误地使用了对象,就是这是Excel中的一个问题。有没有人知道如何设置Tag而不失去重命名表的能力,或者是否有其他方法可以用来将元数据附加到表中?
发布于 2021-01-23 05:38:25
您可能希望尝试删除并重新创建每次都具有您想要的名称的列表对象,如此扩展方法所示。这在您的解决方案中可能不起作用,或者您可能必须修改参数以创建具有“新”名称的旧列表对象。每次重新创建列表对象时,我都会对其进行数据绑定,因此这适用于我的情况。
/// <summary>
/// Creates a VSTO list object by searching for a native list object by name
/// If the list object is found it will cast it to a
/// VSTO list object and remove it from the worksheet
/// Once removed (or not found) it will create a VSTO list object
/// and add it to the worksheet
/// </summary>
/// <param name="worksheet"> The worksheet to add the list object to</param>
/// <param name="name"> The name of the list object to re-create </param>
/// <returns> The VSTO list object </returns>
public static ExcelVSTO.ListObject RecreateVSTOListObject(this ExcelVSTO.Worksheet worksheet, string name)
{
Excel.ListObject listObject = Globals.ThisAddIn.GetListObjectByName(worksheet, name);
if (listObject != null)
{
Microsoft.Office.Tools.Excel.ListObject vstoListObject = Globals.Factory.GetVstoObject(listObject);
worksheet.Controls.Remove(name);
}
return worksheet.Controls.AddListObject(Globals.ThisAddIn.Application.Selection, name);
}https://stackoverflow.com/questions/63810894
复制相似问题