2

私がやっていることは、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 が作成されていることですが、それは空白のドキュメントです。なぜこれが起こっているのかわかりません。このアプローチおよび/または私が間違っていることについて誰かが提供できる提案は、非常に高く評価されます。どうもありがとう!

4

1 に答える 1

2

呼び出しの後fromStream.Write、ストリーム ポインターは、書き込んだデータの後に配置されます。したがって、最初の への呼び出しfromStream.ReadByteはすでにストリームの最後にあり、何も読み取り (および書き込み) しません。

Seek書き込み後にストリームの先頭に移動するか(パッケージによって返されたストリームがシークをサポートしている場合)、閉じfromStreamて (書き込み済みのデータが確実にフラッシュされるようにするため)、読み取りのために再度開く必要があります。

fromStream.Seek(0L, SeekOrigin.Begin);
于 2012-07-11T12:22:29.147 に答える