Jak wyodrębnić tekst z dokumentów MS office w C#

Próbowałem wyodrębnić tekst (string) z MS Word (.doc,docx), Excel i Powerpoint przy użyciu C#. Gdzie mogę znaleźć darmową i prostą bibliotekę. NET do odczytu dokumentów MS Office? Próbowałem użyć NPOI, ale nie dostałem próbki o tym, jak używać NPOI.

Author: Elias Haileselassie, 2009-06-18

9 answers

Używając PInvokes możesz używać interfejsu IFilter (w systemie Windows). Ifiltery dla wielu popularnych typów plików są instalowane w systemie Windows (możesz je przeglądać za pomocą tego narzędzia. Możesz po prostu poprosić IFilter, aby zwrócił Ci tekst z pliku. Istnieje kilka zestawów przykładowego kodu ( tutaj jest jednym z takich przykładów).

 23
Author: adrianbanks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-18 08:28:28

Dla Microsoft Word 2007 i Microsoft Word 2010 (.docx) pliki można użyć Open XML SDK. Ten fragment kodu otworzy dokument i zwróci jego zawartość jako tekst. Jest to szczególnie przydatne dla każdego, kto próbuje użyć wyrażeń regularnych do analizy zawartości dokumentu programu Word. Aby skorzystać z tego rozwiązania, potrzebujesz reference DocumentFormat.OpenXml.dll, który jest częścią OPENXML SDK.

Zobacz: 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
Author: KyleM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-28 18:27:09

Tika jest bardzo pomocny i łatwy do wyodrębnienia tekstu z różnego rodzaju dokumentów, w tym plików microsoft office.

Możesz użyć tego projektu, który jest tak ładnym dziełem sztuki stworzonym przez Kevina Millera http://kevm.github.io/tikaondotnet/

Po prostu dodaj ten pakiet NuGet https://www.nuget.org/packages/TikaOnDotNet/

I wtedy ta jedna linijka kodu zrobi magię:

var text = new TikaOnDotNet.TextExtractor().Extract("fileName.docx  / pdf  / .... ").Text;
 15
Author: Sep,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-23 02:05:57

Pozwól, że poprawię trochę odpowiedź udzieloną przez KyleM. Właśnie dodałem przetwarzanie dwóch dodatkowych węzłów, które wpływają na wynik: jeden odpowiada za poziomą tabelę z "\ t", drugi-za pionową tabelę z "\ v". Oto kod:

    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
Author: Jordan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-14 11:54:58

Użyj Microsoft Office Interop. Jest darmowy i sprytny. Oto jak wyciągnąłem wszystkie słowa od lekarza.

    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();
Więc rób co chcesz ze słowami.
 4
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-19 02:57:24

Trochę za późno na imprezę , ale mimo to-w dzisiejszych czasach nie trzeba nic pobierać-wszystko jest już zainstalowane Z. NET: (upewnij się tylko, że dodałeś odniesienia do System. IO. Compression i 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();
        }
    }
}
 3
Author: lxa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-15 16:40:56

Proste!

Te dwa kroki cię tam zaprowadzą:

1) Użyj Office Interop library Aby przekonwertować DOC do DOCX
2) Użyj DOCX2TXT , aby wyodrębnić tekst z nowego DOCX

Link do 1) ma bardzo dobre wyjaśnienie, jak wykonać konwersję, a nawet próbkę kodu.

Alternatywą dla 2) jest rozpakowanie pliku DOCX w C# i skanowanie w poszukiwaniu potrzebnych plików. Możesz przeczytać o strukturze pliku ZIP tutaj .

Edit: Ah tak, zapomniałem zaznaczyć jak Skurmedel zrobił poniżej, że musisz mieć zainstalowany Office w systemie, na którym chcesz wykonać konwersję.

 2
Author: joshcomley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-18 07:38:03

Zrobiłem kiedyś docx text extractor i to było bardzo proste. Zasadniczo docx, a inne (nowe) formaty, jak przypuszczam, to plik zip z kilkoma plikami XML. Tekst można rozpakować za pomocą Xmlreadera i używać tylko klas. NET.

Nie mam już kodu, wygląda na to: (, ale znalazłem faceta, który ma podobne rozwiązanie .

Może to nie jest realne dla Ciebie, jeśli chcesz czytać .doc i .plików xls, ponieważ są to formaty binarne i prawdopodobnie dużo trudniej analizować.

Istnieje również OPENXML SDK , wciąż w CTP, wydany przez Microsoft.

 1
Author: Skurmedel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-18 10:24:30

Jeśli szukasz asp.net opcje, interop nie będzie działać, jeśli nie zainstalujesz pakietu office na serwerze. Nawet wtedy Microsoft mówi, aby tego nie robić.

Użyłem Spire.Doc, pracował pięknie. Iglica.Doc download to nawet czytać dokumenty, które były naprawdę .txt ale zostały zapisane .doktorze. Mają wersje bezpłatne i płatne. Możesz również uzyskać licencję próbną, która usuwa ostrzeżenia z dokumentów, które tworzysz, ale nie utworzyłem żadnego, po prostu przeszukałem je, aby darmowa wersja działała jak urok.

 0
Author: Erik Felde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-23 16:51:14