Spis treści (TOC) jest ważną częścią dokumentu programu Word. Zapewnia przegląd zawartości dokumentu i pozwala szybko przejść do żądanej sekcji. Możesz znaleźć się w scenariuszach, w których musisz programowo dodawać, wyodrębniać, aktualizować lub usuwać spis treści z dokumentów programu Word. W tym celu w tym artykule dowiesz się, jak pracować ze spisem treści w plikach Worda przy użyciu języka C++.
- Interfejs API języka C++ do pracy ze spisem treści w dokumentach programu Word
- Dodaj spis treści w dokumencie programu Word
- Wyodrębnij spis treści z dokumentu programu Word
- Zaktualizuj spis treści w dokumencie programu Word
- Usuń spis treści z dokumentu programu Word
Interfejs API języka C++ do pracy ze spisem treści w dokumentach programu Word
Aspose.Words for C++ to natywna biblioteka C++, która pozwala tworzyć, czytać, modyfikować i konwertować dokumenty Microsoft Word. Ponadto obsługuje również pracę ze spisem treści w plikach Word. Możesz zainstalować API poprzez NuGet lub pobrać bezpośrednio z sekcji Downloads.
PM> Install-Package Aspose.Words.Cpp
Dodaj spis treści w dokumencie programu Word
Poniżej przedstawiono kroki dodawania spisu treści w dokumencie programu Word.
- Załaduj plik Word, używając klasy Document.
- Utwórz instancję klasy DocumentBuilder, korzystając z wcześniej utworzonego obiektu Document.
- Wstaw spis treści za pomocą metody DocumentBuilder->InsertTableOfContents(System::String Switches).
- Wypełnij spis treści za pomocą metody Document->UpdateFields().
- Zapisz dokument programu Word za pomocą metody Document->Save(System::String fileName).
Poniższy przykładowy kod pokazuje, jak dodać spis treści w dokumencie programu Word przy użyciu języka C++.
// Ścieżki katalogu źródłowego i wyjściowego.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";
// Załaduj plik Worda
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"Sample 5.docx");
// Utwórz instancję klasy DocumentBuilder
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);
// Wstaw spis treści na początku dokumentu.
builder->InsertTableOfContents(u"\\o \"1-3\" \\h \\z \\u");
// Nowo wstawiony spis treści będzie początkowo pusty.
// Należy go wypełnić, aktualizując pola w dokumencie.
doc->UpdateFields();
// Ścieżka pliku wyjściowego
System::String outputPath = outputDataDir + u"AddTOC.docx";
// Zapisz plik Worda
doc->Save(outputPath);
Wyodrębnij spis treści z dokumentu programu Word
Poniżej przedstawiono kroki, aby wyodrębnić spis treści z dokumentu programu Word.
- Załaduj plik Word, używając klasy Document.
- Pobierz pola za pomocą metody Document->getRange()->getFields() i wykonaj pętlę nad nimi.
- Sprawdź, czy pole jest typu FieldType::FieldHyperlink.
- Sprawdź, czy pole należy do spisu treści.
- Pobierz i wydrukuj informacje o polu.
Poniższy przykładowy kod ilustruje sposób wyodrębniania spisu treści z dokumentu programu Word przy użyciu języka C++.
// Katalog źródłowy
System::String inputDataDir = u"SourceDirectory\\";
// Załaduj plik Worda
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"SampleTOC.docx");
// Pętla przez pola
for (System::SharedPtr<Field> field : System::IterateOver(doc->get_Range()->get_Fields()))
{
// Pobierz pola FieldHyperlink
if (field->get_Type() == FieldType::FieldHyperlink)
{
System::SharedPtr<FieldHyperlink> hyperlink = System::DynamicCast<FieldHyperlink>(field);
// Sprawdź, czy pole należy do spisu treści
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());
// Uzyskaj lokalizację, na którą wskazuje ten element spisu treści
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;
}
}
}
}
Zaktualizuj spis treści w dokumencie programu Word
Jeśli treść dokumentu została zaktualizowana i chcesz odzwierciedlić te zmiany w spisie treści, wystarczy załadować plik Word i wywołać metodę Document->UpdateFields(). Ta metoda zaktualizuje spis treści zgodnie ze zmodyfikowaną zawartością. Następnie zapisz zaktualizowany dokument programu Word.
Usuń spis treści z dokumentu programu Word
Poniżej przedstawiono kroki, aby usunąć spis treści z dokumentu programu Word.
- Załaduj plik Word, używając klasy Document.
- Pobierz i zapisz listę węzłów FieldStart.
- Przechodź przez węzły, aż dojdziesz do węzła typu NodeType::FieldEnd, który wyznacza koniec spisu treści.
- Usuń spis treści za pomocą metody Node->Remove().
- Zapisz dokument programu Word za pomocą metody Document->Save(System::String fileName).
Poniższy przykładowy kod pokazuje, jak usunąć spis treści z dokumentu programu Word przy użyciu języka C++.
void RemoveTableOfContents(const System::SharedPtr<Document>& doc, int32_t index)
{
// Przechowuj węzły FieldStart pól spisu treści w dokumencie, aby mieć do nich szybki dostęp.
std::vector<System::SharedPtr<FieldStart>> fieldStarts;
// To jest lista do przechowywania węzłów znalezionych w określonym spisie treści. Zostaną usunięte
// na końcu tej metody.
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)
{
// Dodaj wszystkie FieldStarts, które są typu FieldTOC.
fieldStarts.push_back(start);
}
}
// Upewnij się, że istnieje spis treści określony przez przekazany indeks.
if (index > fieldStarts.size() - 1)
{
throw System::ArgumentOutOfRangeException(u"TOC index is out of range");
}
bool isRemoving = true;
// Uzyskaj FieldStart określonego spisu treści.
System::SharedPtr<Node> currentNode = fieldStarts[index];
while (isRemoving)
{
// Bezpieczniej jest przechowywać te węzły i usuwać je wszystkie na raz później.
nodeList.push_back(currentNode);
currentNode = currentNode->NextPreOrder(doc);
// Gdy napotkamy węzeł FieldEnd typu FieldTOC, wiemy, że jesteśmy na końcu
// aktualnego spisu treści i na tym możemy się zatrzymać.
if (currentNode->get_NodeType() == NodeType::FieldEnd)
{
System::SharedPtr<FieldEnd> fieldEnd = System::DynamicCast<FieldEnd>(currentNode);
if (fieldEnd->get_FieldType() == FieldType::FieldTOC)
{
isRemoving = false;
}
}
}
// Usuń wszystkie węzły znalezione w określonym spisie treści.
for (System::SharedPtr<Node> node : nodeList)
{
node->Remove();
}
}
int main()
{
// Ścieżki katalogu źródłowego i wyjściowego.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";
// Otwórz dokument Worda
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"SampleTOC.docx");
// Usuń pierwszy spis treści z dokumentu.
RemoveTableOfContents(doc, 0);
// Ścieżka pliku wyjściowego
System::String outputPath = outputDataDir + u"RemoveTOC.docx";
// Zapisz plik Worda
doc->Save(outputPath);
}
Uzyskaj bezpłatną licencję
Możesz wypróbować interfejs API bez ograniczeń ewaluacyjnych, prosząc o bezpłatną licencję tymczasową.
Wniosek
W tym artykule nauczyłeś się, jak pracować ze spisem treści w dokumentach programu Word przy użyciu języka C++. Widziałeś kroki i przykładowy kod wymagany do dodawania, wyodrębniania, aktualizowania i usuwania spisu treści z dokumentów Worda. Aspose.Words for C++ zapewnia wiele dodatkowych funkcji do pracy z plikami Word. Możesz szczegółowo zapoznać się z interfejsem API, odwiedzając oficjalną dokumentację. W przypadku jakichkolwiek pytań prosimy o kontakt z nami na naszym bezpłatnym forum pomocy technicznej.