Как создать оглавление (TOC) в документе Word с использованием C# и .NET


Давайте создадим простой DOCX документ с TOC содержащий два Chapters и SubChapters:

Simple DOCX document

Несколько шагов:

  1. Обратите внимание, что Вы импортируете пространство имен SautinSoft.Document.
    с помощью SautinSoft.Document;
  2. Прежде всего, создайте DocumentCore объект с именем документ.
    
    DocumentCore document = new DocumentCore();
    
    DocumentCore является корневым классом, он представляет сам документ.
  3. Создайте и добавьте стиль заголовков для TOC.
    
    ParagraphStyle Heading1Style = (ParagraphStyle)Style.CreateStyle(StyleTemplateType.Heading1, document);	
        document.Styles.Add(Heading1Style);
    ParagraphStyle Heading2Style = (ParagraphStyle)Style.CreateStyle(StyleTemplateType.Heading2, document);			
        document.Styles.Add(Heading2Style);
    
    Стили заголовков Word называются Heading 1, Heading 2 и далее до Heading 9. Используйте их для идентификации различных частей документа, но они также используют преимущества других функций Word.
    Если вы хотите узнать больше о стилях и форматировании, пожалуйста, перейдите на наш сайт. пример о расширенном форматировании.
  4. Добавьте новый Section с параграфами в наш документ.
    
        Section section = new Section(document);
        document.Sections.Add(section);
        
        section.Blocks.Add(new Paragraph(document, "Table of Contents"));
        section.Blocks.Add(new TableOfEntries(document, FieldType.TOC));
        section.Blocks.Add(new Paragraph(document, "The end."));
    
    Section (Раздел) — это набор Block элементов, сгруппированных по концепции унифицированных свойств страницы и имеющих определенные верхние и нижние колонтитулы.
    Создавать TOCприменяя стили заголовков — например, Heading 1, Heading 2 и Heading 3 — к тексту, который вы хотите включить в оглавление.
    Document.Net выполняет поиск этих заголовков, а затем вставляет оглавление в ваш документ.
  5. Создайте новый параграф для главы и подраздела.
    
        // Add document content.
    			// Add Chapter 1
        section.Blocks.Add(
    				new Paragraph(document, "Chapter 1")
    				{
    					ParagraphFormat =
    					{
    						Style = Heading1Style
    					}
    				});
    
    			// Add SubChapter 1-1
    			section.Blocks.Add(
    						new Paragraph(document, String.Format("Subchapter 1-1"))
    						{
    							ParagraphFormat =
    							{
    							Style = Heading2Style
    							}
    						});
    			// Add the content of Chapter 1 / Subchapter 1-1
    			section.Blocks.Add(
    						new Paragraph(document,
    							"«SautinSoft.Document» will help you in development of applications which operates with DOCX, RTF, PDF and Text documents. After adding of the reference to (SautinSoft.Document.dll) - it's 100% C# managed assembly you will be able to create a new document, parse an existing, modify anything what you want."));
    
    
    Paragraph -это производный от Block элемент, используемый для группировки встроенных элементов, таких как бег, фигура, изображение, поле и т.д.
  6. Когда вы создаете оглавление таким образом, вы можете автоматически обновлять его, если вносите изменения в свой документ.
    TOC может быть обновлен только после добавления всего содержимого документа.
    
       var toc = (TableOfEntries)document.GetChildElements(true, ElementType.TableOfEntries).FirstOrDefault();
       toc.Update();
    
    // Update TOC's page numbers.
    // Page numbers are automatically updated in that case.
       document.GetPaginator(new PaginatorOptions() { UpdateFields = true });
    
    Разбиение на страницы используется для разделения документа на отдельные страницы.
  7. Сохраните наш документ в формате DOCX.
    
        // Save DOCX to a file
        document.Save("Table-Of-Contents.docx");
    
    Загрузите полученный Docx-файл: Table-Of-Contents.docx
 

Полный код

using System;
using System.Linq;
using SautinSoft.Document;

namespace Example
{
    class Program
    {
        static void Main(string[] args)
        {
            TOC();
        }

