2009-03-20 2 views

ответ

2

версия VB.NET метода allclaws':

Function ContainsText(ByVal fileName As String, ByVal text As String) As Boolean 

    Dim app As New Microsoft.Office.Interop.Word.Application 
    Dim doc As Microsoft.Office.Interop.Word.Document 
    doc = app.Documents.Open(DirectCast(fileName, Object)) 

    Try 
     Return doc.Content.Text.IndexOf(text, StringComparison.CurrentCultureIgnoreCase) <> -1 
    Finally 
     app.Quit() 
    End Try 

End Function 

Edit:

Чтобы сделать эту работу вам нужно добавить ссылку на библиотеку объектов Microsoft Word 11.0, доступно на вкладке COM диалогового окна «Добавить ссылки»

+0

СПАСИБО !! Какую ссылку мне нужно добавить, чтобы сделать эту работу? Если у меня нет библиотеки DLL, где я могу ее найти? –

+0

@Josh, библиотека является частью Word, поэтому, если на вашем компьютере установлено Word, вы получите ее. –

0

Для документов 2007 года достаточно легко использовать Open XML SDK 2.0 framework. Эти файлы в основном представляют собой zip-файл, а внутри zip-файла содержит кучу xml-файлов, содержащих содержимое документов. Все, что вам нужно сделать, это сканировать xml, чтобы найти то, что вам нужно, используя эту инфраструктуру.

На самом деле, если у вас есть документ Word 2007 с именем testDoc.docx, вы можете просто добавить .zip в конец, и вы сможете заглянуть внутрь. Так это будет выглядеть testDoc.docx.zip

Основной файл XML файл с именем document.xml

+0

К сожалению, это документы 2003 года. Благодарю. –

0

В Word 2003 можно найти двоичный файл, самый текст нетронутым в там.

0

Если у вас есть доступ к Antiword и Grep, это должно быть так же просто, как

for file in `antiword *.doc | grep -vf word_to_find` 
do 
    echo "$file" 
done 
-1

ли служба Слово Interop вариант для вас? Если Word установлен на сервере, вы можете просто открыть документы с документами и использовать функции «Найти объекты самого Word», чтобы найти текст. Конечно, это ресурсоемкий метод, и есть много вещей, которые нужно соблюдать при использовании услуг Interop, но он выполнит эту работу.

Ваша самая большая проблема может заключаться в том, что на сервере должна быть установлена ​​соответствующая версия Word.

+0

Кто сказал что-нибудь о сервере ...? У меня на компьютере установлено Word, на котором это будет работать. Я, конечно, не хочу вручную загружать 1000 файлов для фрагмента текста! Мне нужно сделать это программно с .NET. –

+0

Забавно, что самый высокий голосовой ответ (allclaws) должен создать экземпляр Word, так же, как и услуги Interop, но я проголосовал. –

+0

Также см. Комментарий Патрика Макдональда - это именно то, что я предлагал. –

0

У вас нет соответствующих кодов. Но просмотрели ли вы службу индексирования Windows и установили плагин Office?

2

Вы можете сделать это с помощью COM. Однако, если вы сканируете много файлов, это может быть болезненно медленным, так как вы будете взаимодействовать с текстом через сам Word.

Вот некоторые питона код, используя (извините, я не знаю много .Net, но COM-функции будут похожи)

Я предполагаю, что вы, возможно, придется урезать до пробельные немного, чтобы получить хорошие матчи.

import os, win32com.client 

def doc_has_phrase(filename, phrase): 
    found = False 
    app = win32com.client.Dispatch('Word.Application') 
    doc = app.Documents.Open(filename, False, False, False) 
    if phrase in doc.Content.Text.lower(): 
     found = True 
    app.Quit() 
    return found 

phrase = 'key phrase in lowercase' 
valid_types = ['doc'] 
path = "C:\\Path\\To\\Files\\" 

docs = dict ([(f, None) for f in os.listdir (path) if f[-3:] in valid_types]) 
for doc in docs: 
    print doc_has_phrase(path+doc, phrase), path+doc 
Смежные вопросы