Word 文檔中的 Table of Contents (TOC) 可讓您大致了解文檔包含的內容。此外,它還允許您導航到文檔的特定部分。在本文中,您將學習如何以編程方式處理 Word 文檔中的目錄。特別是,本文介紹瞭如何使用 C# 在 Word 文檔中添加、提取、更新或刪除目錄。

用於在 Word 文檔中添加、編輯或刪除目錄的 C# API

為了在 Word 文檔中使用目錄,我們將使用 Aspose.Words for .NET。所述 API 旨在從 .NET 應用程序中執行基本和高級 Word 自動化功能。此外,它使您能夠很好地掌握 Word 文檔中目錄的操作。您可以 下載 API 或使用 NuGet 安裝它。

PM> Install-Package Aspose.Words

在 C# 中的 Word 文檔中添加目錄

以下是使用 Aspose.Words for .NET 向 Word 文檔添加目錄的步驟。

以下代碼示例演示如何使用 C# 在 Word 文檔中添加目錄。

// 如需完整示例和數據文件,請訪問 https://github.com/aspose-words/Aspose.Words-for-.NET
// 文檔目錄的路徑。
string dataDir = RunExamples.GetDataDir_WorkingWithDocument();
// 初始化文檔。
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);

// 在文檔的開頭插入目錄。
builder.InsertTableOfContents("\\o \"1-3\" \\h \\z \\u");

// 新插入的目錄最初是空的。
// 它需要通過更新文檔中的字段來填充。
doc.UpdateFields();
dataDir = dataDir + "DocumentBuilderInsertTOC_out.doc";
doc.Save(dataDir);

C# 從 Word 文檔中提取目錄

以下是從 Word 文檔的目錄中提取字段的步驟。

  • 使用 Document 類加載 Word 文檔。
  • 使用 Document.Range.Fields 集合遍歷文檔中的每個 Field
  • 使用 Field.Type 屬性檢查字段類型是否為超鏈接。
  • 檢查該字段是否位於目錄部分的表格下方。
  • 檢索字段信息並打印。

以下代碼示例演示如何使用 C# 從 Word 文檔中提取目錄。

// 文檔目錄的路徑。
string dataDir = RunExamples.GetDataDir_WorkingWithDocument();

string fileName = "TOC.doc";
Aspose.Words.Document doc = new Aspose.Words.Document(dataDir + fileName);

foreach (Field field in doc.Range.Fields)
{
	if (field.Type.Equals(Aspose.Words.Fields.FieldType.FieldHyperlink))
	{
		FieldHyperlink hyperlink = (FieldHyperlink)field;
		if (hyperlink.SubAddress != null && hyperlink.SubAddress.StartsWith("_Toc"))
		{
			Paragraph tocItem = (Paragraph)field.Start.GetAncestor(NodeType.Paragraph);
			Console.WriteLine(tocItem.ToString(SaveFormat.Text).Trim());
			Console.WriteLine("------------------");
			if (tocItem != null)
			{
				Bookmark bm = doc.Range.Bookmarks[hyperlink.SubAddress];
				// 獲取此目錄項指向的位置
				Paragraph pointer = (Paragraph)bm.BookmarkStart.GetAncestor(NodeType.Paragraph);
				Console.WriteLine(pointer.ToString(SaveFormat.Text));
			}
		} // End If
	}// End If
}// End Foreach

在 C# 中更新 Word 文檔中的目錄

每當您將某些內容附加到 Word 文檔時,您都需要更新目錄。為了以編程方式執行此操作,您只需在保存文檔之前調用 Document.UpdateFields() 方法。

在 C# 中刪除 Word 文檔中的目錄

Aspose.Words for .NET 還允許您從 Word 文檔中刪除目錄。以下是執行此操作的步驟。

  • 首先,使用 Document 類加載 Word 文檔。
  • 獲取每個 TOC 的 FieldStart 節點並將其存儲在一個數組中。
  • 循環遍歷節點,直到獲得 FieldEnd 類型的節點(TOC 結尾)。
  • 使用 Node.Remove() 方法刪除節點並保存更新的文檔。

下面的代碼示例演示如何在 C# 中從 Word 文檔中刪除目錄。

// 如需完整示例和數據文件,請訪問 https://github.com/aspose-words/Aspose.Words-for-.NET
public static void Run()
{
    
    // 文檔目錄的路徑。
    string dataDir = RunExamples.GetDataDir_WorkingWithStyles();

    // 打開包含 TOC 的文檔。
    Document doc = new Document(dataDir + "Document.TableOfContents.doc");

    // 從文檔中刪除第一個目錄。
    RemoveTableOfContents(doc, 0);

    dataDir = dataDir + "Document.TableOfContentsRemoveToc_out.doc";
    // 保存輸出。
    doc.Save(dataDir);
    
    Console.WriteLine("\nSpecified TOC from a document removed successfully.\nFile saved at " + dataDir);
}
///<summary>
/// 從文檔中刪除指定的目錄字段。
///</summary>
///<param name="doc">要從中刪除字段的文檔。</param>
///<param name="index">要刪除的目錄的從零開始的索引。</param>
public static void RemoveTableOfContents(Document doc, int index)
{
    // 將 TOC 字段的 FieldStart 節點存儲在文檔中以便快速訪問。
    ArrayList fieldStarts = new ArrayList();
    // 這是一個列表,用於存儲在指定目錄中找到的節點。他們將被刪除
    // 在這個方法的最後。
    ArrayList nodeList = new ArrayList();

    foreach (FieldStart start in doc.GetChildNodes(NodeType.FieldStart, true))
    {
        if (start.FieldType == FieldType.FieldTOC)
        {
            // 添加所有類型為 FieldTOC 的 FieldStarts。
            fieldStarts.Add(start);
        }
    }

    // 確保傳遞的索引指定的 TOC 存在。
    if (index > fieldStarts.Count - 1)
        throw new ArgumentOutOfRangeException("TOC index is out of range");

    bool isRemoving = true;
    // 獲取指定 TOC 的 FieldStart。
    Node currentNode = (Node)fieldStarts[index];

    while (isRemoving)
    {
        // 將這些節點存儲起來,以後一次性全部刪除比較安全。
        nodeList.Add(currentNode);
        currentNode = currentNode.NextPreOrder(doc);

        // 一旦我們遇到 FieldTOC 類型的 FieldEnd 節點,我們就知道我們到了最後
        // 對於當前的 TOC,我們可以到此為止。
        if (currentNode.NodeType == NodeType.FieldEnd)
        {
            FieldEnd fieldEnd = (FieldEnd)currentNode;
            if (fieldEnd.FieldType == FieldType.FieldTOC)
                isRemoving = false;
        }
    }

    // 刪除在指定目錄中找到的所有節點。
    foreach (Node node in nodeList)
    {
        node.Remove();
    }
}

獲取免費的 API 許可證

如果您想在沒有評估限制的情況下試用 API,您可以獲得免費的臨時許可證

結論

在本文中,您了解瞭如何以編程方式使用 Word 文檔中的目錄。分步指南和代碼示例展示瞭如何使用 C# 在 Word 文檔中添加、更新、提取和刪除目錄。您可以使用 文檔 探索有關 C# Word 自動化 API 的更多信息。如果您有任何問題或疑慮,請通過我們的論壇 與我們聯繫。

也可以看看