Mit dem MS OpenXml Sdk konnte ich einen Templatestream in einen Ergebnisstrom kopieren und dynamischen Text (w.p>>w.r>>w.t) am Ende des Körpers mit dem folgenden Code anhängen:
var templateStream = File.OpenRead(templatePath);
templateStream.CopyTo(resultStream);
using (var resultPackage = WordprocessingDocument.Open(resultStream, true))
{
var document = resultPackage.MainDocumentPart.Document;
var body = document.Body;
// Add new text.
var para = body.AppendChild(new Paragraph());
var run = para.AppendChild(new Run());
run.AppendChild(new Text(firstName));
document.Save();
}
Mein nächster logischer Schritt bestand darin, den inneren Text eines Textfelds im resultStream durch den Vornamen zu ersetzen, wie im folgenden Code dargestellt.
// replacing code in using statement from above
var document = resultPackage.MainDocumentPart.Document;
var textbox = document.Descendants<TextBox>().First();
const string firstNametag = "<<IH.FirstName>>";
if (textbox.InnerText.Contains(firstNametag))
{
var textboxContent = textbox.Elements<TextBoxContent>().First();
textboxContent.RemoveAllChildren();
var paragraph = textboxContent.AppendChild(new Paragraph());
var run = paragraph.AppendChild(new Run());
run.AppendChild(new Text(firstName));
}
document.Save();
Im ersten Beispiel und mit etwas zusätzlichem Code wird der Ergebnisstrom entsprechend zu einem docx serialisiert und der firstName wird bei der Anzeige in Word an das Ende des Körpers angehängt. Im zweiten Beispiel bleiben das Textfeld und sein Inhalt jedoch unverändert, obwohl eine weitere Untersuchung im Debugger zeigte, dass die Kinder von textboxContent die oben vorgenommenen Änderungen widerspiegeln.
Ich bin neu in der OpenXML-Entwicklung, wenn also etwas offensichtlich ist, weisen Sie mich bitte darauf hin.