Comment extraire du texte des documents MS office en C#
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 les documents MS Office? J'ai essayé d'utiliser le NPOI mais je n'ai pas eu d'échantillon sur la façon d'utiliser le NPOI.
9 réponses
en utilisant PInvokes vous pouvez utiliser le IFilter interface (sur Windows). Les IFilters pour de nombreux types de fichiers communs sont installés avec Windows (vous pouvez les parcourir en utilisant outil. Vous pouvez simplement demander à L'IFilter de vous retourner le texte du fichier. Il y a plusieurs ensembles de code d'exemple (ici en est un exemple).
pour Microsoft Word 2007 et Microsoft Word 2010 (.docx) vous pouvez utiliser le SDK XML ouvert. Cet extrait de code ouvrira un document et retournera son contenu sous forme de texte. Il est particulièrement utile pour quiconque essaie d'utiliser des expressions régulières pour analyser le contenu d'un document Word. Pour utiliser cette solution, vous auriez besoin de DocumentFormat de référence.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 facile à extraire du texte à partir de différents types de documents, y compris les fichiers Microsoft office.
Vous pouvez utiliser ce projet qui est une si belle œuvre d'art faite par Kevin Miller http://kevm.github.io/tikaondotnet/
il suffit simplement d'ajouter ce paquet NuGet https://www.nuget.org/packages/TikaOnDotNet/
et puis, cette ligne de code va faire de la magie:
var text = new TikaOnDotNet.TextExtractor().Extract("fileName.docx / pdf / .... ").Text;
Permettez-moi juste de corriger un peu la réponse donnée par KyleM. Je viens d'ajouter le traitement de deux noeuds supplémentaires, qui influencent le résultat: l'un est responsable de la tabulation horizontale avec "\t", l'autre - pour 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 L'Interop Microsoft Office. C'est gratuit et plus lisse. Voilà 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();
Puis faire ce que vous voulez avec les mots.
un peu en retard à la fête, mais néanmoins-de nos jours vous n'avez pas besoin de télécharger quoi que ce soit - tout est déjà installé avec .NET: (assurez-vous simplement d'ajouter des références au système.IO.Compression et système.IO.Compression.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();
}
}
}
Simple!
Ces deux étapes, vous y:
1) Utilisez le Bureau bibliothèque d'Interopérabilité pour convertir DOC en DOCX
2) Utiliser DOCX2TXT pour extraire le texte du nouveau DOCX
le lien pour 1) a une très bonne explication de la façon de faire la conversion et même un échantillon de code.
une alternative à 2) est de décompresser le fichier DOCX dans C# et de rechercher les fichiers dont vous avez besoin. Vous pouvez lire à ce sujet l' la structure du fichier ZIP ici.
Edit: Ah oui, J'ai oublié de faire remarquer comme Skurmedel a fait ci-dessous que vous devez avoir Office installé sur le système sur lequel vous voulez faire la conversion.
j'ai fait un extracteur de texte docx une fois, et c'était très simple. Fondamentalement, docx, et les autres (nouveaux) formats, je présume, est un fichier zip avec un tas de fichiers XML à la place. Le texte peut être extraite à l'aide d'un XmlReader et en utilisant seulement .NET-classes.
je n'ai pas le code plus, il semble que :(, mais j'ai trouvé un gars qui ont un semblable solution.
Peut-être que ce n'est pas viable pour vous si vous avez besoin de lire .doc et .les fichiers XLS cependant, puisqu'ils sont des formats binaires et probablement beaucoup plus difficile à analyser.
Il y a aussi le OpenXML SDK, toujours en CTP cependant, publié par Microsoft.
si vous cherchez asp.net options, l'interop ne fonctionnera pas sauf si vous installez office sur le serveur. Même alors, Microsoft dit de ne pas le faire.
J'ai utilisé la flèche.Doc, a fonctionné à merveille. Flèche.Doc download il a même lu des documents qui étaient vraiment .txt, mais ont été sauvé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 pas créé, je viens de les rechercher afin que le libre version a fonctionné comme un charme.