VB.Net: Поиск Документа Word По Строке


Я пытаюсь прочитать документ Word (800+ страниц) строка за строкой, и если эта строка содержит определенный текст, в данном случае Section, просто распечатайте эту строку для консоли.

Public Sub doIt()
    SearchFile("theFilePath", "Section")
    Console.WriteLine("SHit")
End Sub

Public Sub SearchFile(ByVal strFilePath As String, ByVal strSearchTerm As String)
    Dim sr As StreamReader = New StreamReader(strFilePath)
    Dim strLine As String = String.Empty

    For Each line As String In sr.ReadLine
        If line.Contains(strSearchTerm) = True Then
            Console.WriteLine(line)
        End If
    Next

End Sub
Он работает, но ничего не распечатывает. Я знаю, что слово "секция" там тоже несколько раз.
2 2

2 ответа:

Как уже упоминалось в комментариях, вы не можете искать документ Word так, как делаете это сейчас. Вам нужно создать объект Word.Application, Как уже упоминалось, а затем загрузить документ, чтобы вы могли искать его.

Вот краткий пример, который я написал для вас. Обратите внимание, что вам необходимо добавить ссылку на Microsoft.Офис.Взаимодействие.Word , а затем вам нужно добавить оператор import в свой класс. Например Imports Microsoft.Office.Interop. Кроме того, это захватывает каждый абзац, а затем использует диапазон для поиска слова вы ищете, если нашли, он добавляет его в список.

Примечание: испытано и проверено - у меня было это в событии кнопки, но поставьте, где вам это нужно.

    Try
                Dim objWordApp As Word.Application = Nothing
                Dim objDoc As Word.Document = Nothing
                Dim TextToFind As String = YOURTEXT
                Dim TextRange As Word.Range = Nothing
                Dim StringLines As New List(Of String)

                objWordApp = CreateObject("Word.Application")

                If objWordApp IsNot Nothing Then
                    objWordApp.Visible = False
                    objDoc = objWordApp.Documents.Open(FileName, )
                End If

                If objDoc IsNot Nothing Then

                    'loop through each paragraph in the document and get the range
                    For Each p As Word.Paragraph In objDoc.Paragraphs
                        TextRange = p.Range
                        TextRange.Find.ClearFormatting()

                        If TextRange.Find.Execute(TextToFind, ) Then
                            StringLines.Add(p.Range.Text)
                        End If
                    Next

                    If StringLines.Count > 0 Then
                        MessageBox.Show(String.Join(Environment.NewLine, StringLines.ToArray()))
                    End If

                    objDoc.Close()
                    objWordApp.Quit()

                End If


            Catch ex As Exception
                'publish your exception?
            End Try

Обновление для использования предложений - это будет проходить через каждый абзац и захватывать каждое предложение, тогда мы сможем увидеть, существует ли слово... Преимущество этого в том, что это быстрее, потому что мы получаем каждый абзац, а затем ищем предложения. Мы должны получить абзац, чтобы получить предложения...

Try
            Dim objWordApp As Word.Application = Nothing
            Dim objDoc As Word.Document = Nothing
            Dim TextToFind As String = "YOUR TEXT TO FIND"
            Dim TextRange As Word.Range = Nothing
            Dim StringLines As New List(Of String)
            Dim SentenceCount As Integer = 0

            objWordApp = CreateObject("Word.Application")

            If objWordApp IsNot Nothing Then
                objWordApp.Visible = False
                objDoc = objWordApp.Documents.Open(FileName, )
            End If

            If objDoc IsNot Nothing Then

                For Each p As Word.Paragraph In objDoc.Paragraphs
                    TextRange = p.Range
                    TextRange.Find.ClearFormatting()
                    SentenceCount = TextRange.Sentences.Count
                    If SentenceCount > 0 Then
                        Do Until SentenceCount = 0
                            Dim sentence As String = TextRange.Sentences.Item(SentenceCount).Text
                            If sentence.Contains(TextToFind) Then
                                StringLines.Add(sentence.Trim())
                            End If

                            SentenceCount -= 1
                        Loop
                    End If
                Next

                If StringLines.Count > 0 Then
                    MessageBox.Show(String.Join(Environment.NewLine, StringLines.ToArray()))
                End If

                objDoc.Close()
                objWordApp.Quit()

            End If


        Catch ex As Exception
            'publish your exception?
        End Try

Вот sub, который будет печатать каждую строку, на которой находится строка поиска, а не каждый абзац. Он будет имитировать поведение использования streamreader в вашем примере для чтения / проверки каждой строки:

'Add reference to and import Microsoft.Office.Interop.Word
Public Sub SearchFile(ByVal strFilePath As String, ByVal strSearchTerm As String)
    Dim wordObject As Word.Application = New Word.Application
    wordObject.Visible = False
    Dim objWord As Word.Document = wordObject.Documents.Open(strFilePath)
    objWord.Characters(1).Select()

    Dim bolEOF As Boolean = False
    Do Until bolEOF
        wordObject.Selection.MoveEnd(WdUnits.wdLine, 1)
        If wordObject.Selection.Text.ToUpper.Contains(strSearchTerm.ToUpper) Then
            Console.WriteLine(wordObject.Selection.Text.Replace(vbCr, "").Replace(vbCr, "").Replace(vbCrLf, ""))
        End If
        wordObject.Selection.Collapse(WdCollapseDirection.wdCollapseEnd)
        If wordObject.Selection.Bookmarks.Exists("\EndOfDoc") Then
            bolEOF = True
        End If
    Loop

    objWord.Close()
    wordObject.Quit()
    objWord = Nothing
    wordObject = Nothing
    Me.Close()
End Sub

Это слегка модифицированный vb.net реализация решения nawfal для разбора строк документа word