editar documento desde crear c# ms-office text-extraction

documento - docx c#



Cómo extraer texto de documentos de MS Office en C# (9)

Estaba intentando extraer un texto (cadena) de MS Word (.doc, .docx), Excel y Powerpoint usando C #. ¿Dónde puedo encontrar una biblioteca .Net gratuita y simple para leer documentos de MS Office? Intenté usar NPOI pero no obtuve una muestra sobre cómo usar NPOI.


¡Sencillo!

Estos dos pasos lo llevarán allí:

1) Use la biblioteca de Office Interop para convertir DOC en DOCX
2) Use DOCX2TXT para extraer el texto del nuevo DOCX

El enlace para 1) tiene una muy buena explicación de cómo hacer la conversión e incluso una muestra de código.

Una alternativa a 2) es simplemente descomprimir el archivo DOCX en C # y buscar los archivos que necesita. Puede leer sobre la estructura del archivo ZIP here .

Editar: Ah sí, me olvidé de señalar que, como hizo Skurmedel debajo, debe tener Office instalado en el sistema en el que desea realizar la conversión.


Hice un extractor de texto docx una vez, y fue muy simple. Básicamente docx, y los otros (nuevos) formatos, supongo, es un archivo zip con un montón de archivos XML en su lugar. El texto se puede extraer usando un XmlReader y usando solo .NET-classes.

Ya no tengo el código, parece :(, pero encontré un chico que tiene una solution similar.

Quizás esto no sea viable para ti si necesitas leer los archivos .doc y .xls, ya que son formatos binarios y probablemente mucho más difíciles de analizar.

También está el SDK de OpenXML , aún en CTP, publicado por Microsoft.


Para los archivos de Microsoft Word 2007 y Microsoft Word 2010 (.docx) puede usar Open XML SDK. Este fragmento de código abrirá un documento y devolverá su contenido como texto. Es especialmente útil para cualquiera que intente usar expresiones regulares para analizar el contenido de un documento de Word. Para usar esta solución necesitaría la referencia DocumentFormat.OpenXml.dll, que es parte del SDK de OpenXML.

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


Permítanme corregir un poco la respuesta dada por KyleM. Acabo de agregar el procesamiento de dos nodos adicionales, que influyen en el resultado: uno es responsable de la tabulación horizontal con "/ t", otro - para la tabulación vertical con "/ v". Aquí está el código:

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


Si está buscando opciones de asp.net, la interoperación no funcionará a menos que instale la oficina en el servidor. Incluso entonces, Microsoft dice que no lo haga.

Utilicé Spire.Doc, funcionó maravillosamente. Descarga de Spire.Doc Incluso leyó documentos que eran realmente .txt pero se guardaron .doc. Tienen versiones gratuitas y de pago. También puede obtener una licencia de prueba que elimina algunas advertencias de los documentos que crea, pero no creé ninguna, solo la busqué para que la versión gratuita funcionara como un amuleto.


Tika es muy útil y fácil de extraer texto de diferentes tipos de documentos, incluidos los archivos de Microsoft Office.

Puedes usar este proyecto que es una obra de arte tan bonita hecha por Kevin Miller http://kevm.github.io/tikaondotnet/

Simplemente agregue este paquete NuGet https://www.nuget.org/packages/TikaOnDotNet/

y luego, esta única línea de código hará la magia:

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


Un poco tarde para la fiesta, pero sin embargo, hoy en día no es necesario descargar nada, ya está todo instalado con .NET: (asegúrese de agregar referencias a System.IO.Compression y 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(); } } }


Usando PInvokes puede usar la interfaz IFilter (en Windows). Los IFilters para muchos tipos de archivos comunes se instalan con Windows (puede examinarlos usando this herramienta. Puede pedirle al IFilter que le devuelva el texto del archivo. Hay varios conjuntos de códigos de ejemplo ( here hay uno).


Use la interoperabilidad de Microsoft Office. Es gratis y resbaladizo. Aquí cómo saqué todas las palabras de 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();

Luego haz lo que quieras con las palabras.