要更改文档正文中的Content-Control文本,我将执行以下操作:
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,并更改其文本,类似于上面的代码。我如何才能做到这一点?
发布于 2021-04-26 12:05:39
页眉和页脚不在MainDocumentPart.Document中,它们是MainDocumentPart上的HeaderParts和FooterParts集合中的子部分。因此,您需要分别处理每个部分。幸运的是,所有这些部分共享一个公共基类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());
}
}
}https://stackoverflow.com/questions/67244871
复制相似问题