如何提取从C#MS office文档文本如何提取从C#MS office文档文本(How to ex

2019-05-13 12:16发布

我试图提取使用C#从微软Word(.DOC,.DOCX),Excel和PowerPoint中的文本(字符串)。 我在哪里可以找到一个自由和简单的.NET库来读取MS Office文档? 我试图用NPOI,但我没有得到有关如何使用NPOI样品。

Answer 1:

使用PInvokes可以使用的IFilter接口(在Windows上)。 对于许多常见文件类型的IFilter安装与Windows(您可以通过浏览他们这个工具,你可以只问的IFilter从文件返回你的文字。有几套的示例代码( 在这里就是这样一个例子)。



Answer 2:

对于Microsoft Word 2007和Microsoft Word 2010文件(.docx)文件,您可以使用的Open XML SDK。 下面这段代码会打开一个文档,文本返回其内容。 这是任何人试图使用正则表达式解析Word文档的内容特别有用。 要使用此解决方案,您将需要参考DocumentFormat.OpenXml.dll,这是OpenXML的SDK的一部分。

请参阅: http://msdn.microsoft.com/en-us/library/bb448854.aspx

 public static string TextFromWord(SPFile file)
    {
        const string wordmlNamespace = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";

        StringBuilder textBuilder = new StringBuilder();
        using (WordprocessingDocument wdDoc = WordprocessingDocument.Open(file.OpenBinaryStream(), false))
        {
            // Manage namespaces to perform XPath queries.  
            NameTable nt = new NameTable();
            XmlNamespaceManager nsManager = new XmlNamespaceManager(nt);
            nsManager.AddNamespace("w", wordmlNamespace);

            // Get the document part from the package.  
            // Load the XML in the document part into an XmlDocument instance.  
            XmlDocument xdoc = new XmlDocument(nt);
            xdoc.Load(wdDoc.MainDocumentPart.GetStream());

            XmlNodeList paragraphNodes = xdoc.SelectNodes("//w:p", nsManager);
            foreach (XmlNode paragraphNode in paragraphNodes)
            {
                XmlNodeList textNodes = paragraphNode.SelectNodes(".//w:t", nsManager);
                foreach (System.Xml.XmlNode textNode in textNodes)
                {
                    textBuilder.Append(textNode.InnerText);
                }
                textBuilder.Append(Environment.NewLine);
            }

        }
        return textBuilder.ToString();
    }


Answer 3:

蒂卡是非常有益的,容易提取不同类型的文档,包括Microsoft Office文件中的文本。

你可以使用这个项目,这是这么好的一件艺术品由凯文·米勒http://kevm.github.io/tikaondotnet/

只需简单地添加这个NuGet包https://www.nuget.org/packages/TikaOnDotNet/

然后,这个代码一行会做的魔力:

var text = new TikaOnDotNet.TextExtractor().Extract("fileName.docx  / pdf  / .... ").Text;


Answer 4:

让我纠正一点点由KyleM给出了答案。 我只是增加了两个额外的节点,其影响结果的处理:一个是负责与“\ t”的,其他水平制表 - 用“\ V”垂直制表。 下面是代码:

    public static string ReadAllTextFromDocx(FileInfo fileInfo)
    {
        StringBuilder stringBuilder;
        using(WordprocessingDocument wordprocessingDocument = WordprocessingDocument.Open(dataSourceFileInfo.FullName, false))
        {
            NameTable nameTable = new NameTable();
            XmlNamespaceManager xmlNamespaceManager = new XmlNamespaceManager(nameTable);
            xmlNamespaceManager.AddNamespace("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main");

            string wordprocessingDocumentText;
            using(StreamReader streamReader = new StreamReader(wordprocessingDocument.MainDocumentPart.GetStream()))
            {
                wordprocessingDocumentText = streamReader.ReadToEnd();
            }

            stringBuilder = new StringBuilder(wordprocessingDocumentText.Length);

            XmlDocument xmlDocument = new XmlDocument(nameTable);
            xmlDocument.LoadXml(wordprocessingDocumentText);

            XmlNodeList paragraphNodes = xmlDocument.SelectNodes("//w:p", xmlNamespaceManager);
            foreach(XmlNode paragraphNode in paragraphNodes)
            {
                XmlNodeList textNodes = paragraphNode.SelectNodes(".//w:t | .//w:tab | .//w:br", xmlNamespaceManager);
                foreach(XmlNode textNode in textNodes)
                {
                    switch(textNode.Name)
                    {
                        case "w:t":
                            stringBuilder.Append(textNode.InnerText);
                            break;

                        case "w:tab":
                            stringBuilder.Append("\t");
                            break;

                        case "w:br":
                            stringBuilder.Append("\v");
                            break;
                    }
                }

                stringBuilder.Append(Environment.NewLine);
            }
        }

        return stringBuilder.ToString();
    }


Answer 5:

使用Microsoft Office互操作。 它是免费的,光滑。 在这里我怎么拉都来自一个文档的话。

    using Microsoft.Office.Interop.Word;

   //Create Doc
    string docPath = @"C:\docLocation.doc";
    Application app = new Application();
    Document doc = app.Documents.Open(docPath);

    //Get all words
    string allWords = doc.Content.Text;
    doc.Close();
    app.Quit();

然后做你想做的话什么的。



Answer 6:

有点迟到了,但尽管如此 - 现在你不需要下载任何东西 - 所有已经与.NET安装:(只要确保将引用添加到System.IO.Compression和System.IO.Compression.FileSystem)

using System;
using System.Linq;
using System.Xml.Linq;
using System.Xml.XPath;
using System.Xml;
using System.Text;
using System.IO.Compression;

public static class DocxTextExtractor
{
    public static string Extract(string filename)
    {
        XmlNamespaceManager NsMgr = new XmlNamespaceManager(new NameTable());
        NsMgr.AddNamespace("w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main");

        using (var archive = ZipFile.OpenRead(filename))
        {
            return XDocument
                .Load(archive.GetEntry(@"word/document.xml").Open())
                .XPathSelectElements("//w:p", NsMgr)
                .Aggregate(new StringBuilder(), (sb, p) => p
                    .XPathSelectElements(".//w:t|.//w:tab|.//w:br", NsMgr)
                    .Select(e => { switch (e.Name.LocalName) { case "br": return "\v"; case "tab": return "\t"; } return e.Value; })
                    .Aggregate(sb, (sb1, v) => sb1.Append(v)))
                .ToString();
        }
    }
}


Answer 7:

简单!

这两个步骤将让你有:

1)使用办公室的Interop库为DOC转换为DOCX
2)使用DOCX2TXT来提取新DOCX文本

