MS OpenXml Sdkの使用テンプレートストリームをresultstreamにコピーし、本文の末尾にダイナミックテキスト(wp >> wr >> wt)を追加するには、次のコードを使用することができました:TextBoxのInnerTextの置換
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();
}
私の次の論理的なステップは、resultStream内のテキストボックスのinnertextを、以下のコードのようにfirstNameに置き換えることでした。最初の例において、結果ストリームがDOCXに適切にシリアライズされ、Wordで見たときのfirstNameが本体の端部に付加されるいくつかの追加のコードで
// 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();
。 2番目の例では、デバッガでさらに検討した結果、textboxContentの子オブジェクトが上記の変更を反映していたとしても、テキストボックスとその内容は同じになりました。
私はOpenXML開発の初心者です。明らかなことがあれば、それを指摘してください。