Как извлечь текст из документов MS Office в C # - PullRequest
33 голосов
/ 18 июня 2009

Я пытался извлечь текст (строку) из MS Word (.doc, .docx), Excel и Powerpoint, используя C #. Где я могу найти бесплатную и простую библиотеку .Net для чтения документов MS Office? Я пытался использовать NPOI, но я не получил пример того, как использовать NPOI.

Ответы [ 9 ]

34 голосов
/ 28 декабря 2011

Для файлов Microsoft Word 2007 и Microsoft Word 2010 (.docx) вы можете использовать Open XML SDK. Этот фрагмент кода откроет документ и вернет его содержимое в виде текста. Это особенно полезно для тех, кто пытается использовать регулярные выражения для анализа содержимого документа Word. Чтобы использовать это решение, вам понадобится ссылка DocumentFormat.OpenXml.dll, которая является частью OpenXML SDK.

См .: 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();
    }
25 голосов
/ 18 июня 2009

Используя PInvokes, вы можете использовать интерфейс IFilter (в Windows). Фильтры IFilter для многих распространенных типов файлов устанавливаются вместе с Windows (вы можете просматривать их, используя этот инструмент. Вы можете просто попросить IFilter вернуть вам текст из файла. Существует несколько наборов примеров кода ( здесь является одним из таких примеров).

15 голосов
/ 23 ноября 2015

Tika очень полезна и легко извлекает текст из документов различного типа, включая файлы Microsoft Office.

Вы можете использовать этот проект, который является таким прекрасным произведением искусства, созданным Кевином Миллером. http://kevm.github.io/tikaondotnet/

Просто добавьте этот пакет NuGet https://www.nuget.org/packages/TikaOnDotNet/

а затем эта строка кода сотворит магию:

var text = new TikaOnDotNet.TextExtractor().Extract("fileName.docx  / pdf  / .... ").Text;
8 голосов
/ 02 июля 2014

Позвольте мне немного исправить ответ, данный KyleM. Я просто добавил обработку двух дополнительных узлов, которые влияют на результат: один отвечает за горизонтальную табуляцию с помощью «\ t», другой - за вертикальную табуляцию с помощью «\ v». Вот код:

    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();
    }
5 голосов
/ 19 октября 2016

Использование Microsoft Office Interop. Это бесплатно и гладко. Вот как я вытащил все слова из документа.

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

Тогда делай со словами что хочешь.

3 голосов
/ 15 сентября 2016

Немного опоздал на вечеринку, но тем не менее - в настоящее время вам не нужно ничего скачивать - все уже установлено с .NET: (просто добавьте ссылки на System.IO.Compression и 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();
        }
    }
}
2 голосов
/ 18 июня 2009

Simple!

Эти два шага доставят вас туда:

1) Используйте библиотеку Office Interop для преобразования DOC в DOCX
2) Используйте DOCX2TXT , чтобы извлечь текст из нового DOCX

Ссылка для 1) содержит очень хорошее объяснение того, как выполнить преобразование, и даже пример кода.

Альтернативой 2) является просто разархивировать файл DOCX в C # и найти нужные файлы. Вы можете прочитать о структуре ZIP-файла здесь .

Редактировать: Ах, да, я забыл указать, как Скурмедель ниже сделал вывод, что в системе, в которой вы хотите выполнить преобразование, должен быть установлен Office.

1 голос
/ 18 июня 2009

Я однажды сделал экстрактор docx, и это было очень просто. В основном docx и другие (новые) форматы, которые я предполагаю, представляют собой zip-файл с набором XML-файлов. Текст можно извлечь, используя XmlReader и используя только .NET-классы.

Кажется, у меня больше нет кода :(, но я нашел парня, у которого есть подобное решение .

Возможно, это не подходит для вас, если вам нужно читать файлы .doc и .xls, поскольку они представляют собой двоичные форматы и, вероятно, их намного сложнее разобрать.

Существует также OpenXML SDK , все еще в CTP, выпущенный Microsoft.

0 голосов
/ 23 июня 2017

Если вы ищете параметры asp.net, взаимодействие не будет работать, если вы не установите Office на сервере. Даже тогда Microsoft говорит не делать этого.

Я использовал Spire.Doc, работал прекрасно. Spire.Doc скачать Он даже читал документы, которые были действительно .txt, но были сохранены .doc. У них есть бесплатные и платные версии. Вы также можете получить пробную лицензию, которая удаляет некоторые предупреждения из документов, которые вы создаете, но я их не создавал, просто искал их, чтобы бесплатная версия работала как чудо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...