PDA

Показать полную графическую версию : Поиск в документах doc и docx строк из списка разными способами


tumanovalex
19-05-2018, 08:25
Мне нужно найти строки из большого списка строк в документах doc и docx, причем нужная строка может быть в любом месте документа - таблице, абзаце, сноске и др.
Возникли следующие вопросы:
1. Можно ли открыть документ doc или docx с помощью Microsoft.Office.Interop.Word и затем во всем тексте документа найти нужную строку?
Я попробовал doc.Content.Find.Text.IndexdocOf(strFind) - не получилось, строка, которая точно есть в документе, не ищется.
2. В Total Commander есть возможность поиска строки в doc и docx без COM и установленного Word. В настоящее время сотрудники вводят каждую строку из списка и ищут
каждую из строк в Total Commander. Мне хотелось бы сделать программу, которая искала бы строки из списка в документах doc и docx без установленного Word. Подскажите, пожалуйста, какие файловые методы (работа с текстовыми файлами, работа с бинарными файлами или др.) или библиотеки лучше использовать для решения этой задачи.

Iska
19-05-2018, 09:04
Я попробовал doc.Content.Find.Text.IndexdocOf(strFind) - не получилось, строка, которая точно есть в документе, не ищется. »
Документ в архив, архив — к сообщению. Укажите образец текста для поиска.

2. В Total Commander есть возможность поиска строки в doc и docx без COM и установленного Word. »
В .doc строки тупо ищутся в самих файлах (требуется отметить флажок UTF-16), а не в содержимом документов. В .docx, представляющих собой zip-архив с содержимым из двоичных и текстовых xml-файлов поиск осуществляется опять же вовсе не по содержимому документа, а по всему перечню xml-содержимого этого архива. Посему поиск и в одном, и в другом подвержен ошибкам как первого, так и второго рода.

какие файловые методы (работа с текстовыми файлами, работа с бинарными файлами или др.) или библиотеки лучше использовать для решения этой задачи. »
В первом случае — открыть двоичный файл как текстовый в кодировке UTF-16LE, прочитать содержимое, осуществить в прочитанном поиск. Во втором случае — извлечь содержимое файла как из zip-архива в новосозданный каталог временных файлов, рекурсивно перебрать все xml-файлы в этом каталоге, открыть каждый файл xml в указанной в нём кодировке, прочитать содержимое, осуществить в прочитанном поиск, под конец — удалить извлеченное содержимое из каталога временных файлов.

Так или иначе, я не рекомендую такой поиск.

tumanovalex
19-05-2018, 17:37
Спасибо за ответ. Прикрепил архив с проектом и файлом, в котором не могу найти строку.

Iska
19-05-2018, 21:16
tumanovalex, в коде:
Word.Document doc = new Word.Document();
new — лишнее.

Судя по Вашему коду, да — у Вас действительно, на самом деле «не ищется». Потому что Вы даже не пробуете искать. Просто откройте документ в Word'е, нажмите Alt-F11, наберите в окне для поиска в справке Find, выберете статью в справке и посмотрите примеры, как осуществляется поиск:
Example

The following example searches forward through the document for the word "Microsoft." If the word is found, it's automatically selected.
With Selection.Find
.Forward = True
.ClearFormatting
.MatchWholeWord = True
.MatchCase = False
.Wrap = wdFindContinue
.Execute FindText:="Microsoft"
End With

This example inserts "Tip: " at the beginning of every paragraph formatted with the Heading 3 style in the active document. The Do…Loop statement is used to repeat a series of actions each time this style is found.
With ActiveDocument.Content.Find
.ClearFormatting
.Style = wdStyleHeading3
Do While .Execute(FindText:="", Forward:=True, _
Format:=True) = True
With .Parent
.StartOf Unit:=wdParagraph, Extend:=wdMove
.InsertAfter "Tip: "
.Move Unit:=wdParagraph, Count:=1
End With
Loop
End With

— методом .Execute(), который возвращает булево значение, по которому можно судить об успешности нахождения искомого. Аналогичные же примеры можно найти и в MSDN: Find.Execute Method (Word) (https://msdn.microsoft.com/en-us/vba/word-vba/articles/find-execute-method-word), Find.Execute method (Microsoft.Office.Interop.Word) (https://msdn.microsoft.com/en-us/library/microsoft.office.interop.word.find.execute.aspx) и т.п.

tumanovalex
21-05-2018, 22:06
Спасибо большое! Разобрался, поиск работает.




© OSzone.net 2001-2012