Mục lục(TOC) trong tài liệu Word cung cấp cho bạn tổng quan về nội dung tài liệu chứa. Hơn nữa, nó cho phép bạn điều hướng đến một phần cụ thể của tài liệu. Trong bài viết này, bạn sẽ học cách làm việc với mục lục trong tài liệu Word theo chương trình. Đặc biệt, bài viết này trình bày cách thêm, trích xuất, cập nhật hoặc loại bỏ mục lục trong tài liệu Word bằng C#.

API C# để Thêm, Chỉnh sửa hoặc Xóa TOC trong Tài liệu Word

Để làm việc với mục lục trong tài liệu Word, chúng tôi sẽ sử dụng Aspose.Words for .NET. API nói trên được thiết kế để thực hiện các tính năng tự động hóa Word cơ bản cũng như nâng cao từ bên trong các ứng dụng .NET. Hơn nữa, nó cung cấp cho bạn khả năng thao tác tốt với mục lục trong tài liệu Word. Bạn có thể tải xuống API hoặc cài đặt nó bằng NuGet.

PM> Install-Package Aspose.Words

Thêm Mục lục trong Tài liệu Word trong C#

Sau đây là các bước để thêm mục lục vào tài liệu Word bằng cách sử dụng Aspose.Words for .NET.

Mẫu mã sau đây cho thấy cách thêm mục lục trong tài liệu Word trong C#.

// Để có các ví dụ và tệp dữ liệu đầy đủ, vui lòng truy cập https://github.com/aspose-words/Aspose.Words-for-.NET
// Đường dẫn đến thư mục tài liệu.
string dataDir = RunExamples.GetDataDir_WorkingWithDocument();
// Khởi tạo tài liệu.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);

// Chèn mục lục vào đầu tài liệu.
builder.InsertTableOfContents("\\o \"1-3\" \\h \\z \\u");

// Mục lục mới được chèn vào ban đầu sẽ trống.
// Nó cần được điền bằng cách cập nhật các trường trong tài liệu.
doc.UpdateFields();
dataDir = dataDir + "DocumentBuilderInsertTOC_out.doc";
doc.Save(dataDir);

C# Trích xuất Mục lục từ Tài liệu Word

Sau đây là các bước để trích xuất các trường từ mục lục trong tài liệu Word.

  • Tải tài liệu Word bằng lớp Tài liệu.
  • Lặp qua từng Trường trong tài liệu bằng cách sử dụng bộ sưu tập Document.Range.Fields.
  • Kiểm tra xem loại trường có phải là siêu kết nối hay không bằng cách sử dụng thuộc tính Field.Type.
  • Kiểm tra xem trường có nằm trong phần mục lục không.
  • Lấy thông tin của trường và in nó.

Mẫu mã sau đây cho thấy cách trích xuất mục lục từ tài liệu Word bằng C#.

// Đường dẫn đến thư mục tài liệu.
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];
				// Tìm vị trí mà Mục TOC này đang trỏ đến
				Paragraph pointer = (Paragraph)bm.BookmarkStart.GetAncestor(NodeType.Paragraph);
				Console.WriteLine(pointer.ToString(SaveFormat.Text));
			}
		} // End If
	}// End If
}// End Foreach

Cập nhật Mục lục trong Tài liệu Word trong C#

Bất cứ khi nào bạn nối một số nội dung vào tài liệu Word, bạn cần cập nhật mục lục. Để làm điều đó theo chương trình, bạn chỉ cần gọi phương thức Document.UpdateFields() trước khi lưu tài liệu.

Loại bỏ Mục lục trong Tài liệu Word trong C#

Aspose. AdWords for .NET cũng cho phép bạn xóa mục lục khỏi tài liệu Word. Sau đây là các bước để thực hiện thao tác này.

  • Đầu tiên, tải tài liệu Word bằng lớp Tài liệu.
  • Nhận và lưu trữ các nút FieldStart của mỗi TOC trong một mảng.
  • Lặp qua các nút cho đến khi bạn nhận được nút kiểu FieldEnd(cuối TOC).
  • Loại bỏ các nút bằng phương pháp Node.Remove() và lưu tài liệu đã cập nhật.

