如何通过OpenXML设置标题的“链接到上一个”设置

时间:2019-09-05 07:26:58

标签: c# ms-word openxml

我已经使用Telerik Report生成器创建了Word docx文件。每个页面都包含一个标题。当我打开docx时,最初看起来不错...

现在所有页面上的标题都可以正确输出,但是,如果我在标题上进行了更改,则该更改不会反映在所有后续标题上。原来这是因为标头未“链接到上一个”标头。此屏幕快照显示了启用了工具栏按钮“链接到上一个”,以及标题本身的“与上一个相同”修饰,以指示此标题将与第一个标题共享完全相同的内容。

enter image description here

现在,我试图弄清楚如何通过OpenXML进行编程设置。这使我得到了一些类似的代码示例,例如Replace the header in a word processing document (Open XML SDK)。根据我的收集,方法是找到第一个标题的ID,然后在文档的所有部分中,删除现有的标题并将其替换为对第一个标题的引用。

我想到了这个

private void FixDocument(string outputFile)
{
    using (var wdDoc = WordprocessingDocument.Open(outputFile, true))
    {
        MainDocumentPart mainPart = wdDoc.MainDocumentPart;
        var firstHeader = mainPart.HeaderParts.FirstOrDefault();
        var firstHeaderId = mainPart.GetIdOfPart(firstHeader);

        // Get SectionProperties and Replace HeaderReference and FooterRefernce with new Id

        var sections = mainPart.Document.Descendants<SectionProperties>();    
        foreach (var section in sections)
        {
            // Delete existing references to headers and footers
            section.RemoveAllChildren<HeaderReference>();
            // Create the new header and footer reference node
            section.PrependChild<HeaderReference>(new HeaderReference() { Id = firstHeaderId, Type = HeaderFooterValues.Default });
        }              
    }
}

保存文档并将其打开后,似乎a)原始标题仍然存在,并且没有一个链接到第一个。

我不确定我哪里出了错-任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

如果文档的第一部分具有所需的页眉和/或页脚,那么我认为为了在其余部分上获得“ 链接到上一页”,您只需删除所有页眉和/或在其上指定的页脚。

换句话说,试试这个:

private void FixDocument(string outputFile)
{
    using (var wdDoc = WordprocessingDocument.Open(outputFile, true))
    {
        var mainPart = wdDoc.MainDocumentPart;
        var sections = mainPart.Document.Descendants<SectionProperties>().Skip(1);

        foreach (var section in sections)
        {
            section.RemoveAllChildren<HeaderReference>();
        }
    }
}