webentwicklung-frage-antwort-db.com.de

So extrahieren Sie Text aus MS-Office-Dokumenten in C #

Ich habe versucht, einen Text (Zeichenfolge) aus MS Word (.doc, .docx), Excel und PowerPoint mit C # zu extrahieren. Wo finde ich eine kostenlose und einfache .Net-Bibliothek zum Lesen von MS Office-Dokumenten? Ich habe versucht, NPOI zu verwenden, aber ich habe kein Beispiel über die Verwendung von NPOI erhalten.

32

Mit PInvokes können Sie die Schnittstelle IFilter (unter Windows) verwenden. Die IFilter für viele gängige Dateitypen werden mit Windows installiert (Sie können sie mit dem Tool this durchsuchen. Sie können den IFilter einfach bitten, Ihnen den Text aus der Datei zurückzugeben. Es gibt mehrere Beispielcodes ( hier) ist ein solches Beispiel).

23
adrianbanks

Für Microsoft Word 2007- und Microsoft Word 2010-Dateien (.docx) können Sie das Open XML-SDK verwenden. Dieses Codefragment öffnet ein Dokument und gibt seinen Inhalt als Text zurück. Dies ist besonders nützlich für alle, die versuchen, reguläre Ausdrücke zu verwenden, um den Inhalt eines Word-Dokuments zu analysieren. Um diese Lösung verwenden zu können, benötigen Sie die Referenz DocumentFormat.OpenXml.dll, die Teil des OpenXML SDK ist.

Siehe: http://msdn.Microsoft.com/de-de/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();
    }
33
KyleM

Tika ist sehr hilfreich und kann leicht Text aus verschiedenen Arten von Dokumenten extrahieren, einschließlich Microsoft-Office-Dateien.

Sie können dieses Projekt verwenden, das so ein schönes Kunstwerk von Kevin Miller ist http://kevm.github.io/tikaondotnet/

Fügen Sie einfach dieses NuGet-Paket hinzu https://www.nuget.org/packages/TikaOnDotNet/

und dann wird diese eine Zeile Code die Magie bewirken:

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

Lassen Sie mich die Antwort von KyleM etwas korrigieren. Ich habe nur die Verarbeitung von zwei zusätzlichen Knoten hinzugefügt, die das Ergebnis beeinflussen: einer ist für die horizontale Tabellierung mit "\ t" verantwortlich, anderer - für die vertikale Tabellierung mit "\ v". Hier ist der Code:

    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();
    }
7
Jordan

Verwenden Sie das Microsoft Office Interop. Es ist kostenlos und glatt. Hier, wie ich alle Wörter aus einem Dokument gezogen habe. 

    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();

Dann machen Sie mit den Worten, was Sie wollen. 

4
Chris

Ein bisschen spät für die Party, aber trotzdem - heutzutage müssen Sie nichts herunterladen - alles ist bereits mit .NET installiert: Dateisystem)

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();
        }
    }
}
3
lxa

Einfach!

Diese zwei Schritte bringen Sie dorthin:

1) Verwenden Sie die Office Interop-Bibliothek , um DOC in DOCX zu konvertieren
2) Verwenden Sie DOCX2TXT , um den Text aus dem neuen DOCX zu extrahieren

Der Link zu 1) enthält eine sehr gute Erklärung für die Konvertierung und sogar ein Codebeispiel.

Eine Alternative zu 2) ist, die DOCX-Datei einfach in C # zu entpacken und nach den Dateien zu suchen, die Sie benötigen. Sie können über die Struktur der ZIP-Datei hier nachlesen.

Bearbeiten: Ah ja, ich habe vergessen zu erwähnen, wie Skurmedel unten tat, dass auf dem System, auf dem Sie die Konvertierung durchführen möchten, Office installiert sein muss.

2
joshcomley

Ich habe einmal einen Docx-Text-Extraktor gemacht, und das war sehr einfach. Grundsätzlich handelt es sich bei docx und den anderen (neuen) Formaten, die ich vermute, um eine ZIP-Datei mit einer Reihe von XML-Dateien. Der Text kann mit einem XmlReader und nur mit .NET-Klassen extrahiert werden.

Ich habe den Code nicht mehr, wie es scheint :(, aber ich habe einen Typen gefunden, der eine ähnliche Lösung hat.

Möglicherweise ist dies nicht für Sie geeignet, wenn Sie .doc- und .xls-Dateien lesen müssen, da sie binäre Formate sind und wahrscheinlich viel schwerer zu analysieren sind.

Es gibt auch das OpenXML SDK , das jedoch noch in CTP von Microsoft veröffentlicht wurde.

1
Skurmedel

Wenn Sie nach asp.net-Optionen suchen, funktioniert Interop nur, wenn Sie office auf dem Server installieren. Selbst dann sagt Microsoft, es nicht zu tun. 

Ich habe Spire.Doc verwendet, hat wunderbar gearbeitet. Spire.Doc download Es wurden sogar Dokumente gelesen, die wirklich .txt waren, jedoch gespeichert wurden .doc. Sie haben kostenlose und kostenpflichtige Versionen. Sie können auch eine Testlizenz erhalten, mit der einige Warnungen aus den von Ihnen erstellten Dokumenten entfernt werden. Ich habe jedoch keine erstellt, sondern nur gesucht, sodass die kostenlose Version wie ein Zauber wirkt. 

0
Erik Felde