链接1)具有怎样做转换,甚至一个代码示例一个很好的解释。

2替代)是刚刚解压在C#中DOCX文件和扫描您需要的文件。 你可以阅读的ZIP文件的结构在这里 。

编辑:是啊,我忘了指出作为Skurmedel做了如下,你必须要在其上进行转换的系统上安装的Office。



Answer 8:

我做了一个DOCX文本提取一次,这是非常简单的。 基本上DOCX,和其他(新)格式我想,是一个zip文件和一帮XML的文件来代替。 文本可以使用的XmlReader,并且仅使用.NET类中提取。

我没有代码了,它似乎:(,但我发现一个人谁也有类似的解决方案 。

也许你需要阅读,虽然.doc和.xls文件,因为它们是二进制格式,可能更难分析,这是不可行的你。

还有的OpenXML的SDK ,仍处于CTP虽然,由微软发布。



Answer 9:

如果您正在寻找asp.net选项,除非你在服务器上安装Office的互操作将无法正常工作。 即使这样,微软表示,不这样做。

我用Spire.Doc,漂亮的工作。 Spire.Doc下载它甚至读了真的.txt文件,但被保存.DOC文件。 他们有免费和付费版本。 您还可以得到一个试用许可证,可以消除您创建的文档一定的警示作用,但我没有创建任何,只是搜查他们这样免费版本工作就像一个魅力。



文章来源: How to extract text from MS office documents in C#