        /// <summary>
        /// Create a document with table of content.
        /// </summary>
        /// <remarks>
        /// Details: https://sautinsoft.com/products/document/help/net/developer-guide/create-and-update-table-of-contents-in-word-document-net-csharp-vb.php
        /// </remarks>
        public static void TOC()
        {
            string resultFile = "Table-Of-Contents.docx";

            // Let's create a simple document.
            DocumentCore dc = new DocumentCore();

            // Create and add Heading 1 style for TOC.
            ParagraphStyle Heading1Style = (ParagraphStyle)Style.CreateStyle(StyleTemplateType.Heading1, dc);
            dc.Styles.Add(Heading1Style);

            // Create and add Heading 2 style for TOC.
            ParagraphStyle Heading2Style = (ParagraphStyle)Style.CreateStyle(StyleTemplateType.Heading2, dc);
            dc.Styles.Add(Heading2Style);

            // Add new section.
            Section section = new Section(dc);
            dc.Sections.Add(section);

            // Add TOC title in the DOCX document.
            section.Blocks.Add(new Paragraph(dc, "Table of Contents"));

            // Create and add new TOC.
            section.Blocks.Add(new TableOfEntries(dc, FieldType.TOC));

            section.Blocks.Add(new Paragraph(dc, "The end."));

            // Let's add a page break into our paragraph.
            section.Blocks.Add(
                    new Paragraph(dc,
                    new SpecialCharacter(dc, SpecialCharacterType.PageBreak)));

            // Add document content.
            // Add Chapter 1
            section.Blocks.Add(
                new Paragraph(dc, "Chapter 1")
                {
                    ParagraphFormat =
                    {
                Style = Heading1Style
                    }
                });

            // Add SubChapter 1-1
            section.Blocks.Add(
                        new Paragraph(dc, String.Format("Subchapter 1-1"))
                        {
                            ParagraphFormat =
                            {
                    Style = Heading2Style
                            }
                        });
            // Add the content of Chapter 1 / Subchapter 1-1
            section.Blocks.Add(
                        new Paragraph(dc,
                            "«SautinSoft.Document» will help you in development of applications which operates with DOCX, RTF, PDF and Text documents. After adding of the reference to (SautinSoft.Document.dll) - it's 100% C# managed assembly you will be able to create a new document, parse an existing, modify anything what you want."));

            // Let's add an another page break into our paragraph.
            section.Blocks.Add(
                   new Paragraph(dc,
                   new SpecialCharacter(dc, SpecialCharacterType.PageBreak)));

            // Add document content.
            // Add Chapter 2
            section.Blocks.Add(
                     new Paragraph(dc, "Chapter 2")
                     {
                         ParagraphFormat =
                         {
                Style = Heading1Style
                         }
                     });

            // Add SubChapter 2-1
            section.Blocks.Add(
                new Paragraph(dc, String.Format("Subchapter 2-1"))
                {
                    ParagraphFormat =
                    {
                    Style = Heading2Style
                    }
                });

            // Add the content of Chapter 2 / Subchapter 2-1
            section.Blocks.Add(
                        new Paragraph(dc,
                            "Requires only .Net 4.0 or above. Our product is compatible with all .Net languages and supports all Operating Systems where .Net Framework can be used. Note that «SautinSoft.Document» is entirely written in managed C#, which makes it absolutely standalone and an independent library. Of course, No dependency on Microsoft Word."));

            // Update TOC (TOC can be updated only after all document content is added).
            var toc = (TableOfEntries)dc.GetChildElements(true, ElementType.TableOfEntries).FirstOrDefault();
            toc.Update();

            // Update TOC's page numbers.
            // Page numbers are automatically updated in that case.
            dc.GetPaginator(new PaginatorOptions() { UpdateFields = true });

            // Save DOCX to a file
            dc.Save(resultFile);

            // Open the result for demonstration purposes.
            System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(resultFile) { UseShellExecute = true });
        }
    }
}

Скачать

Option Infer On

Imports System
Imports System.Linq
Imports SautinSoft.Document

