C# 在Excel加载项C中存储自定义数据#

C# 在Excel加载项C中存储自定义数据#,c#,excel,visual-studio,add-in,C#,Excel,Visual Studio,Add In,我用C#和Visual Studio 2015创建了一个Excel加载项。现在我想存储一些特定于图纸的数据。是否有办法将用户数据存储在自定义excel对象中,该对象将由excel在xlsx文件中序列化?我不知道该怎么处理 您可以使用工作表自定义属性在工作表级别存储键/值对: 储存: MyExcelSheet.CustomProperties.Add("MyKey", "MyValue"); 阅读和更新: foreach (CustomProperty cp in MyExcelSheet.Cu

我用C#和Visual Studio 2015创建了一个Excel加载项。现在我想存储一些特定于图纸的数据。是否有办法将用户数据存储在自定义excel对象中,该对象将由excel在xlsx文件中序列化?我不知道该怎么处理

您可以使用工作表自定义属性在工作表级别存储键/值对:

储存:

MyExcelSheet.CustomProperties.Add("MyKey", "MyValue");
阅读和更新:

foreach (CustomProperty cp in MyExcelSheet.CustomProperties)
{
    if (cp.Name == "MyKey")
    {
        cp.Value = "MyNewValue"
    }
}
删除:

foreach (CustomProperty cp in MyExcelSheet.CustomProperties)
{
    if (cp.Name == "MyKey")
    {
        cp.Delete();
    }
}
自定义属性保存在Excel文件中,但请注意,更改它们不会将工作簿标记为“脏”。因此,在添加/更新/删除工作簿后,应将工作簿标记为未保存:

Workbook wb = MyExcelSheet.Parent as Workbook;
wb.Saved = false;
这样做将确保在用户关闭工作簿时,即使没有进行其他更改,也会提示用户保存工作簿

请注意,其他加载项和VBA代码也可能在自定义属性中存储数据,因此您应该确保使用适当的唯一键

资料来源:

您可以使用工作簿customXMLPart在文档级别存储XML数据 例如,让MyDocumentMetaData成为可序列化的类:

[XmlRoot(Namespace = "myNamespace")]
public class MyDocumentMetaData 
{
    public string Title { get; set; }
    public List<string> CellRefrences { get; set; }
    public string ToXML()
    {
        var stringwriter = new System.IO.StringWriter();
        XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
        ns.Add("myNamespace", "http://myNamespace.com");
        var serializer = new XmlSerializer(typeof(MyDocumentMetaData));
        serializer.Serialize(stringwriter, this, ns);
        var x = stringwriter.ToString();
        return x;

    }

    public static MyDocumentMetaData LoadFromXMLString(string xmlText)
    {
        var stringReader = new System.IO.StringReader(xmlText);
        var serializer = new XmlSerializer(typeof(MyDocumentMetaData));
        return serializer.Deserialize(stringReader) as MyDocumentMetaData;
    }
}
更多信息:

public class CustomXMLPartsRepository 
{
    public MyDocumentMetaData Read()
    {
        var CustomXMLParts = Globals.ThisAddIn.Application.ActiveWorkbook.CustomXMLParts.SelectByNamespace("myNamespace");
        foreach (CustomXMLPart p in CustomXMLParts)
        {
            return MyDocumentMetaData.LoadFromXMLString(p.XML);
        }
        return null;
    }

    public void Write(MyDocumentMetaData data)
    {
        Globals.ThisAddIn.Application.ActiveWorkbook.CustomXMLParts.Add(data.ToXML());
    }

    private void clearNamespace(){
        var CustomXMLParts = Globals.ThisAddIn.Application.ActiveWorkbook.CustomXMLParts.SelectByNamespace("myNamespace");
        foreach (CustomXMLPart p in CustomXMLParts)
        {
            p.Delete();
        }
    }
}