これまでのところ、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はここにあり、ここで説明されています。
問題は、私のカスタムプロパティが、OpenXMLファイル形式のdocument.zip \ customXmlフォルダーにあるxmlファイル(例:item1.xml)に挿入されることです。後でカスタムプロパティを読みたいときWordProcessingDocument.CustomFilePropertiesPart
は、空のプロパティを使用します。実際、これはdocument.zip \ docProps\custom.xmlファイルをCustomFilePropertiesPart
参照していることがわかりました。
doc.CustomXMLParts.Add(openxml);
したがって、適切なxmlファイル、つまりdocument.zip \ docProps \ custom.xmlにデータを入力するために何を使用する必要があるかを使用する代わりに、
編集 私はすでにMishraによって提案された解決策を試しましたが、成功しませんでした。つまり、カスタムプロパティが常に保存されるとは限りませんでした。しかし、彼がこの解決策を投稿したので、私は再試行しました。ここで、最初にドキュメントを未保存としてマークする必要があることがわかりました。
doc.CustomDocumentProperties.Add("MyProp", False, MsoDocProperties.msoPropertyTypeNumber, 123);
doc.Saved = false;
doc.Save();