Получить абзацы в определенном разделе документа Word
У меня проблемы с поиском определенного раздела в слове. Было рекомендовано обратиться за помощью к обозревателю объектов VB в Word. Я знаю, что есть как минимум 5 "наборов" заголовков (IE, если вы посмотрите на карту документов, я вижу номер 1,2,3,4,5...). Я не знаю, как перейти к этому пятому заголовку, изначально я думал, что это разделы, но когда я просмотрел разделы, я понял, что почти все они находятся в одном разделе, но на тот случай, если кто-то ищет информацию о том, как делать разделы ниже, кажется, работает, так как я уже прошел через труд писать.
my($document) = $Word->Documents->Open($input) || die("Unable to open document ", Win32::OLE->LastError());
my $section = $document->{Sections}->Item(1); # put section number you're looking for in here
$section_five_paragraphs = $section->{Range}->Paragraphs();
$enumerate = new Win32::OLE::Enum($section_five_paragraphs);
while (defined($paragraph = $enumerate->Next()))
{
print $paragraph->{Range}->{Text} . "\n";
}
Так кто-нибудь знает, как добраться до этой пятой области заголовка, или может указать мне на то, что может помочь?
1 ответ
Скажи мне, если я не следовал за тобой правильно, но ты пытаешься найти 5-ую главу 1 в определенном разделе? Если это так, хотя Word четко определяет разделы (которые вы отмечаете как $document->{Sections}->Item(1)), он не дает четкого определения заголовков в конкретных или стилях в целом. Для этого вам придется пройтись по всем стилям в поисках интересующих. Следующий код VBA (и я прошу прощения за то, что не написал Perl) делает именно это и смотрит только в определенном разделе.
Sub FindHeading1()
On Error GoTo MyErrorHandler
Dim currentDocument As Document
Set currentDocument = ActiveDocument
Dim findRange As Range
Set findRange = currentDocument.Sections(2).Range 'which section you want
Dim endRange As Long
endRange = findRange.end
findRange.Find.ClearFormatting
findRange.Find.Style = ActiveDocument.Styles("Heading 1")
Dim headingCountFound As Long
Do While findRange.Find.Execute(FindText:="")
If findRange.End > endRange Then Exit Sub
findRange.Select
headingCountFound = headingCountFound + 1
If headingCountFound = 3 Then 'which occurance you want
MsgBox "Found."
Exit Do
End If
DoEvents
Loop
Exit Sub
MyErrorHandler:
MsgBox "FindHeading1" & vbCrLf & vbCrLf & "Err = " & Err.Number & vbCrLf & "Description: " & Err.Description
End Sub