C# 在Excel加载项C中存储自定义数据#
我用C#和Visual Studio 2015创建了一个Excel加载项。现在我想存储一些特定于图纸的数据。是否有办法将用户数据存储在自定义excel对象中,该对象将由excel在xlsx文件中序列化?我不知道该怎么处理 您可以使用工作表自定义属性在工作表级别存储键/值对: 储存: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
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();
}
}
}