web-dev-qa-db-ja.com

C#でMS Officeドキュメントからテキストを抽出する方法

C#を使用して、MS Word(.doc、.docx)、Excel、およびPowerPointからテキスト(文字列)を抽出しようとしていました。 MS Officeドキュメントを読むための無料のシンプルな.Netライブラリはどこで入手できますか? NPOIを使用しようとしましたが、NPOIの使用方法に関するサンプルを取得できませんでした。

35

PInvokesを使用すると、 IFilter インターフェイスを使用できます(Windowsの場合)。多くの一般的なファイルタイプのIFilterは、Windowsと共にインストールされます( this ツールを使用して参照できます。ファイルからテキストを返すようにIFilterに依頼するだけです。サンプルコードのセットがいくつかあります( ここ はそのような例の1つです)。

26
adrianbanks

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

Tikaは非常に便利で、Microsoft Officeファイルを含むさまざまな種類のドキュメントからテキストを簡単に抽出できます。

このプロジェクトは、Kevin Millerが作成したこのような素晴らしい作品です。 http://kevm.github.io/tikaondotnet/

このNuGetパッケージを追加するだけです https://www.nuget.org/packages/TikaOnDotNet/

そして、次の1行のコードで魔法をかけます。

var text = new TikaOnDotNet.TextExtractor().Extract("fileName.docx  / pdf  / .... ").Text;
15
Sep

KyleMの答えを少し修正してみましょう。結果に影響を与える2つの余分なノードの処理を追加しました。1つは「\ t」での水平集計を担当し、もう1つは「\ 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();
    }
8
Jordan

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

その後、あなたは言葉で何でもしたいです。

5
Chris

パーティーには少し遅れましたが、それでも-現在は何もダウンロードする必要はありません-すべては.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();
        }
    }
}
3
lxa

シンプル!

次の2つの手順で目的を達成できます。

1) Office Interopライブラリ を使用してDOCからDOCXに変換します
2) DOCX2TXT を使用して、新しいDOCXからテキストを抽出します

1)のリンクには、変換の実行方法の非常に優れた説明があり、コードサンプルもあります。

2)の代わりに、C#でDOCXファイルを解凍し、必要なファイルをスキャンするだけです。 Zipファイルの構造について読むことができます こちら

編集: ああ、私は、Skurmedelが以下で行ったように、変換を行うシステムにOfficeをインストールする必要があることを指摘するのを忘れました。

2
joshcomley

Docxテキスト抽出プログラムを1回実行しましたが、非常に簡単でした。基本的に、docx、および私が推測する他の(新しい)フォーマットは、代わりに多数のXMLファイルを含むZipファイルです。テキストは、XmlReaderおよび.NETクラスのみを使用して抽出できます。

私はもうコードを持っていません、それは思われます:(しかし、私は同様の ソリューション を持っている人を見つけました。

.docファイルと.xlsファイルを読み取る必要がある場合は、バイナリ形式であり、おそらく解析がはるかに難しいため、これは実行できない可能性があります。

OpenXML SDK もありますが、まだCTPにあり、Microsoftによってリリースされています。

1
Skurmedel

Asp.netオプションを探している場合、サーバーにofficeをインストールしない限り、相互運用は機能しません。それでも、Microsoftはそうしないと言っています。

Spire.Docを使用しましたが、きれいに機能しました。 Spire.Doc download 実際には.txtであるが、.docとして保存されたドキュメントも読み取ります。無料版と有料版があります。また、作成したドキュメントから警告を削除する試用版ライセンスを取得することもできますが、私は作成しませんでした。検索しただけで、無料版が魅力的に機能しました。

0
Erik Felde