Оглавление (TOC) в документе Word дает вам общее представление о содержании документа. Кроме того, он позволяет перейти к определенному разделу документа. В этой статье вы узнаете, как программно работать с оглавлением в документах Word с помощью C#. В частности, в этой статье рассказывается, как добавлять, извлекать, обновлять или удалять оглавление в документах Word.
- C# API для работы с оглавлением в документах Word
- Добавить оглавление в документ Word
- Извлечь оглавление из документа Word
- Обновить оглавление в документе Word
- Удалить оглавление в документе Word
- Получите бесплатную лицензию API
C# API для работы с оглавлением в документе Word
Для работы с оглавлениями в документах Word мы будем использовать Aspose.Words for .NET. Упомянутый API предназначен для выполнения основных, а также расширенных функций автоматизации Word из приложений .NET. Кроме того, это дает вам надежный контроль над манипулированием оглавлением в документах Word. Вы можете либо скачать API, либо установить его с помощью NuGet.
PM> Install-Package Aspose.Words
Добавить оглавление в документ Word с помощью С#
Ниже приведены шаги по добавлению оглавления в документ Word с помощью Aspose.Words для .NET.
- Создайте экземпляр класса Document (в случае загрузки существующего документа Word укажите путь к файлу в конструкторе).
- Создайте экземпляр класса DocumentBuilder и инициализируйте его ранее созданным объектом Document.
- Вставьте оглавление, используя метод DocumentBuilder.InsertTableOfContents("\\o \"1-3\" \\h \\z \\u").
- Обновите поля с помощью метода Document.UpdateFields().
- Сохраните документ Word с помощью метода Document.Save(String).
В следующем примере кода показано, как добавить оглавление в документ Word на C#.
// Полные примеры и файлы данных см. на странице https://github.com/aspose-words/Aspose.Words-for-.NET.
// Путь к каталогу документов.
string dataDir = RunExamples.GetDataDir_WorkingWithDocument();
// Инициализировать документ.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
// Вставьте оглавление в начале документа.
builder.InsertTableOfContents("\\o \"1-3\" \\h \\z \\u");
// Вновь вставленное оглавление изначально будет пустым.
// Его необходимо заполнить, обновив поля в документе.
doc.UpdateFields();
dataDir = dataDir + "DocumentBuilderInsertTOC_out.doc";
doc.Save(dataDir);
Извлечь оглавление из документа Word с помощью C#
Ниже приведены шаги для извлечения полей из оглавления в документе Word.
- Загрузите документ Word, используя класс Document.
- Прокрутите каждое Field в документе, используя коллекцию Document.Range.Fields.
- Проверьте, является ли тип поля гиперссылкой, используя свойство Field.Type.
- Проверьте, попадает ли поле под таблицу содержания раздела.
- Получите информацию о поле и распечатайте ее.
В следующем примере кода показано, как извлечь оглавление из документа Word с помощью C#.
// Путь к каталогу документов.
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];
// Получить местоположение, на которое указывает этот элемент TOC
Paragraph pointer = (Paragraph)bm.BookmarkStart.GetAncestor(NodeType.Paragraph);
Console.WriteLine(pointer.ToString(SaveFormat.Text));
}
} // End If
}// End If
}// End Foreach
Обновить оглавление в документе Word с помощью С#
Всякий раз, когда вы добавляете какой-либо контент в документ Word, вам необходимо обновить оглавление. Чтобы сделать это программно, вам просто нужно вызвать метод Document.UpdateFields() перед сохранением документа.
Удалить оглавление в документе Word с помощью С#
Aspose.Words для .NET также позволяет удалить оглавление из документа Word. Ниже приведены шаги для выполнения этой операции.
- Сначала загрузите документ Word, используя класс Document.
- Получите и сохраните узлы FieldStart каждого TOC в массиве.
- Перебирайте узлы, пока не получите узел типа FieldEnd (конец оглавления).
- Удалите узлы с помощью метода Node.Remove() и сохраните обновленный документ.
В следующем примере кода показано, как удалить оглавление из документа Word на C#.
// Полные примеры и файлы данных см. на странице https://github.com/aspose-words/Aspose.Words-for-.NET.
public static void Run()
{
// Путь к каталогу документов.
string dataDir = RunExamples.GetDataDir_WorkingWithStyles();
// Откройте документ, содержащий оглавление.
Document doc = new Document(dataDir + "Document.TableOfContents.doc");
// Удалите первое оглавление из документа.
RemoveTableOfContents(doc, 0);
dataDir = dataDir + "Document.TableOfContentsRemoveToc_out.doc";
// Сохраните вывод.
doc.Save(dataDir);
Console.WriteLine("\nSpecified TOC from a document removed successfully.\nFile saved at " + dataDir);
}
///<summary>
/// Удаляет указанное поле оглавления из документа.
///</summary>
///<param name="doc"> Документ, из которого нужно удалить поле.</param>
///<param name="index"> Отсчитываемый от нуля индекс оглавления для удаления.</param>
public static void RemoveTableOfContents(Document doc, int index)
{
// Сохраните узлы FieldStart полей TOC в документе для быстрого доступа.
ArrayList fieldStarts = new ArrayList();
// Это список для хранения узлов, найденных внутри указанного TOC. они будут удалены
// В конце этого метода.
ArrayList nodeList = new ArrayList();
foreach (FieldStart start in doc.GetChildNodes(NodeType.FieldStart, true))
{
if (start.FieldType == FieldType.FieldTOC)
{
// Добавьте все FieldStarts типа FieldTOC.
fieldStarts.Add(start);
}
}
// Убедитесь, что оглавление, указанное переданным индексом, существует.
if (index > fieldStarts.Count - 1)
throw new ArgumentOutOfRangeException("TOC index is out of range");
bool isRemoving = true;
// Получите FieldStart указанного TOC.
Node currentNode = (Node)fieldStarts[index];
while (isRemoving)
{
// Безопаснее хранить эти узлы и потом удалить их все сразу.
nodeList.Add(currentNode);
currentNode = currentNode.NextPreOrder(doc);
// Как только мы встречаем узел FieldEnd типа FieldTOC, мы знаем, что находимся в конце.
// Из текущего TOC, и мы можем остановиться здесь.
if (currentNode.NodeType == NodeType.FieldEnd)
{
FieldEnd fieldEnd = (FieldEnd)currentNode;
if (fieldEnd.FieldType == FieldType.FieldTOC)
isRemoving = false;
}
}
// Удалить все узлы, найденные в указанном TOC.
foreach (Node node in nodeList)
{
node.Remove();
}
}
Получите бесплатную лицензию API
Если вы хотите попробовать API без ознакомительных ограничений, вы можете получить бесплатную временную лицензию.
Вывод
В этой статье вы узнали, как работать с оглавлением в документе Word с помощью C#. В пошаговом руководстве и примерах кода показано, как добавлять, обновлять, извлекать и удалять оглавление из документов Word. Вы можете узнать больше об API автоматизации C# Word, используя документацию. Если у вас возникнут какие-либо вопросы или проблемы, свяжитесь с нами через наш форум.