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

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

9 ответов


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


для Microsoft Word 2007 и Microsoft Word 2010 (.docx) файлы можно использовать пакет SDK Open XML. Этот фрагмент кода откроет документ и вернет его содержимое в виде текста. Это особенно полезно для тех, кто пытается использовать регулярные выражения для разбора содержимого документа 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();
    }

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;

Давайте я немного поправлю ответ 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();
    }

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

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

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


немного поздно на вечеринку, но тем не менее-в настоящее время вам не нужно ничего скачивать - все уже установлено с .NET: (просто не забудьте добавить ссылки на System.ИО.Сжатие и система.ИО.Сжатие.Файловая система)

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

просто!

эти два шага помогут вам здесь:

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

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

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

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


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

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

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

есть еще OpenXML SDK, все еще в CTP, хотя и выпущенный Microsoft.


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

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