文档部分

Document Sections

我正在使用 C# 将数据从数据库导出到 WinForms 中的 word 文档

生成的文档有 5 个部分,因为使用了:

Range.InsertBreak(WdBreakType.wdSectionBreakNextPage);

我想知道的是,我如何分别引用每个部分 - 这样我就可以为每个部分设置不同的 header,而不是这样做:

 foreach (Section section in aDoc.Sections)
            {
                //Get the header range and add the header details.
                var headerRange = section.Headers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
                headerRange.Fields.Add(headerRange, WdFieldType.wdFieldPage);
                headerRange.ParagraphFormat.Alignment = WdParagraphAlignment.wdAlignParagraphLeft;
                headerRange.Font.ColorIndex = WdColorIndex.wdBlack;
                headerRange.Font.Size = 14;
                headerRange.Font.Name = "Arial";
                headerRange.Font.Bold = 1;
                headerRange.Text = Some Header Here;
                headerRange.ParagraphFormat.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphCenter;
           }

因为这会将每个 header 设置为 "Some Header Here"

由于 Sections 属性 只是一个未类型化的 IEnumerable,您可以执行以下操作以从中创建一个类型化的部分列表。请注意,您需要导入 System.LinqSystem.Collections.Generic 命名空间才能正常工作。

List<Section> sections = new List<Section>(aDoc.Sections.Cast<Sections>());

现在,如果你需要设置特定部分的header,你可以写

Section section1 = sections[0];
var section1HeaderRange = section1.Headers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
section1HeaderRange.Text = "Section 1 Header";

Section section2 = sections[1];
var section2HeaderRange = section2.Headers[WdHeaderFooterIndex.wdHeaderFooterPrimary].Range;
section2HeaderRange.Text = "Section 2 Header";

默认情况下,当在 Word 文档中生成新节时,属性 LinkToPrevious 设置为 True。这意味着新部分 "inherits" 上一节的 headers 和页脚。

为了在每个部分有不同的 header/footer 内容,需要将 LinkToPrevious 设置为 False。这可以在您创建部分时完成,也可以在之后的任何时间完成,但应该在 将内容写入 header/footer 之前完成。如果 link 被破坏 之后 header/footer 包含内容,该内容将丢失(但确实保留在 "parent" header/footer link编辑的部分)。

因此,要解决一个单独的部分,请删除 link,然后将内容写入其 Header,您可以:

Word.Section sec = doc.Sections[indexValue]
Word.HeaderFooter hf = sec.Headers[Word.WdHeaderFooterIndex.wdHeaderFooterPrimary];
hf.LinkToPrevious = false;
hf.Range.Text = "Content for this header";

注意:不需要为了给它们不同的内容而将这些部分写入一个列表。