1

テンプレート レンダリング用の既存の単語自動化ベースのシステムを置き換えるプロトタイプに取り組んでおり、現在 OpenXML SDK を評価しています。テンプレート ライブラリは非常に広範です (150 ~ 200 個のテンプレートがあり、非技術的なリソースによって管理されています) ので、1997 ~ 2003 年のワード形式からのアップグレード以外のテンプレートの変更は避けたいと考えています。

現在埋め込まれているタグは、テキストに置き換えたり、画像/チャート/その他に置き換えたりする必要があります.

この MSDN 記事で説明されている手法と同様の手法を使用して、テキストを直接置換することができます。私のシナリオはもう少し複雑ですが、次のようになります。

    public void ReplaceFirstOccurrenceWithText(string tagBody, string replacement)
    {
        var modifiedText = GetCurrentText();
        modifiedText = modifiedText.ReplaceFirst(tagBody, XmlEncoder.Encode(replacement));
        using (var sw = new StreamWriter(document.MainDocumentPart.GetStream(FileMode.Create)))
        {
            sw.Write(modifiedText);
        }
    }

    public string GetCurrentText()
    {
        using(var reader = new StreamReader(document.MainDocumentPart.GetStream()))
        {
            return reader.ReadToEnd();
        }
    }

文字列を保存しない理由は、基になるドキュメントを最新の状態に保ち、通常の API を介して画像を追加できるようにするためです。別の MSDN 記事で説明されている手法を使用する:

    public void ReplaceFirstOccurrenceWithImage(string tagBody, byte[] replacement)
    {
        ReplaceFirstOccurrenceWithText(tagBody, "IMAGE TAG WAS HERE!");
        var main = document.MainDocumentPart;
        var imagePart = main.AddImagePart(ImagePartType.Gif);//sniff this by loading bytes into a bitmap
        using(var imageStream = new MemoryStream(replacement))
        {
            imagePart.FeedData(imageStream);
        }

        ImageInserter.AddImageToBody(document, main.GetIdOfPart(imagePart));
    }

ImageInserter は文字通り、その記事のコードのコピー/貼り付けです (これらの抽象化が最適ではないことは認識していますが、現時点では何かを機能させようとしています)。

ここで問題が発生します。ドキュメントは同期しているように見えます。画像は置き換えられる最初のタグであり、ドキュメントの下部に画像を追加する場合と同様に、タグのテキスト置換が機能します。私の問題は、この時点以降、後続のテキスト置換がまったく機能しないように見えることです。他のすべてのタグはドキュメントに残ります。ただし、テキスト置換関数にブレーク ポイントを設定すると、.GetCurrentText() を呼び出すたびに正しい結果が返されます (その時点までのタグが置換されたテキスト)。しかし、ドキュメントを保存すると、最初の置換のみが行われた状態で保存されます。

誰かがこのようなことに遭遇しましたか? 次のステップは、段階的なアプローチを試すことです (すべてのタグを解決し、最初にテキストの置き換えを実行し、次にすべての画像の置き換えを行います)。

4

1 に答える 1

3

もし私があなたのどこを調べたら

http://docx.codeplex.com

一般的なものについてはもっと簡単です..ライブラリが処理できるよりも複雑なことをしているかもしれませんが、私は間違いなくそれを見ていきます.

于 2012-07-20T18:36:21.207 に答える