如何通过OpenXML在当前活动的Word文档中设置自定义属性

时间:2013-03-20 14:46:35

标签: c# vsto openxml office-interop

到目前为止,我已经能够通过使用VSTO并将活动文档中的包流添加到Word文档来为Word文档设置自定义属性

public static void SetCustomProperty(Microsoft.Office.Interop.Word.Document doc, string propertyName, object propertyValue)
{
    using (MemoryStream stream = new MemoryStream())
    using ((WordprocessingDocument wordDoc = WordprocessingDocument.Create(stream,  WordprocessingDocumentType.Document, true))
    {
        SetProperty(wordDoc, propertyName, propertyValue);
        // Flush the contents of the package.
        wordDoc.Package.Flush();
        // Convert back to flat OPC by using this in-memory package.
        XDocument xDoc = OpcHelper.OpcToFlatOpc(wordDoc.Package);
        // Return the xml string.
        string openxml = xDoc.ToString();
        // Add to Word doc
        doc.CustomXMLParts.Add(openxml);
    }
}

SetProperty方法的工作原理如here所示,可以找到OpcHelper here并解释为here

问题是我的自定义属性是插入位于OpenXML文件格式的 document.zip \ customXml 文件夹中的xml文件(例如item1.xml)中。稍后,当我想要阅读我的自定义属性时,我使用空的WordProcessingDocument.CustomFilePropertiesPart。实际上我发现CustomFilePropertiesPart引用了 document.zip \ docProps \ custom.xml 文件。

所以我应该使用什么来填充正确的xml文件,而不是使用doc.CustomXMLParts.Add(openxml);,而不是 document.zip \ docProps \ custom.xml

修改 我已经尝试了Mishra提出的解决方案但没有成功,即自定义属性并不总是保存。但是,自从他发布此解决方案后,我再次尝试,我发现here您首先需要将文档标记为未保存:

doc.CustomDocumentProperties.Add("MyProp", False, MsoDocProperties.msoPropertyTypeNumber, 123);
doc.Saved = false;
doc.Save();

2 个答案:

答案 0 :(得分:0)

检查this post - 它解释了如何将自定义属性提供给Word。

答案 1 :(得分:0)

您无法使用CustomXMLParts集合设置custome属性。如果您打开文档更好,请保持简单并使用CustomDocumentProperties集合,它非常快速和简单。只有当要插入的数据变化很大时,我才会在open doc中使用开放式XML。