C# 正在尝试读取MS Office文档

C# 正在尝试读取MS Office文档,c#,.net,ms-word,interop,C#,.net,Ms Word,Interop,我有一段代码,用来阅读微软Office Word文档 static void ReadMSOfficeWordFile(string file) { try { Microsoft.Office.Interop.Word.Application msWordApp = new Microsoft.Office.Interop.Word.Application(); object nullobj = System.Reflection.Missing.Val

我有一段代码,用来阅读微软Office Word文档

static void ReadMSOfficeWordFile(string file) {
    try {
        Microsoft.Office.Interop.Word.Application msWordApp = new Microsoft.Office.Interop.Word.Application();
        object nullobj = System.Reflection.Missing.Value;
        object ofalse = false;
        object ofile = file;

        Microsoft.Office.Interop.Word.Document doc = msWordApp.Documents.Open(
                                                    ref ofile, ref nullobj, ref nullobj,
                                                    ref nullobj, ref nullobj, ref nullobj,
                                                    ref nullobj, ref nullobj, ref nullobj,
                                                    ref nullobj, ref nullobj, ref nullobj,
                                                    ref nullobj, ref nullobj, ref nullobj,
                                                    ref nullobj);
        string result = doc.Content.Text.Trim();
        doc.Close(ref ofalse, ref nullobj, ref nullobj);
        msWordApp.Quit();
        CheckLineMatch(file, result);
    }
    catch {
        RaiseError("Unable to parse file because of MS Office error.", file);
    }
}
我对此有三个问题

首先,它依赖于MS Office安装在每个可能运行它的系统上。有些人更喜欢Libre Office,但这仍然需要与MS Office Word文档相匹配

static void ReadMSOfficeWordFile(string file) {
    try {
        Microsoft.Office.Interop.Word.Application msWordApp = new Microsoft.Office.Interop.Word.Application();
        object nullobj = System.Reflection.Missing.Value;
        object ofalse = false;
        object ofile = file;

        Microsoft.Office.Interop.Word.Document doc = msWordApp.Documents.Open(
                                                    ref ofile, ref nullobj, ref nullobj,
                                                    ref nullobj, ref nullobj, ref nullobj,
                                                    ref nullobj, ref nullobj, ref nullobj,
                                                    ref nullobj, ref nullobj, ref nullobj,
                                                    ref nullobj, ref nullobj, ref nullobj,
                                                    ref nullobj);
        string result = doc.Content.Text.Trim();
        doc.Close(ref ofalse, ref nullobj, ref nullobj);
        msWordApp.Quit();
        CheckLineMatch(file, result);
    }
    catch {
        RaiseError("Unable to parse file because of MS Office error.", file);
    }
}
第二,我不知道这是否适用于MS Office 2003和MS Office 2007文档

第三,速度很慢。速度慢得让人难以忍受

所以!我想一定有比这更好的方法来运行它。我猜有人应该知道比新手更好的方法。我只是试图阅读文档中的文本,没有其他内容。

响应您的“Word应用程序挂起打开”,您需要告诉它关闭

msWordApp.Quit()

关于“依赖安装的MS Office”,您使用的是互操作。因此,根据定义,它需要安装。你可以去一家商业图书馆看看

响应“Word应用程序挂起打开”,您需要告诉它关闭

msWordApp.Quit()

关于“依赖安装的MS Office”,您使用的是互操作。因此,根据定义,它需要安装。你可以去一家商业图书馆看看

Office Interop是一个选项(正如您已经发现的那样慢),但请注意:在类似服务器的场景中(如ASP.NET或Windows服务或类似),MS不支持它

通常使用一些库来实现您想要的:

  • (免费,仅支持DOCX)
  • (商业,支持文档和DOCX)
库方法通常非常快速,可用于多线程,可用于服务器场景,并附带许多其他可能性

至于您的第二点:使用Interop,您需要调用以关闭应用程序。。。虽然有时您也需要调用
System.Runtime.InteropServices.Marshal.FinalReleaseComObject
(这可能会有一些不希望的副作用,请参见)

Office Interop是一个选项(正如您已经发现的那样慢),但请注意:MS在类似服务器的场景中不支持它(如ASP.NET或Windows服务或类似服务)-请参阅

通常使用一些库来实现您想要的:

  • (免费,仅支持DOCX)
  • (商业,支持文档和DOCX)
库方法通常非常快速,可用于多线程,可用于服务器场景,并附带许多其他可能性


至于你的第二点:使用Interop,你需要调用来关闭应用程序…尽管有时你也需要调用
系统.Runtime.InteropServices.Marshal.FinalEleaseComObject
(可能会有一些不希望的副作用,请参见)

你可能对CodePlex中的这个项目感兴趣-

该网站提供以下主要功能:

  • 无版本限制的Office集成

  • 包括Office版本2000、2002、2003、2007和2010的所有方法、属性和事件

  • 在语法和语义上与Microsoft Interop程序集相同


您可能对CodePlex-

该网站提供以下主要功能:

  • 无版本限制的Office集成

  • 包括Office版本2000、2002、2003、2007和2010的所有方法、属性和事件

  • 在语法和语义上与Microsoft Interop程序集相同


    • 我们能够通过开源项目实现很多事情,而不需要任何办公室可靠性

      例如,从word文档中读取所有文本可以实现如下所示的功能

      public string ReadAllTextFromWordDocFile(string fileName)
      {
          using (StreamReader streamReader = new StreamReader(fileName))
          {
              var document = new HWPFDocument(streamReader.BaseStream);
              var wordExtractor = new WordExtractor(document);
              var docText = new StringBuilder();
              foreach (string text in wordExtractor.ParagraphText)
              {
                  docText.AppendLine(text.Trim());
              }
              streamReader.Close();
              return docText.ToString();
          }
      }
      

      我们能够通过开源项目实现很多事情,而不需要任何办公室可靠性

      例如,从word文档中读取所有文本可以实现如下所示的功能

      public string ReadAllTextFromWordDocFile(string fileName)
      {
          using (StreamReader streamReader = new StreamReader(fileName))
          {
              var document = new HWPFDocument(streamReader.BaseStream);
              var wordExtractor = new WordExtractor(document);
              var docText = new StringBuilder();
              foreach (string text in wordExtractor.ParagraphText)
              {
                  docText.AppendLine(text.Trim());
              }
              streamReader.Close();
              return docText.ToString();
          }
      }
      

      谢谢!这确实修复了那个部分。相反,我们可以使用NPOI,这是一个开源项目。有关如何使用NPOI读取.DOC文件中的所有文本的示例,请参阅我的帖子。谢谢!这确实修复了那个部分。相反,我们可以使用NPOI,这是一个开源项目。有关如何使用NPOI读取.DOC文件中的所有文本的示例,请参阅我的帖子eems仍然需要安装Office。NetOffice似乎仍然需要安装Office。