【问题标题】:Trying to read an MS Office Document尝试阅读 MS Office 文档
【发布时间】:2012-03-12 18:11:40
【问题描述】:

我有一大段代码用于阅读 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。有些人更喜欢 Libre Office,但这仍然需要针对 MS Office Word 文档运行。

第二 - 我不知道这是否适用于 MS Office 2003 和 MS Office 2007 文档...

第三-它很慢。速度太慢了。

所以!我认为必须有比这更好的方法来运行它。我猜有人必须知道比新手更好的方法。我只是想阅读文档中的文字,没有别的。

【问题讨论】:

    标签: c# .net ms-word interop


    【解决方案1】:

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

    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

    【讨论】:

    • 谢谢!这确实解决了那部分问题。
    • 我们可以使用 NPOI,这是开源项目。有关如何使用 NPOI 从 .DOC 文件中读取所有文本的示例,请参阅我的帖子
    【解决方案2】:

    我们可以通过NPOI 实现很多事情,这是一个开源项目,没有任何办公室可靠性。

    例如从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();
        }
    }
    

    【讨论】:

      【解决方案3】:

      Office Interop 是一个选项(正如您已经发现的那样慢),但请注意:在类似服务器的场景(如 ASP.NET 或 Windows 服务或类似情况)中,MS 不支持 - 见http://support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2

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

      库方法通常非常快,可用于多线程,可用于服务器场景,并带有许多其他可能性...

      至于您的第二个点:使用 Interop,您需要调用 Quit 来关闭应用程序...虽然有时您也需要调用 System.Runtime.InteropServices.Marshal.FinalReleaseComObject(这可能会有一些不受欢迎的一面 -效果见http://blogs.msdn.com/b/yvesdolc/archive/2004/04/17/115379.aspx)

      【讨论】:

        【解决方案4】:

        您可能对 CodePlex 的这个项目感兴趣 - NetOffice

        从网站上看,这里有一些主要功能:

        • Office 集成无版本限制

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

        • 在语法和语义上与 Microsoft 互操作程序集相同

        【讨论】:

        • NetOffice 似乎仍然需要安装 Office。
        猜你喜欢
        • 2018-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-15
        • 2011-11-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多