【问题标题】:Update Content-Control Text in Header and Footer using Open XML SDK使用 Open XML SDK 更新页眉和页脚中的内容控制文本
【发布时间】:2021-04-26 12:29:55
【问题描述】:

要更改文档正文中的内容控制文本,我正在这样做:

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 并更改其文本,类似于上面的代码。我怎样才能做到这一点?

【问题讨论】:

    标签: c# openxml openxml-sdk


    【解决方案1】:

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

    所以最终的结果应该是这样的:

    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());
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      相关资源
      最近更新 更多