2017-01-04 21 views
2

Ich versuche, ein Word-Dokument (800+ Seiten) zeilenweise zu lesen, und wenn diese Zeile bestimmten Text enthält, in diesem Fall Section, drucken Sie einfach diese Zeile auf Konsole .VB.Net: Word-Dokument nach Zeile suchen

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 

Es läuft, aber es druckt nichts aus. Ich weiß, dass das Wort "Section" auch mehrmals dort drin ist.

+0

Sie können keine Word-Dokument auf diese Weise suchen . Sie müssen ein Word-Anwendungsobjekt erstellen und die zu suchende Datei laden. – Codexer

+2

Sie können ein Word-Dokument nicht wie eine Textdatei durchsuchen. Ein Word- "Dokument" ist eigentlich eine Zip-Datei, in der die meisten Daten des Dokuments in einer XML-Datei gespeichert sind. Sie müssen eine Dll oder Interop von Drittanbietern verwenden, um das Word-Dokument zu "lesen" und seinen Text zu suchen – soohoonigan

+0

@soohoonigan könnte ich noch ein 'für jede Zeile' verwenden? Oder wie würde ich das Wort Dokument Zeile für Zeile durchlaufen? – Bob

Antwort

3

Wie bereits in den Kommentaren erwähnt, können Sie ein Word Dokument nicht so durchsuchen, wie Sie es gerade tun. Sie müssen ein Objekt Word.Application wie erwähnt erstellen und dann das Dokument laden, damit Sie es durchsuchen können.

Hier ist ein kurzes Beispiel, das ich für Sie geschrieben habe. Bitte beachten Sie, dass Sie einen Verweis auf Microsoft.Office.Interop.Word hinzufügen müssen und dann müssen Sie die import-Anweisung zu Ihrer Klasse hinzufügen. Zum Beispiel Imports Microsoft.Office.Interop. Auch dies greift jeden Absatz und dann den Bereich verwendet, um nach dem Wort zu suchen, nach dem Sie suchen, wenn es gefunden wird, fügt es es der Liste hinzu.

Hinweis: Bewährte - Ich hatte dies in einer Schaltfläche Ereignis, aber setzen Sie, wo Sie es brauchen.

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 

aktualisieren Sätze verwenden - das durch jeden Absatz gehen und jeden Satz packen, können wir sehen dann, wenn das Wort existiert ... Der Vorteil davon ist, es ist schneller, weil wir jeden Absatz und dann suche die Sätze. Wir haben den Absatz zu erhalten, um die Sätze zu bekommen ...

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 
1

Hier ist ein Unter, die jede Zeile gedruckt wird, dass die Suche-Zeichenfolge auf gefunden wird, anstatt jeden Absatz. Es wird das Verhalten mit der Stream in Ihrem Beispiel nachahmen zu lesen/prüfen jede Zeile:

'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 

Es ist eine leicht modifizierte vb.net Implementierung von nawfal's solution to parsing word document lines