首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正在尝试读取MS Office文档

正在尝试读取MS Office文档
EN

Stack Overflow用户
提问于 2012-03-13 02:11:41
回答 4查看 9.6K关注 0票数 1

我有一大段代码,我正在用它来读取MS Office Word文档。

代码语言:javascript
复制
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文档运行。

其次,我不知道这是否适用于MS Office2003和MS Office2007文档……

第三,它很慢。它慢得令人痛苦。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-13 02:17:05

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

代码语言:javascript
复制
msWordApp.Quit()

请参阅http://msdn.microsoft.com/en-us/library/bb215475(v=office.12).aspx

关于“依赖于正在安装的MS Offise”,您使用的是互操作。因此,根据定义,它需要安装。您可以查看其中一个商业化的库。

http://www.aspose.com/categories/.net-components/aspose.words-for-.net/default.aspx http://www.gemboxsoftware.com/document/pricelist

票数 3
EN

Stack Overflow用户

发布于 2012-05-11 15:38:27

NPOI是一个开源项目,我们可以在没有任何办公可靠性的情况下完成很多事情。

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

代码语言:javascript
复制
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();
    }
}
票数 3
EN

Stack Overflow用户

发布于 2012-03-13 02:19:06

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

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

  • MS provides the OpenXML SDK V 2.0 (免费,仅支持DOCX)
  • Aspose.Words (商业),支持DOC和DOCX)

库方法通常非常快,可用于多线程,在服务器场景中可用,并附带许多额外的可能性...

至于你的第二点:使用互操作,你需要调用Quit来关闭应用程序……尽管有时你也需要调用System.Runtime.InteropServices.Marshal.FinalReleaseComObject (这可能会有一些不受欢迎的副作用,参见http://blogs.msdn.com/b/yvesdolc/archive/2004/04/17/115379.aspx)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9672461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档