Получить абзацы в определенном разделе документа Word - PullRequest
3 голосов
/ 09 мая 2011

У меня проблемы с поиском определенного раздела в слове. Было рекомендовано обратиться за помощью к обозревателю объектов VB в Word. Я знаю, что есть как минимум 5 «наборов» заголовков (т. Е. Если вы посмотрите на карту документа, я увижу пронумерованные 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 Ответ

2 голосов
/ 06 июня 2011

Скажите, если я не следовал за вами правильно, но вы пытаетесь найти 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
...