Отличительное содержание в документе Word
Кто-нибудь знает, как при программной итерации по текстовому документу вы можете определить, является ли абзац частью оглавления (или вообще что-нибудь, что образует часть поля).
Я спрашиваю, что у меня есть программа на VB, которая должна извлечь первые пара абзацев основного текста из документа - это делается путем перебора коллекции Word.Paragraphs. Я не хочу, чтобы результаты включали оглавления или другие поля, я хочу только то, что человек распознал бы как заголовок, заголовок или обычный текстовый абзац. Однако оказывается, что если есть оглавление, то в Word.Paragraphs в качестве отдельного элемента отображается не только само оглавление, но и КАЖДАЯ строка в оглавлении. Я не хочу их, но не смог найти никакого свойства в объекте Paragraph, которое позволило бы мне различать и игнорировать их (полагаю, мне нужно решение, которое можно применить и к другим типам полей, например, к таблице цифры и таблица авторитетных источников, с которыми я на самом деле еще не сталкивался, но думаю, что потенциально это вызовет ту же проблему)
4 ответа
Из-за ограничений в объектной модели 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 в оглавлении, в зависимости от того, как он создается, иногда имеется область, похожая на Content Control, которая может потребовать от вас написания дополнительного кода обнаружения и удаления.,
Это не гарантируется, но если для оглавления используются стандартные стили Word (весьма вероятно), и если никто не добавил свой собственный стиль с префиксом "TOC", то это нормально. Это грубый подход, но выполнимый.
Dim parCurrentParagraph As Paragraph
If Left(parCurrentParagraph.Format.Style.NameLocal, 3) = "TOC" Then
' Do something
End If
Следующая функция вернет объект Range, который начинается после любого оглавления или таблицы рисунков. Затем вы можете использовать свойство Paragraphs возвращаемого диапазона:
Private Function GetMainTextRange() As Range
Dim toc As TableOfContents
Dim tof As TableOfFigures
Dim mainTextStart As Long
mainTextStart = 1
For Each toc In ActiveDocument.TablesOfContents
If toc.Range.End > mainTextStart Then
mainTextStart = toc.Range.End + 1
End If
Next
For Each tof In ActiveDocument.TablesOfFigures
If tof.Range.End > mainTextStart Then
mainTextStart = tof.Range.End + 1
End If
Next
Set GetMainTextRange = ActiveDocument.Range(mainTextStart, ActiveDocument.Range.End)
End Function
Что вы можете сделать, это создать собственный стиль для каждого раздела вашего документа.
Пользовательские стили в Word 2003 (не уверен, какую версию Word вы используете)
Затем, при переборе вашей коллекции абзацев вы можете проверить свойство.Style и безопасно проигнорировать его, если оно равно вашему TOCStyle.
Я считаю, что та же самая техника будет хорошо работать и для таблиц.