単純な MS Word テンプレート XML を変更しようとしています。このプロセスを簡単にする SDK が利用可能であることは認識していますが、私が担当しているのはパッケージを使用するタスクであり、同じことをするように言われました。
次の XML にマップされた 2 つのプレースホルダーを含む基本的なテスト ドキュメントがあります。
<root>
<element>
Fubar
</element>
<second>
This is the second placeholder
</second>
</root>
私がやっていることは、単語 doc を使用してストリームを作成し、既存の XML を削除し、ハードコードされたテスト XML を取得して、それをストリームに書き込もうとしています。
私が使用しているコードは次のとおりです。
string strRelRoot = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument";
byte[] buffer = File.ReadAllBytes("dev.docx");
//stream with the template
MemoryStream stream = new MemoryStream(buffer, true);
//create a package using the stream
Package package = Package.Open(stream, FileMode.Open, FileAccess.ReadWrite);
PackageRelationshipCollection pkgrcOfficeDocument = package.GetRelationshipsByType(strRelRoot);
foreach (PackageRelationship pkgr in pkgrcOfficeDocument)
{
if (pkgr.SourceUri.OriginalString == "/")
{
Uri uriData = new Uri("/customXML/item1.xml", UriKind.Relative);
//remove the existing part
if (package.PartExists(uriData))
{
// Delete template "/customXML/item1.xml" part
package.DeletePart(uriData);
}
//create a new part
PackagePart pkgprtData = package.CreatePart(uriData, "application/xml");
//test data
string xml = @"<root>
<element>
Changed
</element>
<second>
The second placeholder changed
</second>
</root>";
//stream created from the xml string
MemoryStream fromStream = new MemoryStream();
UnicodeEncoding uniEncoding = new UnicodeEncoding();
byte[] fromBuffer = uniEncoding.GetBytes(xml);
fromStream.Write(fromBuffer, 0, fromBuffer.Length);
fromStream.Seek(0L, SeekOrigin.Begin);
Stream toStream = pkgprtData.GetStream();
//copy the xml to the part stream
fromStream.CopyTo(toStream);
//copy part stream to the byte stream
toStream.CopyTo(stream);
}
}
解決策に近づいているように感じますが、これは現在ドキュメントを変更していません。アドバイスをいただければ幸いです。ありがとう!
編集:明確にするために、私が得ている結果は、ドキュメントが変更されていないことです。例外などは発生しませんが、ドキュメントの XML は変更されません。