web-dev-qa-db-fra.com

Comment extraire du texte de documents MS Office en C #

J'essayais d'extraire un texte (chaîne) de MS Word (.doc, .docx), d'Excel et de PowerPoint en utilisant C #. Où puis-je trouver une bibliothèque .Net gratuite et simple pour lire des documents MS Office?.

32

En utilisant PInvokes, vous pouvez utiliser l'interface IFilter (sous Windows). Les IFilters de nombreux types de fichiers courants sont installés avec Windows (vous pouvez les parcourir à l'aide de l'outil this ). Vous pouvez simplement demander à IFilter de vous retourner le texte du fichier. ici en est un exemple.

23
adrianbanks

Pour les fichiers Microsoft Word 2007 et Microsoft Word 2010 (.docx), vous pouvez utiliser le kit de développement Open XML SDK. Cet extrait de code ouvrira un document et renverra son contenu sous forme de texte. Il est particulièrement utile pour quiconque essayant d'utiliser des expressions régulières d'analyser le contenu d'un document Word. Pour utiliser cette solution, vous aurez besoin de référence à DocumentFormat.OpenXml.dll, qui fait partie du SDK OpenXML.

Voir: 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();
    }
33
KyleM

Tika est très utile et facile à extraire le texte de différents types de documents, y compris les fichiers Microsoft Office.

Vous pouvez utiliser ce projet qui est une si belle oeuvre de Kevin Miller http://kevm.github.io/tikaondotnet/

Ajoutez simplement ce paquet NuGet https://www.nuget.org/packages/TikaOnDotNet/

et ensuite, cette ligne de code fera la magie:

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

Permettez-moi de corriger un peu la réponse donnée par KyleM. Je viens d'ajouter le traitement de deux noeuds supplémentaires, ce qui influence le résultat: l'un est responsable de la tabulation horizontale avec "\ t", l'autre - de la tabulation verticale avec "\ v". Voici le 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

Utilisez Microsoft Office Interop. C'est gratuit et lisse. Voici comment j'ai tiré tous les mots d'un doc. 

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

Ensuite, faites ce que vous voulez avec les mots. 

4
Chris

Un peu tard pour la soirée, mais néanmoins - de nos jours, vous n'avez plus besoin de télécharger quoi que ce soit - tout est déjà installé avec .NET: .Système de fichiers)

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

Simple!

Ces deux étapes vous y mèneront:

1) Utilisez la bibliothèque Office Interop pour convertir DOC en DOCX.
2) Utilisez DOCX2TXT pour extraire le texte du nouveau DOCX

Le lien pour 1) explique très bien comment effectuer la conversion et même un exemple de code.

Une alternative à 2) consiste simplement à décompresser le fichier DOCX en C # et à rechercher les fichiers dont vous avez besoin. Vous pouvez lire sur la structure du fichier Zip ici .

Modifier: Ah oui, j'ai oublié de signaler, comme Skurmedel l'a indiqué ci-dessous, que Microsoft doit être installé sur le système sur lequel vous souhaitez effectuer la conversion.

2
joshcomley

J'ai fait un extracteur de texte docx une fois, et c'était très simple. En gros, docx, et les autres (nouveaux) formats, je présume, est un fichier Zip avec un tas de fichiers XML. Le texte peut être extrait à l'aide d'un XmlReader et en utilisant uniquement les classes .NET.

Je n'ai plus le code, semble-t-il :(, mais j'ai trouvé un gars qui a la même solution solution .

Cela n’est peut-être pas viable pour vous si vous devez lire les fichiers .doc et .xls, car ce sont des formats binaires et probablement beaucoup plus difficiles à analyser.

Il existe également le SDK OpenXML , toujours au format CTP, publié par Microsoft.

1
Skurmedel

Si vous recherchez des options asp.net, l’interopérabilité ne fonctionnera que si vous installez office sur le serveur. Même alors, Microsoft dit de ne pas le faire. 

J'ai utilisé Spire.Doc, a fonctionné à merveille. Téléchargement Spire.Doc Il lit même les documents qui étaient vraiment .txt mais qui ont été enregistrés .doc. Ils ont des versions gratuites et payantes. Vous pouvez également obtenir une licence d’essai qui supprime certains avertissements des documents que vous créez, mais je n’en ai créé aucun, je les ai simplement recherchés afin que la version gratuite fonctionne comme un charme. 

0
Erik Felde