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 ответа:
Как уже упоминалось в комментариях, вы не можете искать документ
Вот краткий пример, который я написал для вас. Обратите внимание, что вам необходимо добавить ссылку на Microsoft.Офис.Взаимодействие.Word , а затем вам нужно добавить оператор import в свой класс. НапримерWord
так, как делаете это сейчас. Вам нужно создать объектWord.Application
, Как уже упоминалось, а затем загрузить документ, чтобы вы могли искать его.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