Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Поиск в документах doc и docx строк из списка разными способами (http://forum.oszone.net/showthread.php?t=334910)

tumanovalex 19-05-2018 08:25 2814439

Поиск в документах doc и docx строк из списка разными способами
 
Мне нужно найти строки из большого списка строк в документах 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 2814445

Цитата:

Цитата tumanovalex
Я попробовал doc.Content.Find.Text.IndexdocOf(strFind) - не получилось, строка, которая точно есть в документе, не ищется. »

Документ в архив, архив — к сообщению. Укажите образец текста для поиска.

Цитата:

Цитата tumanovalex
2. В Total Commander есть возможность поиска строки в doc и docx без COM и установленного Word. »

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

Цитата:

Цитата tumanovalex
какие файловые методы (работа с текстовыми файлами, работа с бинарными файлами или др.) или библиотеки лучше использовать для решения этой задачи. »

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

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

tumanovalex 19-05-2018 17:37 2814488

Спасибо за ответ. Прикрепил архив с проектом и файлом, в котором не могу найти строку.

Iska 19-05-2018 21:16 2814506

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), Find.Execute method (Microsoft.Office.Interop.Word) и т.п.

tumanovalex 21-05-2018 22:06 2814761

Спасибо большое! Разобрался, поиск работает.


Время: 16:15.

Время: 16:15.
© OSzone.net 2001-