テンプレート レンダリング用の既存の単語自動化ベースのシステムを置き換えるプロトタイプに取り組んでおり、現在 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() を呼び出すたびに正しい結果が返されます (その時点までのタグが置換されたテキスト)。しかし、ドキュメントを保存すると、最初の置換のみが行われた状態で保存されます。
誰かがこのようなことに遭遇しましたか? 次のステップは、段階的なアプローチを試すことです (すべてのタグを解決し、最初にテキストの置き換えを実行し、次にすべての画像の置き換えを行います)。