到目前为止,我已经能够通过使用 VSTO 并将包流添加到活动文档中来为 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
方法按照此处的说明工作,OpcHelper可以在此处找到并在此处进行说明。
问题是我的自定义属性被插入到一个 xml 文件(例如 item1.xml)中,该文件位于OpenXML 文件格式的文件夹document.zip\customXml中。稍后当我想阅读我的自定义属性时,我使用的WordProcessingDocument.CustomFilePropertiesPart
是空的。事实上,我发现CustomFilePropertiesPart
引用了document.zip\docProps\custom.xml文件。
因此,doc.CustomXMLParts.Add(openxml);
我应该使用什么来填充正确的 xml 文件,即document.zip\docProps\custom.xml ,而不是使用什么?
编辑 我已经尝试过 Mishra 提出的解决方案但没有成功,即并不总是保存自定义属性。但是,自从他发布了这个解决方案后,我再次尝试,在这里我发现您首先需要将文档标记为未保存:
doc.CustomDocumentProperties.Add("MyProp", False, MsoDocProperties.msoPropertyTypeNumber, 123);
doc.Saved = false;
doc.Save();