我已经使用Telerik Report生成器创建了Word docx文件。每个页面都包含一个标题。当我打开docx时,最初看起来不错...
现在所有页面上的标题都可以正确输出,但是,如果我在标题上进行了更改,则该更改不会反映在所有后续标题上。原来这是因为标头未“链接到上一个”标头。此屏幕快照显示了启用了工具栏按钮“链接到上一个”,以及标题本身的“与上一个相同”修饰,以指示此标题将与第一个标题共享完全相同的内容。
现在,我试图弄清楚如何通过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)原始标题仍然存在,并且没有一个链接到第一个。
我不确定我哪里出了错-任何帮助将不胜感激。
答案 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>();
}
}
}