Зміст (TOC) є важливою частиною документа Word. Він надає огляд вмісту документа та дозволяє швидко переходити до потрібного розділу. Ви можете опинитись у сценаріях, коли вам потрібно додати, видобути, оновити або видалити зміст із документів Word програмним шляхом. З цією метою ця стаття навчить вас, як працювати зі змістом у файлах Word за допомогою C++.
- C++ API для роботи зі змістом у документах Word
- Додайте зміст у документ Word
- Витягніть зміст із документа Word
- Оновлення змісту в документі Word
- Видалення змісту з документа Word
C++ API для роботи зі змістом у документах Word
Aspose.Words for C++ — це рідна бібліотека C++, яка дозволяє створювати, читати, змінювати та конвертувати документи Microsoft Word. Крім того, він також підтримує роботу зі змістом у файлах Word. Ви можете встановити API через NuGet або завантажити його безпосередньо з розділу Завантаження.
PM> Install-Package Aspose.Words.Cpp
Додайте зміст у документ Word
Нижче наведено кроки, щоб додати зміст у документ Word.
- Завантажте файл Word за допомогою класу Document.
- Створіть екземпляр класу DocumentBuilder, використовуючи створений раніше об’єкт Document.
- Вставте зміст за допомогою методу DocumentBuilder->InsertTableOfContents(System::String switches).
- Заповніть зміст за допомогою методу Document->UpdateFields().
- Збережіть документ Word за допомогою методу Document->Save(System::String fileName).
У наведеному нижче прикладі коду показано, як додати зміст у документ Word за допомогою C++.
// Шляхи вихідного та вихідного каталогу.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";
// Завантажте файл Word
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"Sample 5.docx");
// Створіть екземпляр класу DocumentBuilder
System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);
// Вставте зміст на початку документа.
builder->InsertTableOfContents(u"\\o \"1-3\" \\h \\z \\u");
// Щойно вставлений зміст спочатку буде порожнім.
// Його потрібно заповнити, оновивши поля в документі.
doc->UpdateFields();
// Шлях вихідного файлу
System::String outputPath = outputDataDir + u"AddTOC.docx";
// Збережіть файл Word
doc->Save(outputPath);
Витягніть зміст із документа Word
Нижче наведено кроки для вилучення змісту з документа Word.
- Завантажте файл Word за допомогою класу Document.
- Отримайте поля за допомогою методу Document->getRange()->getFields() і перегляньте їх у циклі.
- Перевірте, чи поле має тип FieldType::FieldHyperlink.
- Перевірте, чи належить поле до змісту.
- Отримайте та роздрукуйте інформацію про поле.
Наведений нижче зразок коду демонструє, як отримати зміст із документа Word за допомогою C++.
// Вихідний каталог
System::String inputDataDir = u"SourceDirectory\\";
// Завантажте файл Word
System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"SampleTOC.docx");
// Перебирайте поля
for (System::SharedPtr<Field> field : System::IterateOver(doc->get_Range()->get_Fields()))
{
// Отримати поля FieldHyperlink
if (field->get_Type() == FieldType::FieldHyperlink)
{
System::SharedPtr<FieldHyperlink> hyperlink = System::DynamicCast<FieldHyperlink>(field);
// Перевірте, чи поле належить 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());
// Отримайте розташування, на яке вказує цей елемент змісту
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;
}
}
}
}
Оновлення змісту в документі Word
Якщо вміст документа було оновлено, і вам потрібно відобразити ці зміни у змісті, вам просто потрібно завантажити файл Word і викликати метод Document->UpdateFields(). Цей метод оновить зміст відповідно до зміненого вмісту. Після цього збережіть оновлений документ Word.
Видалення змісту з документа Word
Нижче наведено кроки для видалення змісту з документа Word.
- Завантажте файл Word за допомогою класу Document.
- Отримати та зберегти список вузлів FieldStart.
- Перебирайте вузли, доки не досягнете вузла типу NodeType::FieldEnd, який позначає кінець змісту.
- Видаліть зміст за допомогою методу Node->Remove().
- Збережіть документ Word за допомогою методу Document->Save(System::String fileName).
У наведеному нижче прикладі коду показано, як видалити зміст із документа Word за допомогою C++.
void RemoveTableOfContents(const System::SharedPtr<Document>& doc, int32_t index)
{
// Зберігайте вузли FieldStart полів TOC у документі для швидкого доступу.
std::vector<System::SharedPtr<FieldStart>> fieldStarts;
// Це список для зберігання вузлів, знайдених у вказаному TOC. Вони будуть видалені
// в кінці цього методу.
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)
{
// Додайте всі FieldStarts типу FieldTOC.
fieldStarts.push_back(start);
}
}
// Переконайтеся, що TOC, визначений переданим індексом, існує.
if (index > fieldStarts.size() - 1)
{
throw System::ArgumentOutOfRangeException(u"TOC index is out of range");
}
bool isRemoving = true;
// Отримайте FieldStart зазначеного TOC.
System::SharedPtr<Node> currentNode = fieldStarts[index];
while (isRemoving)
{
// Безпечніше зберегти ці вузли та видалити їх усі одразу пізніше.
nodeList.push_back(currentNode);
currentNode = currentNode->NextPreOrder(doc);
// Коли ми зустрічаємо вузол FieldEnd типу FieldTOC, ми знаємо, що ми в кінці
// поточного TOC, і ми можемо зупинитися тут.
if (currentNode->get_NodeType() == NodeType::FieldEnd)
{
System::SharedPtr<FieldEnd> fieldEnd = System::DynamicCast<FieldEnd>(currentNode);
if (fieldEnd->get_FieldType() == FieldType::FieldTOC)
{
isRemoving = false;
}
}
}
// Видаліть усі вузли, знайдені у вказаному вмісті.
for (System::SharedPtr<Node> node : nodeList)
{
node->Remove();
}
}
int main()
{
// Шляхи вихідного та вихідного каталогу.
System::String sourceDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";
// Відкрийте документ Word
System::SharedPtr<Document> doc = System::MakeObject<Document>(sourceDataDir + u"SampleTOC.docx");
// Видаліть перший зміст із документа.
RemoveTableOfContents(doc, 0);
// Шлях вихідного файлу
System::String outputPath = outputDataDir + u"RemoveTOC.docx";
// Збережіть файл Word
doc->Save(outputPath);
}
Отримайте безкоштовну ліцензію
Ви можете спробувати API без обмежень щодо оцінки, надіславши запит на безкоштовну тимчасову ліцензію.
Висновок
У цій статті ви дізналися, як працювати зі змістом у документах Word за допомогою C++. Ви бачили кроки та зразок коду, необхідні для додавання, вилучення, оновлення та видалення змісту з документів Word. Aspose.Words for C++ надає багато додаткових функцій для роботи з файлами Word. Ви можете детально вивчити API, відвідавши офіційну документацію. У разі будь-яких запитань зв’яжіться з нами на нашому безкоштовному форумі підтримки.