在c#中搜索word文档

时间:2014-07-11 06:27:48

标签: c#

我正在制作一个搜索模块(C#中的窗体)。它适用于.txt文件,但是 我也需要在Word文档中搜索单词。 我尝试使用Microsoft.Office.Interop.Word; 代码如下

Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
Microsoft.Office.Interop.Word.Document docOpen = app.Documents.Open(flname);
StreamReader srObj = new StreamReader(flname);
string read = srObj.ReadToEnd();
if (read.Contains(txtWordInput.Text)) // searching for the input word in the file
{
      count1++;
      lbSearchList.Visible = true;
      lbSearchList.Items.Add(flname);
}
srObj.Close();
app.Documents.Close();

但是在运行时它给出了一个错误,即doc文件已经打开,因此即使文档没有打开也无法访问。

然后我尝试简单地使用流阅读器,它工作并且确实读取了文件,但读取的数据是一些随机符号,而不是实际写在里面的内容。由于这个原因      if(read.Contains(txtWordInput.Text))语句无法搜索该单词。

请帮我解释如何成功搜索word文档中的单词。

3 个答案:

答案 0 :(得分:0)

我的两分钱是srObj在这种情况下完全不相关,你所做的是绕过并忽略你的docOpen和app对象,你创建它们但它们永远不会被使用。我简要介绍了API,我可以说有一些方法可以获取字符列表和单词集合。我认为您可能需要做的是从docOpen属性中获取单词的集合并筛选它们。

您可以使用属性docOpen.Words来获取或设置单词集合,或使用docOpen.Text来获取或将所有文本设置为字符串。

作为一个例子

Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
Microsoft.Office.Interop.Word.Document docOpen = app.Documents.Open(flname);
string read = docOpen.Text
if(read.Contains(txtWordInput.Text)) {
     count1++;
     lbSearchList.Visible = true;
     lbSearchList.Items.Add(flname);
}
app.Documents.Close();

我希望这会有所帮助。

答案 1 :(得分:0)

我认为您可以使用Interop库的Find函数而不是stream。您可以使用以下函数检查word文档中是否存在所需的文本。

    protected bool FindTextInWord(object text, string flname)
    {
        object matchCase = false;
        object matchWholeWord = true;
        object matchWildCards = false;
        object matchSoundsLike = false;
        object matchAllWordForms = false;
        object forward = true;
        object format = false;
        object matchKashida = false;
        object matchDiacritics = false;
        object matchAlefHamza = false;
        object matchControl = false;
        object read_only = false;
        object visible = true;
        object replace = 2;
        object wrap = 1;

        Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
        Microsoft.Office.Interop.Word.Document docOpen = app.Documents.Open(flname);
        bool val = false;
        try
        {
            val = app.Selection.Find.Execute(ref text, ref matchCase, ref matchWholeWord,
            ref matchWildCards, ref matchSoundsLike, ref matchAllWordForms, ref forward, ref wrap,
            ref format, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, Type.Missing, Type.Missing);
        }
        finally
        {
            app.Documents.Close();
        }
        return val;
    }

您可以在以下链接中查看每个参数的详细信息 http://msdn.microsoft.com/en-us/library/office/ff193977(v=office.15).aspx

您可以按以下方式调用该功能

FindTextInWord((object)"Proposal","your file name here");

答案 2 :(得分:0)

使用该代码,看来错误是正确的。您尝试两次打开文档。首先使用“ app.Documents.Open(flname)”行,然后紧接着创建具有相同文件名的StreamReader对象。 Word文档也不是文本文件,而是实际上是一个zip文件,其中包含其他文件。因此,如果您只是尝试使用StreamReader以文本形式读取文件,那么您将得到的正是……一堆符号。

使用此方法可以简单地读取文本并在Word文件中搜索特定的字符串。另外,请确保具有正确的using语句。

using Word = Microsoft.Office.Interop.Word;

public static Boolean CheckWordDocumentForString(String documentLocation, String stringToSearchFor, Boolean caseSensitive = true)
{
    // Create an application object if the passed in object is null
    Word.Application winword = new Word.Application();

    // Use the application object to open our word document in ReadOnly mode
    Word.Document wordDoc = winword.Documents.Open(documentLocation, ReadOnly: true);

    // Search for our string in the document
    Boolean result;
    if (caseSensitive)
        result = wordDoc.Content.Text.IndexOf(stringToSearchFor) >= 0;
    else
        result = wordDoc.Content.Text.IndexOf(stringToSearchFor, StringComparison.CurrentCultureIgnoreCase) >= 0;

    // Close the document and the application since we're done searching
    wordDoc.Close();
    winword.Quit();

    return result;
}

然后使用该方法,只需像其他静态方法一样调用它即可。

MyClass.CheckWordDocumentForString(@"C:\Users\CoolDude\Documents\MyWordDoc.docx", "memory", false);

使用您的代码会更像这样:

if (MyClass.CheckWordDocumentForString(flname, txtWordInput.Text, false))
{
    // Do something if it is found
}
else
{
    // Do something if it is not found
}