使用打开的 xml 添加文本后删除内容控件



在这里有一些非常友好的社区成员的帮助下,我设法以编程方式创建了一个函数,以使用打开的 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);
    }
}

保持样式是一个棘手的问题,因为可能有多个样式应用于您尝试替换的文本。在这种情况下,您应该怎么做?

假设一种样式的简单情况(但可能跨越许多ParagraphsRunsTexts),您可以保留每个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();
            }
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新