.net 扫描一堆Word文档以查找给定的短语

.net 扫描一堆Word文档以查找给定的短语,.net,ms-word,.net,Ms Word,如何扫描一堆Microsoft Word(2003)文档?我正在文档中搜索某个短语,并希望返回包含该短语的文件名 代码示例将特别有用。对于2007文档,使用。这些文件基本上是一个zip文件,其中包含一组包含文档内容的xml文件。您所要做的就是扫描xml以找到使用此框架所需的内容 事实上,如果您有一个名为testDoc.docx的word 2007文档,您只需在其末尾添加.zip,就可以查看其中的内容。所以它看起来像testDoc.docx.zip 主要的xml文件是一个名为document.xm

如何扫描一堆Microsoft Word(2003)文档?我正在文档中搜索某个短语,并希望返回包含该短语的文件名


代码示例将特别有用。

对于2007文档,使用。这些文件基本上是一个zip文件,其中包含一组包含文档内容的xml文件。您所要做的就是扫描xml以找到使用此框架所需的内容

事实上,如果您有一个名为testDoc.docx的word 2007文档,您只需在其末尾添加.zip,就可以查看其中的内容。所以它看起来像testDoc.docx.zip


主要的xml文件是一个名为document.xml的文件,在Word 2003中,您可以搜索二进制文件,其中大部分文本都是完整的。

如果您可以访问antiword和grep,应该很容易

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

您可以使用

互操作服务是您的选择吗?如果服务器上安装了Word,您只需打开Word文档并使用Word本身的查找功能来定位文本。当然,这是一种资源密集型方法,在使用互操作服务时有很多事情需要小心,但它可以完成工作


您最大的问题可能是需要在服务器上安装适当版本的Word。

手头没有代码示例。但是你看过windows索引服务和安装Office插件吗?

你可以用COM来完成。然而,如果您正在扫描大量文件,这可能会非常缓慢,因为您将通过Word本身与文本进行交互

下面是一些使用python的代码(对不起,我对.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

allclaws方法的VB.NET版本:

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
函数ContainsText(ByVal文件名为字符串,ByVal文本为字符串)为布尔值
Dim应用程序作为新的Microsoft.Office.Interop.Word.Application
Dim doc作为Microsoft.Office.Interop.Word.Document
doc=app.Documents.Open(DirectCast(文件名、对象))
尝试
返回doc.Content.Text.IndexOf(Text,StringComparison.CurrentCultureIgnoreCase)-1
最后
app.Quit()
结束尝试
端函数
编辑:


要实现这一点,您需要添加对Microsoft Word 11.0对象库的引用,该库位于“添加引用”对话框的“COM”选项卡上。不幸的是,这些是2003年的文档。谢谢。谁说有服务器。。。?我确实在机器上安装了Word,它将在上面运行。我当然不想为一段文本手动搜索1000个文件!我需要用.NET编程实现这一点。有趣的是,投票率最高的答案(allclaws')必须创建Word实例,就像Interop services那样,但我被否决了。另外,请参阅Patrick McDonald的评论——这正是我的建议。谢谢!!我需要添加什么参考资料才能使此工作正常?如果我没有DLL,我在哪里可以找到它?@Josh,这个库是Word的一部分,所以如果你的机器上安装了Word,那么你就可以找到它。