Question

J'essayais d'extraire un texte (chaîne) de MS Word (.doc, .docx), Excel et Powerpoint en utilisant C #. Où puis-je trouver une bibliothèque .Net gratuite et simple pour lire des documents MS Office? J’ai essayé d’utiliser NPOI, mais je n’ai pas reçu d’échantillon sur la façon d’utiliser NPOI.

Était-ce utile?

La solution

En utilisant PInvokes, vous pouvez utiliser le IFilter . interface (sous Windows). Les IFilters de nombreux types de fichiers courants sont installés avec Windows (vous pouvez les parcourir à l’aide de cet outil . Vous pouvez simplement demander à IFilter de vous renvoyer le texte du fichier. Il existe plusieurs ensembles d’exemples de code ( here en est un exemple).

Autres conseils

Pour les fichiers Microsoft Word 2007 et Microsoft Word 2010 (.docx), vous pouvez utiliser le kit SDK Open XML. 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 la 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();
    }

Tika est très utile et permet d’extraire facilement du texte de différents types de documents, y compris des fichiers Microsoft Office.

Vous pouvez utiliser ce projet qui est une si belle oeuvre d'art réalisée par Kevin Miller http://kevm.github.io/tikaondotnet/

Ajoutez simplement ce package 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;

Permettez-moi de corriger un peu la réponse donnée par KyleM. Je viens d'ajouter le traitement de deux nœuds supplémentaires, ce qui influe sur 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();
    }

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.

Un peu tard dans 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: (Veillez simplement à ajouter des références à System.IO.Compression et 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();
        }
    }
}

Simple!

Ces deux étapes vous y mèneront:

1) Utilisez la bibliothèque Office Interop pour convertir le fichier 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 à l'option 2) consiste simplement à décompresser le fichier DOCX en C # et à rechercher les fichiers dont vous avez besoin. Vous pouvez en savoir plus sur la structure du fichier ZIP ici .

Éditer: Ah oui, j'ai oublié de souligner, comme Skurmedel l'a fait plus bas, qu'Office doit être installé sur le système sur lequel vous souhaitez effectuer la conversion.

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 type qui a un type similaire 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.

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, j'ai travaillé à merveille. Téléchargez Spire.Doc . même lire des documents qui étaient vraiment .txt mais 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top