Подтвердить что ты не робот

Как извлечь текст из документов MS Office в С#

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

4b9b3361

Ответ 1

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

Ответ 2

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

Смотрите: 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();
    }

Ответ 3

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;

Ответ 4

Позвольте мне лишь немного исправить ответ, данный 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

Используйте 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();

Затем сделайте все, что хотите, со словами.

Ответ 6

Немного поздно для вечеринки, но тем не менее - в настоящее время вам не нужно ничего скачивать - все уже установлено с .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();
        }
    }
}

Ответ 7

Simple!

Эти два шага помогут вам:

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

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

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

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

Ответ 8

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

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

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

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

Ответ 9

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

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

Ответ 10

One of the suitable options for extracting text from Office documents in C# is GroupDocs.Parser для .NET API - один из подходящих вариантов для извлечения текста из документов Office в С#. Ниже приведены примеры кода для извлечения как простого, так и отформатированного текста.

Извлечение текста

// Create an instance of Parser class
using(Parser parser = new Parser("sample.docx"))
{
    // Extract a text into the reader
    using(TextReader reader = parser.GetText())
    {
        // Print a text from the document
        // If text extraction isn't supported, a reader is null
        Console.WriteLine(reader == null ? "Text extraction isn't supported" : reader.ReadToEnd());
    }
}

Извлечение форматированного текста

// Create an instance of Parser class
using (Parser parser = new Parser("sample.docx"))
{
    // Extract a formatted text into the reader
    using (TextReader reader = parser.GetFormattedText(new FormattedTextOptions(FormattedTextMode.Html)))
    {
        // Print a formatted text from the document
        // If formatted text extraction isn't supported, a reader is null
        Console.WriteLine(reader == null ? "Formatted text extraction isn't suppported" : reader.ReadToEnd());
    }
}

Раскрытие информации: я работаю евангелистом разработчика в GroupDocs.