Я пытался извлечь текст (строку) из MS Word (.doc, .docx), Excel и Powerpoint с помощью C #. Где я могу найти бесплатную и простую библиотеку .Net для чтения документов MS Office? Я пытался использовать NPOI, но у меня не было образца о том, как использовать NPOI.
Как извлечь текст из офисных документов MS на C #
Ответы (10)
Используя PInvokes, вы можете использовать интерфейс IFilter (на Windows). Фильтры IFilters для многих распространенных типов файлов устанавливаются вместе с Windows (их можно просматривать с помощью этот инструмент. Вы можете просто попросить IFilter вернуть вам текст из файла. Существует несколько наборов примеров кода (вот один из таких примеров).
Для файлов 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();
}
DocumentFormat.OpenXml.Packaging
DocumentFormat.OpenXml.Wordprocessing
И вам нужно указать WindowsBase.dll
, чтобы он работал. Помимо этого; хорошее решение.
- person Kristian Barrett; 09.12.2014
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 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();
Затем делайте со словами все, что хотите.
Немного поздно для вечеринки, но тем не менее - в настоящее время вам не нужно ничего загружать - все уже установлено с .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();
}
}
}
Number of entries expected in End Of Central Directory does not correspond to number of entries in Central Directory.
- person Hugo Nava Kopp; 24.03.2017
ZipFile
представление о том, что zip-файл (то есть файл docx в данном случае) поврежден ...
- person lxa; 26.03.2017
Простой!
Эти два шага приведут вас к этому:
1) Используйте библиотеку взаимодействия Office для преобразования DOC в DOCX
2) Используйте DOCX2TXT для извлечения текста из нового DOCX
Ссылка для 1) содержит очень хорошее объяснение того, как выполнить преобразование, и даже образец кода.
Альтернатива 2) - просто распаковать файл DOCX на C # и просканировать файлы, которые вам нужны. Вы можете прочитать о структуре ZIP-файла здесь.
Изменить: Ах, да, я забыл указать, как это сделал Скурмедель ниже, что у вас должен быть установлен Office в системе, в которой вы хотите выполнить преобразование.
Interop
можно использовать, но по возможности его следует избегать.
- person Tun; 21.10.2011
Однажды я сделал экстрактор текста docx, и это было очень просто. В основном docx и другие (новые) форматы, которые я предполагаю, представляют собой zip-файл с кучей XML-файлов. Текст можно извлечь с помощью XmlReader и только .NET-классов.
Кажется, у меня больше нет кода :(, но я нашел парня, у которого есть похожий решение.
Возможно, это невыгодно для вас, если вам нужно читать файлы .doc и .xls, поскольку они являются двоичными форматами и, вероятно, их намного сложнее анализировать.
Существует также OpenXML SDK, все еще в CTP, выпущенный Microsoft.
Если вы ищете варианты asp.net, взаимодействие не будет работать, если вы не установите офис на сервере. Даже тогда Microsoft говорит не делать этого.
Я пользовался Spire.Doc, прекрасно работало. Spire.Doc загрузить It даже читал документы, которые на самом деле были .txt, но были сохранены .doc. У них есть бесплатная и платная версии. Вы также можете получить пробную лицензию, которая удаляет некоторые предупреждения из документов, которые вы создаете, но я их не создавал, а просто искал их, поэтому бесплатная версия работала как шарм.
Одним из подходящих вариантов извлечения текста из документов Office на C # является GroupDocs.Parser для .NET API. Ниже приведены примеры кода для извлечения как простого, так и форматированного текста.
Извлечение текста
// 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.