Innehållsförteckning (TOC) är en viktig del av ett Word-dokument. Den ger en översikt över dokumentets innehåll och låter dig snabbt navigera till önskat avsnitt. Du kan hamna i scenarier där du behöver lägga till, extrahera, uppdatera eller ta bort innehållsförteckningen från Word-dokument programmatiskt. För detta ändamål kommer den här artikeln att lära dig hur du arbetar med innehållsförteckningen i Word-filer med C++.

C++ API för att arbeta med innehållsförteckning i Word-dokument

Aspose.Words for C++ är ett inbyggt C++-bibliotek som låter dig skapa, läsa, ändra och konvertera Microsoft Word-dokument. Dessutom stöder den också arbete med innehållsförteckningen i Word-filer. Du kan antingen installera API:t genom NuGet eller ladda ner det direkt från avsnittet Nedladdningar.

PM> Install-Package Aspose.Words.Cpp

Lägg till innehållsförteckningen i ett Word-dokument

Följande är stegen för att lägga till en innehållsförteckning i ett Word-dokument.

Följande exempelkod visar hur man lägger till en innehållsförteckning i ett Word-dokument med C++.

// Käll- och utdatakatalogvägar.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";

// Ladda Word-filen
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"Sample 5.docx");

// Skapa en instans av klassen DocumentBuilder
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);

// Infoga en innehållsförteckning i början av dokumentet.
builder->InsertTableOfContents(u"\\o \"1-3\" \\h \\z \\u");

// Den nyligen infogade innehållsförteckningen kommer till en början att vara tom.
// Den måste fyllas i genom att uppdatera fälten i dokumentet.
doc->UpdateFields();

// Utdatafilens sökväg
System::String outputPath = outputDataDir + u"AddTOC.docx";

// Spara Word-filen
doc->Save(outputPath);
Utdata Word-fil som innehåller innehållsförteckningen

Utdata Word-fil som innehåller innehållsförteckningen

Extrahera innehållsförteckningen från ett Word-dokument

Följande är stegen för att extrahera innehållsförteckningen från ett Word-dokument.

Följande exempelkod visar hur man extraherar innehållsförteckningen från ett Word-dokument med C++.

// Källkatalog
System::String inputDataDir = u"SourceDirectory\\";

// Ladda Word-filen
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"SampleTOC.docx");

// Slinga genom fälten
for (System::SharedPtr<Field> field : System::IterateOver(doc->get_Range()->get_Fields()))
{
	// Hämta FieldHyperlink-fält
	if (field->get_Type() == FieldType::FieldHyperlink)
	{
		System::SharedPtr<FieldHyperlink> hyperlink = System::DynamicCast<FieldHyperlink>(field);

		// Kontrollera om fältet tillhör TOC
		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());

				// Hämta platsen som den här innehållsförteckningen pekar på
				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;
			}
		}
	}
}

Uppdatera innehållsförteckningen i ett Word-dokument

Om dokumentets innehåll har uppdaterats och du behöver återspegla dessa ändringar i innehållsförteckningen behöver du helt enkelt ladda Word-filen och anropa metoden Document->UpdateFields(). Denna metod kommer att uppdatera innehållsförteckningen enligt det ändrade innehållet. Efter detta sparar du det uppdaterade Word-dokumentet.

Ta bort innehållsförteckningen från ett Word-dokument

Följande är stegen för att ta bort innehållsförteckningen från ett Word-dokument.

Följande exempelkod visar hur man tar bort innehållsförteckningen från ett Word-dokument med C++.

void RemoveTableOfContents(const System::SharedPtr<Document>& doc, int32_t index)
{
	// Lagra FieldStart-noderna för innehållsförteckningsfält i dokumentet för snabb åtkomst.
	std::vector<System::SharedPtr<FieldStart>> fieldStarts;
	// Detta är en lista för att lagra noderna som finns i den angivna innehållsförteckningen. De kommer att tas bort
	// i slutet av denna metod.
	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)
		{
			// Lägg till alla FieldStarts som är av typen FieldTOC.
			fieldStarts.push_back(start);
		}
	}

	// Se till att innehållsförteckningen som anges av det godkända indexet finns.
	if (index > fieldStarts.size() - 1)
	{
		throw System::ArgumentOutOfRangeException(u"TOC index is out of range");
	}

	bool isRemoving = true;

	// Hämta FieldStart för den angivna innehållsförteckningen.
	System::SharedPtr<Node> currentNode = fieldStarts[index];

	while (isRemoving)
	{
		// Det är säkrare att lagra dessa noder och ta bort dem alla på en gång senare.
		nodeList.push_back(currentNode);
		currentNode = currentNode->NextPreOrder(doc);

		// När vi väl stöter på en FieldEnd-nod av typen FieldTOC vet vi att vi är i slutet
		// av nuvarande innehållsförteckning och vi kan sluta här.
		if (currentNode->get_NodeType() == NodeType::FieldEnd)
		{
			System::SharedPtr<FieldEnd> fieldEnd = System::DynamicCast<FieldEnd>(currentNode);
			if (fieldEnd->get_FieldType() == FieldType::FieldTOC)
			{
				isRemoving = false;
			}
		}
	}

	// Ta bort alla noder som finns i den angivna innehållsförteckningen.
	for (System::SharedPtr<Node> node : nodeList)
	{
		node->Remove();
	}
}

int main()
{
	// Käll- och utdatakatalogsökvägar.
	System::String sourceDataDir = u"SourceDirectory\\";
	System::String outputDataDir = u"OutputDirectory\\";

	// Öppna ett Word-dokument
	System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"SampleTOC.docx");

	// Ta bort den första innehållsförteckningen från dokumentet.
	RemoveTableOfContents(doc, 0);

	// Utdatafilens sökväg
	System::String outputPath = outputDataDir + u"RemoveTOC.docx";

	// Spara Word-filen
	doc->Save(outputPath);
}

Skaffa en gratis licens

Du kan prova API:et utan utvärderingsbegränsningar genom att begära en gratis tillfällig licens.

Slutsats

I den här artikeln har du lärt dig hur du arbetar med innehållsförteckningen i Word-dokument med C++. Du har sett stegen och exempelkoden som krävs för att lägga till, extrahera, uppdatera och ta bort innehållsförteckningen från Word-dokument. Aspose.Words för C++ tillhandahåller många ytterligare funktioner för att arbeta med Word-filer. Du kan utforska API:et i detalj genom att besöka den officiella dokumentationen. Om du har några frågor är du välkommen att kontakta oss på vårt gratis supportforum.

Se även