Отличительное оглавление в документе Word - PullRequest
5 голосов
/ 08 июля 2011

Кто-нибудь знает, как при программной итерации по текстовому документу вы можете определить, является ли абзац частью оглавления (или вообще что-нибудь, что образует часть поля).

Моя причина спрашивать, что у меня есть программа VB, которая должна извлечь первые пара абзацев основного текста из документа - это происходит путем перебора коллекции Word.Paragraphs. Я не хочу, чтобы результаты включали оглавления или другие поля, я только хочу вещи, которые человек распознал бы как заголовок, заголовок или обычный текстовый абзац. Однако оказывается, что если есть оглавление, то в Word.Paragraphs в качестве отдельного элемента отображается не только само оглавление, но и КАЖДАЯ строка в оглавлении. Я не хочу их, но не смог найти ни одного свойства в объекте Paragraph, которое позволило бы мне различать и игнорировать их (полагаю, мне нужно решение, которое можно применить и к другим типам полей, например к таблице цифры и таблица авторитетных источников, с которыми я на самом деле еще не сталкивался, но, полагаю, это могло бы вызвать ту же проблему)

Ответы [ 3 ]

2 голосов
/ 04 августа 2011

Из-за ограничений в объектной модели Word я думаю, что лучший способ добиться этого - временно удалить код поля оглавления, выполнить итерацию по документу Word, а затем повторно вставить оглавление. В VBA это будет выглядеть так:

Dim doc As Document
Dim fld As Field
Dim rng As Range

Set doc = ActiveDocument

For Each fld In doc.Fields
    If fld.Type = wdFieldTOC Then
        fld.Select
        Selection.Collapse
        Set rng = Selection.Range 'capture place to re-insert TOC later
        fld.Cut
    End If
Next

Итерация по коду для извлечения абзацев, а затем

Selection.Range = rng
Selection.Paste

Если вы кодируете в .NET, это должно выглядеть довольно близко. Кроме того, это должно работать для Word 2003 и более ранних версий как есть, но для Word 2007/2010 оглавление, в зависимости от того, как оно создается, иногда имеет область, подобную Контент-контролю, которая может потребовать от вас написания дополнительного кода обнаружения и удаления. .

2 голосов
/ 17 августа 2016

Это не гарантируется, но если для оглавления используются стандартные стили Word (весьма вероятно), и если никто не добавил свой собственный стиль с префиксом "TOC", то это нормальноЭто грубый подход, но выполнимый.

Dim parCurrentParagraph As Paragraph

If Left(parCurrentParagraph.Format.Style.NameLocal, 3) = "TOC" Then

       '    Do something 

End If
0 голосов
/ 10 июля 2011

Что вы можете сделать, это создать собственный стиль для каждого раздела документа.

Пользовательские стили в Word 2003 (не уверены, какую версию Word вы используете)

Затем, при переборе всей коллекции абзацев вы можете проверить свойство .Style и безопасно проигнорировать его, если оно равно вашему TOCStyle.

Я полагаю, что та же самая техника будет работать и для таблиц.

...