使用 MS OpenXml Sdk,我能够将模板流复制到结果流并使用以下代码在正文末尾附加动态文本(wp>>wr>>wt):
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();
}
我的下一个合乎逻辑的步骤是用 firstName 替换 resultStream 中文本框的内部文本,如下面的代码所示。
// 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();
在第一个示例和一些附加代码中,结果流被适当地序列化为 docx,并且在 Word 中查看时,firstName 被附加到正文的末尾。在第二个示例中,尽管在调试器中进一步检查显示 textboxContent 的子项反映了上面所做的更改,但文本框及其内容保持不变。
我是 OpenXML 开发的新手,所以如果有什么明显的地方请指出。