Mẫu mã sau đây cho thấy cách xóa mục lục khỏi tài liệu Word trong C#.

// Để có các ví dụ và tệp dữ liệu đầy đủ, vui lòng truy cập https://github.com/aspose-words/Aspose.Words-for-.NET
public static void Run()
{
    
    // Đường dẫn đến thư mục tài liệu.
    string dataDir = RunExamples.GetDataDir_WorkingWithStyles();

    // Mở tài liệu có TOC.
    Document doc = new Document(dataDir + "Document.TableOfContents.doc");

    // Xóa mục lục đầu tiên khỏi tài liệu.
    RemoveTableOfContents(doc, 0);

    dataDir = dataDir + "Document.TableOfContentsRemoveToc_out.doc";
    // Lưu đầu ra.
    doc.Save(dataDir);
    
    Console.WriteLine("\nSpecified TOC from a document removed successfully.\nFile saved at " + dataDir);
}
///<summary>
/// Xóa trường mục lục được chỉ định khỏi tài liệu.
///</summary>
///<param name="doc"> Tài liệu để xóa trường khỏi đó.</param>
///<param name="index"> Chỉ số dựa trên 0 của TOC để loại bỏ.</param>
public static void RemoveTableOfContents(Document doc, int index)
{
    // Lưu trữ các nút FieldStart của các trường TOC trong tài liệu để truy cập nhanh.
    ArrayList fieldStarts = new ArrayList();
    // Đây là danh sách để lưu trữ các nút được tìm thấy bên trong TOC được chỉ định. Chúng sẽ bị loại bỏ
    // Khi kết thúc phương pháp này.
    ArrayList nodeList = new ArrayList();

    foreach (FieldStart start in doc.GetChildNodes(NodeType.FieldStart, true))
    {
        if (start.FieldType == FieldType.FieldTOC)
        {
            // Thêm tất cả các FieldStart thuộc loại FieldTOC.
            fieldStarts.Add(start);
        }
    }

    // Đảm bảo TOC được chỉ định bởi chỉ mục được chuyển tồn tại.
    if (index > fieldStarts.Count - 1)
        throw new ArgumentOutOfRangeException("TOC index is out of range");

    bool isRemoving = true;
    // Lấy FieldStart của TOC được chỉ định.
    Node currentNode = (Node)fieldStarts[index];

    while (isRemoving)
    {
        // Sẽ an toàn hơn nếu lưu trữ các nút này và xóa tất cả chúng cùng một lúc sau đó.
        nodeList.Add(currentNode);
        currentNode = currentNode.NextPreOrder(doc);

        // Khi chúng ta gặp một nút FieldEnd thuộc loại FieldTOC thì chúng ta biết rằng chúng ta đang ở cuối
        // Của TOC hiện tại và chúng ta có thể dừng ở đây.
        if (currentNode.NodeType == NodeType.FieldEnd)
        {
            FieldEnd fieldEnd = (FieldEnd)currentNode;
            if (fieldEnd.FieldType == FieldType.FieldTOC)
                isRemoving = false;
        }
    }

    // Loại bỏ tất cả các nút được tìm thấy trong TOC được chỉ định.
    foreach (Node node in nodeList)
    {
        node.Remove();
    }
}

Nhận giấy phép API miễn phí

Trong trường hợp bạn muốn dùng thử API mà không có giới hạn đánh giá, bạn có thể nhận giấy phép tạm thời miễn phí.

Sự kết luận

Trong bài viết này, bạn đã học cách làm việc với mục lục trong tài liệu Word theo chương trình. Hướng dẫn từng bước và các mẫu mã đã chỉ ra cách thêm, cập nhật, trích xuất và xóa mục lục khỏi tài liệu Word trong C#. Bạn có thể khám phá thêm về API tự động hóa C# Word bằng cách sử dụng tài liệu. Trong trường hợp bạn có bất kỳ câu hỏi hoặc thắc mắc nào, vui lòng liên hệ với chúng tôi qua diễn đàn của chúng tôi.

Xem thêm