2009-03-20 2 views

Antwort

2

A VB.NET-Version allclaws' Methode:

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:

Um diese Arbeit Sie einen Verweis auf die Microsoft Word 11.0 Object Library hinzufügen müssen zu machen, verfügbar auf der Registerkarte COM im Dialogfeld Referenzen hinzufügen

+0

DANKE !! Welche Referenz muss ich hinzufügen, damit dies funktioniert? Wenn ich die DLL nicht habe, wo finde ich sie? –

+0

@Josh, die Bibliothek ist Teil von Word. Wenn Sie also Word auf Ihrem Computer installiert haben, haben Sie es. –

0

Für 2007 Dokumente, ist es ziemlich einfach mit der Open XML SDK 2.0 framework. Diese Dateien sind im Grunde genommen eine Zip-Datei und innerhalb der Zip-Datei enthält eine Reihe von XML-Dateien, die den Inhalt von Dokumenten enthält. Alles, was Sie tun müssen, ist das Scannen der XML-Datei, um zu finden, was Sie mit diesem Framework benötigen.

In der Tat, wenn Sie ein Word 2007-Dokument mit dem Namen testDoc.docx hatten, könnten Sie einfach. Zip an das Ende hinzufügen und Sie können hineinschauen. So würde es aussehen testDoc.docx.zip

Die Haupt XML-Datei eine Datei document.xml

+0

Leider sind dies 2003 Dokumente. Vielen Dank. –

0

In Word 2003 genannt ist, können Sie die Binär-Datei suchen, ist die meisten Text innerhalb dort intakt.

0

Wenn Sie Zugang zu antiword und grep, sollte es so einfach wie

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

Ist das Wort Interop-Dienst eine Option für Sie? Wenn Word auf dem Server installiert ist, können Sie einfach die Worddokumente öffnen und die Suchfunktionen von Word selbst verwenden, um Ihren Text zu finden. Natürlich ist dies eine ressourcenintensive Methode, und bei der Verwendung von Interop-Diensten müssen viele Dinge beachtet werden, aber es würde die Aufgabe erledigen.

Ihr größtes Problem möglicherweise sein, dass eine geeignete Version von Word auf dem Server installiert werden muss.

+0

Wer hat etwas über einen Server gesagt ...? Ich habe Word auf dem Computer installiert, auf dem es ausgeführt wird. Ich möchte sicher nicht 1.000 Dateien für einen Text manuell suchen! Ich muss dies programmgesteuert mit .NET tun. –

+0

Lustig, dass die höchste Wahl (Allclaws) eine Instanz von Word erstellen muss, genauso wie Interop-Dienste, aber ich werde abgelehnt. –

+0

Siehe auch Patrick McDonalds Kommentar - genau das habe ich vorgeschlagen. –

0

Das Codesample nicht zur Hand haben. Aber haben Sie sich den Windows-Indizierungsdienst angesehen und das Office-Plugin installiert?

2

Sie könnten es mit COM tun. Wenn Sie jedoch viele Dateien scannen, kann dies schmerzhaft langsam sein, da Sie mit dem Text über Word selbst interagieren werden.

Hier einige Python-Code unter Verwendung von (sorry, ich habe nicht viel .Net wissen, aber die COM-Funktionen ähnlich sein)

Ich vermute, Sie haben könnten, um die Leerzeichen ein wenig trimmen bis zu erhalten gute Übereinstimmungen.

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