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