在这里有一些非常友好的社区成员的帮助下,我设法以编程方式创建了一个函数,以使用打开的 xml 替换 Word 文档中内容控件内的文本。生成文档后,它会在我替换文本后删除文本的格式。
关于如何仍然保持单词格式并删除内容控制标签的任何想法?
这是我的代码:
using (var wordDoc = WordprocessingDocument.Open(mem, true))
{
var mainPart = wordDoc.MainDocumentPart;
ReplaceTags(mainPart, "FirstName", _firstName);
ReplaceTags(mainPart, "LastName", _lastName);
ReplaceTags(mainPart, "WorkPhoe", _workPhone);
ReplaceTags(mainPart, "JobTitle", _jobTitle);
mainPart.Document.Save();
SaveFile(mem);
}
private static void ReplaceTags(MainDocumentPart mainPart, string tagName, string tagValue)
{
//grab all the tag fields
IEnumerable<SdtBlock> tagFields = mainPart.Document.Body.Descendants<SdtBlock>().Where
(r => r.SdtProperties.GetFirstChild<Tag>().Val == tagName);
foreach (var field in tagFields)
{
//remove all paragraphs from the content block
field.SdtContentBlock.RemoveAllChildren<Paragraph>();
//create a new paragraph containing a run and a text element
Paragraph newParagraph = new Paragraph();
Run newRun = new Run();
Text newText = new Text(tagValue);
newRun.Append(newText);
newParagraph.Append(newRun);
//add the new paragraph to the content block
field.SdtContentBlock.Append(newParagraph);
}
}
保持样式是一个棘手的问题,因为可能有多个样式应用于您尝试替换的文本。在这种情况下,您应该怎么做?
假设一种样式的简单情况(但可能跨越许多Paragraphs
,Runs
和Texts
),您可以保留每个SdtBlock
遇到的第一个Text
元素,并将所需的值放在该元素中,然后从SdtBlock
中删除任何进一步的Text
元素。然后,将保留第一个Text
元素的格式。显然,您可以将此理论应用于任何Text
块;您不必使用第一个。下面的代码应该显示我的意思:
private static void ReplaceTags(MainDocumentPart mainPart, string tagName, string tagValue)
{
IEnumerable<SdtBlock> tagFields = mainPart.Document.Body.Descendants<SdtBlock>().Where
(r => r.SdtProperties.GetFirstChild<Tag>().Val == tagName);
foreach (var field in tagFields)
{
IEnumerable<Text> texts = field.SdtContentBlock.Descendants<Text>();
for (int i = 0; i < texts.Count(); i++)
{
Text text = texts.ElementAt(i);
if (i == 0)
{
text.Text = tagValue;
}
else
{
text.Remove();
}
}
}
}