Mục lục (TOC) là một phần quan trọng của Tài liệu Word. Nó cung cấp một cái nhìn tổng quan về nội dung của tài liệu và cho phép bạn điều hướng đến phần mong muốn của mình một cách nhanh chóng. Bạn có thể thấy mình trong các tình huống mà bạn cần thêm, trích xuất, cập nhật hoặc xóa mục lục khỏi tài liệu Word theo chương trình. Để kết thúc, bài viết này sẽ hướng dẫn bạn cách làm việc với mục lục trong tệp Word bằng C ++.

API C ++ để làm việc với Mục lục trong Tài liệu Word

Aspose.Words for C ++ là một thư viện C ++ gốc cho phép bạn tạo, đọc, sửa đổi và chuyển đổi các tài liệu Microsoft Word. Ngoài ra, nó còn hỗ trợ làm việc với mục lục trong file Word. Bạn có thể cài đặt API thông qua NuGet hoặc tải xuống trực tiếp từ phần Tải xuống.

PM> Install-Package Aspose.Words.Cpp

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

Sau đây là các bước để thêm mục lục trong tài liệu Word.

Đoạn mã mẫu sau đây cho biết cách thêm mục lục trong tài liệu Word bằng C ++.

// Đường dẫn thư mục nguồn và đầu ra.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";

// Tải tệp Word
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"Sample 5.docx");

// Tạo một phiên bản của lớp DocumentBuilder
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);

// Chèn mục lục vào đầu tài liệu.
builder->InsertTableOfContents(u"\\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();

// Đường dẫn tệp đầu ra
System::String outputPath = outputDataDir + u"AddTOC.docx";

// Lưu tệp Word
doc->Save(outputPath);
Xuất ra tệp Word có chứa Mục lục

Xuất ra tệp Word có chứa Mục lụ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 mục lục từ tài liệu Word.

Đoạn mã mẫu sau đây trình bày cách trích xuất mục lục từ tài liệu Word bằng C ++.

// Nguồn trực tiếp
System::String inputDataDir = u"SourceDirectory\\";

// Tải tệp Word
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"SampleTOC.docx");

// Vòng qua các cánh đồng
for (System::SharedPtr<Field> field : System::IterateOver(doc->get_Range()->get_Fields()))
{
	// Nhận các trường FieldHyperlink
	if (field->get_Type() == FieldType::FieldHyperlink)
	{
		System::SharedPtr<FieldHyperlink> hyperlink = System::DynamicCast<FieldHyperlink>(field);

		// Kiểm tra xem trường có thuộc TOC không
		if (hyperlink->get_SubAddress() != nullptr && hyperlink->get_SubAddress().StartsWith(u"_Toc"))
		{
			System::SharedPtr<Paragraph> tocItem = System::DynamicCast<Paragraph>(field->get_FieldStart()->GetAncestor(NodeType::Paragraph));
			std::cout << System::StaticCast<Node>(tocItem)->ToString(SaveFormat::Text).Trim().ToUtf8String() << std::endl;
			std::cout << "------------------" << std::endl;
			if (tocItem != nullptr)
			{
				System::SharedPtr<Bookmark> bm = doc->get_Range()->get_Bookmarks()->idx_get(hyperlink->get_SubAddress());

				// Tìm vị trí mà Mục TOC này đang trỏ đến
				System::SharedPtr<Paragraph> pointer = System::DynamicCast<Paragraph>(bm->get_BookmarkStart()->GetAncestor(NodeType::Paragraph));
				std::cout << System::StaticCast<Node>(pointer)->ToString(SaveFormat::Text).ToUtf8String() << std::endl;
			}
		}
	}
}

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

Nếu nội dung của tài liệu đã được cập nhật và bạn cần phản ánh những thay đổi đó trong mục lục, bạn chỉ cần tải tệp Word và gọi phương thức Document-> UpdateFields(). Phương thức này sẽ cập nhật mục lục theo nội dung đã sửa đổi. Sau đó, lưu tài liệu Word đã cập nhật.

Xóa Mục lục khỏi Tài liệu Word

Sau đây là các bước để xóa mục lục khỏi tài liệu Word.

Đoạn mã mẫu sau đây cho biết cách xóa mục lục khỏi Tài liệu Word bằng C ++.

void RemoveTableOfContents(const System::SharedPtr<Document>& doc, int32_t 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.
	std::vector<System::SharedPtr<FieldStart>> fieldStarts;
	// Đâ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ỏ
	// ở cuối phương pháp này.
	std::vector<System::SharedPtr<Node>> nodeList;

	for (System::SharedPtr<FieldStart> start : System::IterateOver<System::SharedPtr<FieldStart>>(doc->GetChildNodes(NodeType::FieldStart, true)))
	{
		if (start->get_FieldType() == FieldType::FieldTOC)
		{
			// Thêm tất cả các FieldStart thuộc loại FieldTOC.
			fieldStarts.push_back(start);
		}
	}

	// Đảm bảo rằng TOC được chỉ định bởi chỉ mục đã chuyển tồn tại.
	if (index > fieldStarts.size() - 1)
	{
		throw System::ArgumentOutOfRangeException(u"TOC index is out of range");
	}

	bool isRemoving = true;

	// Lấy FieldStart của TOC được chỉ định.
	System::SharedPtr<Node> currentNode = 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.push_back(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->get_NodeType() == NodeType::FieldEnd)
		{
			System::SharedPtr<FieldEnd> fieldEnd = System::DynamicCast<FieldEnd>(currentNode);
			if (fieldEnd->get_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.
	for (System::SharedPtr<Node> node : nodeList)
	{
		node->Remove();
	}
}

int main()
{
	// Đường dẫn thư mục nguồn và đầu ra.
	System::String sourceDataDir = u"SourceDirectory\\";
	System::String outputDataDir = u"OutputDirectory\\";

	// Mở tài liệu Word
	System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"SampleTOC.docx");

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

	// Đường dẫn tệp đầu ra
	System::String outputPath = outputDataDir + u"RemoveTOC.docx";

	// Lưu tệp Word
	doc->Save(outputPath);
}

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

Bạn có thể dùng thử API mà không có giới hạn đánh giá bằng cách yêu cầu giấy phép tạm thời miễn phí.

Sự kết luận

Trong bài này, bạn đã học cách làm việc với mục lục trong tài liệu Word bằng C ++. Bạn đã thấy các bước và mã mẫu cần thiết để thêm, trích xuất, cập nhật và xóa mục lục khỏi tài liệu Word. Aspose. AdWords dành cho C ++ cung cấp nhiều tính năng bổ sung để làm việc với các tệp Word. Bạn có thể khám phá API chi tiết bằng cách truy cập tài liệu chính thức. Trong trường hợp có bất kỳ câu hỏi nào, vui lòng liên hệ với chúng tôi trên diễn đàn hỗ trợ miễn phí của chúng tôi.

Xem thêm