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 文檔添加目錄的步驟。
- 創建 Document 類的實例(如果加載現有 Word 文檔,請在構造函數中提供文件路徑)。
- 創建 DocumentBuilder 類的實例並使用之前創建的 Document 對像對其進行初始化。
- 使用 DocumentBuilder.InsertTableOfContents("\\o \"1-3\" \\h \\z \\u") 方法插入目錄。
- 使用 Document.UpdateFields() 方法更新字段。
- 使用 Document.Save(String) 方法保存 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 的更多信息。如果您有任何問題或疑慮,請通過我們的論壇 與我們聯繫。