我试图提取使用C#从微软Word(.DOC,.DOCX),Excel和PowerPoint中的文本(字符串)。 我在哪里可以找到一个自由和简单的.NET库来读取MS Office文档? 我试图用NPOI,但我没有得到有关如何使用NPOI样品。
Answer 1:
使用PInvokes可以使用的IFilter接口(在Windows上)。 对于许多常见文件类型的IFilter安装与Windows(您可以通过浏览他们这个工具,你可以只问的IFilter从文件返回你的文字。有几套的示例代码( 在这里就是这样一个例子)。
Answer 2:
对于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();
}
Answer 3:
蒂卡是非常有益的,容易提取不同类型的文档,包括Microsoft Office文件中的文本。
你可以使用这个项目,这是这么好的一件艺术品由凯文·米勒http://kevm.github.io/tikaondotnet/
只需简单地添加这个NuGet包https://www.nuget.org/packages/TikaOnDotNet/
然后,这个代码一行会做的魔力:
var text = new TikaOnDotNet.TextExtractor().Extract("fileName.docx / pdf / .... ").Text;
Answer 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();
}
Answer 5:
使用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();
然后做你想做的话什么的。
Answer 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();
}
}
}
Answer 7:
简单!
这两个步骤将让你有:
1)使用办公室的Interop库为DOC转换为DOCX
2)使用DOCX2TXT来提取新DOCX文本
链接1)具有怎样做转换,甚至一个代码示例一个很好的解释。
2替代)是刚刚解压在C#中DOCX文件和扫描您需要的文件。 你可以阅读的ZIP文件的结构在这里 。
编辑:是啊,我忘了指出作为Skurmedel做了如下,你必须要在其上进行转换的系统上安装的Office。
Answer 8:
我做了一个DOCX文本提取一次,这是非常简单的。 基本上DOCX,和其他(新)格式我想,是一个zip文件和一帮XML的文件来代替。 文本可以使用的XmlReader,并且仅使用.NET类中提取。
我没有代码了,它似乎:(,但我发现一个人谁也有类似的解决方案 。
也许你需要阅读,虽然.doc和.xls文件,因为它们是二进制格式,可能更难分析,这是不可行的你。
还有的OpenXML的SDK ,仍处于CTP虽然,由微软发布。
Answer 9:
如果您正在寻找asp.net选项,除非你在服务器上安装Office的互操作将无法正常工作。 即使这样,微软表示,不这样做。
我用Spire.Doc,漂亮的工作。 Spire.Doc下载它甚至读了真的.txt文件,但被保存.DOC文件。 他们有免费和付费版本。 您还可以得到一个试用许可证,可以消除您创建的文档一定的警示作用,但我没有创建任何,只是搜查他们这样免费版本工作就像一个魅力。