私がやっていることは、Microsoft Office Word ドキュメント XML の値を変更し、それを新しいファイルとして保存しようとしています。これを簡単にするために使用できるSDKがあることは知っていますが、私が維持することを任されているプロジェクトはこのように物事を行っており、私もそうしなければならないと言われました。
次の XML にマップされた 2 つのプレースホルダーを含む基本的なテスト ドキュメントがあります。
<root>
<element>
Fubar
</element>
<second>
This is the second placeholder
</second>
</root>
私のテストプロジェクトには、次のものがあります。
string strRelRoot = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument";
//the word template
byte[] buffer = File.ReadAllBytes("dev.docx");
MemoryStream stream = new MemoryStream(buffer, true);
Package package = Package.Open(stream, FileMode.Open, FileAccess.ReadWrite);
//get the document relationship
PackageRelationshipCollection pkgrcOfficeDocument = package.GetRelationshipsByType(strRelRoot);
//iterate through relationship
foreach (PackageRelationship pkgr in pkgrcOfficeDocument)
{
if (pkgr.SourceUri.OriginalString == "/")
{
//uri for the custom xml
Uri uriData = new Uri("/customXML/item1.xml", UriKind.Relative);
//delete the existing xml if it exists
if (package.PartExists(uriData))
{
// Delete template "/customXML/item1.xml" part
package.DeletePart(uriData);
}
PackagePart pkgprtData = package.CreatePart(uriData, "application/xml");
//hard coded test data
string xml = @"<root>
<element>
Changed
</element>
<second>
The second placeholder changed
</second>
</root>";
Stream fromStream = pkgprtData.GetStream();
//write the string
fromStream.Write(Encoding.UTF8.GetBytes(xml),0,xml.Length);
//destination file
Stream dest = File.Create("test.docx");
//write to the destination file
for (int a = fromStream.ReadByte(); a != -1; a = fromStream.ReadByte())
{
dest.WriteByte((byte)a);
}
}
}
現在起こっていることは、ファイル test.docx が作成されていることですが、それは空白のドキュメントです。なぜこれが起こっているのかわかりません。このアプローチおよび/または私が間違っていることについて誰かが提供できる提案は、非常に高く評価されます。どうもありがとう!