首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Open XML SDK更新页眉和页脚中的内容控件文本

使用Open XML SDK更新页眉和页脚中的内容控件文本
EN

Stack Overflow用户
提问于 2021-04-25 00:11:18
回答 1查看 72关注 0票数 1

要更改文档正文中的Content-Control文本,我将执行以下操作:

代码语言:javascript
复制
var elements = doc.MainDocumentPart.Document
    .Descendants<SdtElement>()
    .Where(s => s.SdtProperties.ChildElements.Count > 0 && 
                s.SdtProperties.GetFirstChild<Tag>()?.Val == contentControlTag);

foreach (var element in elements)
{
    if (element == null)
    {
        continue;
    }

    var elementText = element.Descendants<Text>();

    if (elementText != null)
    {
        var elementTextValue = elementText.FirstOrDefault();

        if (elementTextValue != null)
        {
            elementTextValue.Text = text;
        }
        elementText.Skip(1).ToList().ForEach(t => t.Remove());
    }
}

遗憾的是,这并没有改变页眉/页脚部分。

我想检查每个页面的页眉/页脚部分,以获得特定的Content-Control-Tag,并更改其文本,类似于上面的代码。我如何才能做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-26 12:05:39

页眉和页脚不在MainDocumentPart.Document中,它们是MainDocumentPart上的HeaderPartsFooterParts集合中的子部分。因此,您需要分别处理每个部分。幸运的是,所有这些部分共享一个公共基类OpenXmlPart,因此您可以将它们放在一个列表中,并在循环中处理它们。由于您将处理基类,因此需要使用RootElement属性而不是Document作为获取Descendants的起点。

因此,最终结果将如下所示:

代码语言:javascript
复制
var partsToUpdate = new List<OpenXmlPart> { doc.MainDocumentPart }
    .Concat(doc.MainDocumentPart.HeaderParts)
    .Concat(doc.MainDocumentPart.FooterParts);

foreach (var part in partsToUpdate)
{
    var elements = part.RootElement
        .Descendants<SdtElement>()
        .Where(s => s.SdtProperties.ChildElements.Count > 0 &&
                    s.SdtProperties.GetFirstChild<Tag>()?.Val == contentControlTag);

    foreach (var element in elements)
    {
        if (element == null)
        {
            continue;
        }

        var elementText = element.Descendants<Text>();

        if (elementText != null)
        {
            var elementTextValue = elementText.FirstOrDefault();

            if (elementTextValue != null)
            {
                elementTextValue.Text = text;
            }
            elementText.Skip(1).ToList().ForEach(t => t.Remove());
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67244871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档