如何解决使用 Open XML SDK 更新页眉和页脚中的内容控制文本
要更改文档正文中的内容控制文本,我这样做:
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 并像上面的代码一样更改其文本。我怎样才能做到这一点?
解决方法
页眉和页脚不在 MainDocumentPart.Document
中,它们是 HeaderParts
之外的 FooterParts
和 MainDocumentPart
集合中的子部分。所以你需要分别处理每个部分。幸运的是,所有部分共享一个公共基类 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());
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。