Module Sample
    Sub Main()
        TOC()
    End Sub

    ''' <summary>
    ''' Create a document with table of content.
    ''' </summary>
    ''' <remarks>
    ''' Details: https://sautinsoft.com/products/document/help/net/developer-guide/table-of-contents-../toc.php
    ''' </remarks>
    Sub TOC()
        Dim resultFile As String = "Table-Of-Contents.docx"

        ' Let's create a simple document.
        Dim dc As New DocumentCore()

        ' Create and add Heading 1 style for TOC.
        Dim Heading1Style As ParagraphStyle = CType(Style.CreateStyle(StyleTemplateType.Heading1, dc), ParagraphStyle)
        dc.Styles.Add(Heading1Style)

        ' Create and add Heading 2 style for TOC.
        Dim Heading2Style As ParagraphStyle = CType(Style.CreateStyle(StyleTemplateType.Heading2, dc), ParagraphStyle)
        dc.Styles.Add(Heading2Style)

        ' Add new section.
        Dim section As New Section(dc)
        dc.Sections.Add(section)

        ' Add TOC title in the DOCX document.
        section.Blocks.Add(New Paragraph(dc, "Table of Contents"))

        ' Create and add new TOC.
        section.Blocks.Add(New TableOfEntries(dc, FieldType.TOC))

        section.Blocks.Add(New Paragraph(dc, "The end."))

        ' Let's add a page break into our paragraph.
        section.Blocks.Add(New Paragraph(dc, New SpecialCharacter(dc, SpecialCharacterType.PageBreak)))

        ' Add document content.
        ' Add Chapter 1
        section.Blocks.Add(New Paragraph(dc, "Chapter 1") With {
            .ParagraphFormat = New ParagraphFormat With
            {.Style = Heading1Style}
        })

        ' Add SubChapter 1-1
        section.Blocks.Add(New Paragraph(dc, String.Format("Subchapter 1-1")) With {
            .ParagraphFormat = New ParagraphFormat With
             {.Style = Heading2Style}
        })
        ' Add the content of Chapter 1 / Subchapter 1-1
        section.Blocks.Add(New Paragraph(dc, "«SautinSoft.Document» will help you in development of applications which operates with DOCX, RTF, PDF and Text documents. After adding of the reference to (SautinSoft.Document.dll) - it's 100% C# managed assembly you will be able to create a new document, parse an existing, modify anything what you want."))

        ' Let's add an another page break into our paragraph.
        section.Blocks.Add(New Paragraph(dc, New SpecialCharacter(dc, SpecialCharacterType.PageBreak)))

        ' Add document content.
        ' Add Chapter 2
        section.Blocks.Add(New Paragraph(dc, "Chapter 2") With {
            .ParagraphFormat = New ParagraphFormat With
            {.Style = Heading1Style}
        })

        ' Add SubChapter 2-1
        section.Blocks.Add(New Paragraph(dc, String.Format("Subchapter 2-1")) With {
            .ParagraphFormat = New ParagraphFormat With
            {.Style = Heading2Style}
        })

        ' Add the content of Chapter 2 / Subchapter 2-1
        section.Blocks.Add(New Paragraph(dc, "Requires only .Net 4.0 or above. Our product is compatible with all .Net languages and supports all Operating Systems where .Net Framework can be used. Note that «SautinSoft.Document» is entirely written in managed C#, which makes it absolutely standalone and an independent library. Of course, No dependency on Microsoft Word."))

        ' Update TOC (TOC can be updated only after all document content is added).
        'INSTANT VB NOTE: The variable toc was renamed since Visual Basic does not handle local variables named the same as class members well:
        Dim toc_Renamed = CType(dc.GetChildElements(True, ElementType.TableOfEntries).FirstOrDefault(), TableOfEntries)
        toc_Renamed.Update()

        ' Update TOC's page numbers.
        ' Page numbers are automatically updated in that case.
        dc.GetPaginator(New PaginatorOptions() With {.UpdateFields = True})

        ' Save DOCX to a file
        dc.Save(resultFile)

        ' Open the result for demonstration purposes.
        System.Diagnostics.Process.Start(New System.Diagnostics.ProcessStartInfo(resultFile) With {.UseShellExecute = True})
    End Sub
End Module

Скачать


Если вам нужен пример кода или у вас есть вопрос: напишите нам по адресу [email protected] или спросите в онлайн-чате (правый нижний угол этой страницы) или используйте форму ниже:



Вопросы и предложения всегда приветствуются!

Мы разрабатываем компоненты .Net с 2002 года. Мы знаем форматы PDF, DOCX, RTF, HTML, XLSX и Images. Если вам нужна помощь в создании, изменении или преобразовании документов в различных форматах, мы можем вам помочь. Мы напишем для вас любой пример кода абсолютно бесплатно.