C# を使用して、MS Word (.doc、.docx)、Excel、および Powerpoint からテキスト (文字列) を抽出しようとしていました。MS Office ドキュメントを読むための無料でシンプルな .Net ライブラリはどこにありますか? NPOI を使用しようとしましたが、NPOI の使用方法に関するサンプルがありませんでした。
10 に答える
Microsoft Word 2007 および Microsoft Word 2010 (.docx) ファイルの場合は、Open XML SDK を使用できます。このコード スニペットはドキュメントを開き、その内容をテキストとして返します。これは、正規表現を使用して Word 文書の内容を解析しようとしている人にとって特に便利です。このソリューションを使用するには、OpenXML SDK の一部である DocumentFormat.OpenXml.dll を参照する必要があります。
参照: 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();
}
KyleM の回答を少し訂正させてください。結果に影響を与える 2 つの追加ノードの処理を追加しました。コードは次のとおりです。
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.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つのステップでそこにたどり着きます。
1)Office相互運用ライブラリを使用してDOCをDOCXに変換します
2)DOCX2TXTを使用して新しいDOCXからテキストを抽出します
1)のリンクには、変換の方法とコードサンプルについての非常に優れた説明があります。
2)の代わりに、C#でDOCXファイルを解凍し、必要なファイルをスキャンすることもできます。ここでZIPファイルの構造について読むことができます。
編集:ああ、そうです、Skurmedelが以下で行ったように、変換を実行するシステムにOfficeをインストールする必要があることを指摘するのを忘れました。