簡體   English   中英

如何從C#中的MS office文檔中提取文本

[英]How to extract text from MS office documents in C#

我試圖使用C#從MS Word(.doc,.docx),Excel和Powerpoint中提取文本(字符串)。 我在哪里可以找到一個免費且簡單的.Net庫來閱讀MS Office文檔? 我嘗試使用NPOI,但我沒有得到關於如何使用NPOI的樣本。

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

使用PInvokes可以使用IFilter接口(在Windows上)。 許多常見文件類型的IFilter都隨Windows一起安裝(您可以使用工具瀏覽它們。您可以要求IFilter從文件中返回文本。有幾組示例代碼( 是一個這樣的示例)。

Tika非常有用且易於從不同類型的文檔中提取文本,包括Microsoft Office文件。

你可以使用這個項目,這是Kevin Miller制作的一件很好的藝術品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();
        }
    }
}

簡單!

這兩個步驟將幫助您:

1)使用Office Interop庫將DOC轉換為DOCX
2)使用DOCX2TXT從新DOCX中提取文本

1)的鏈接非常好地解釋了如何進行轉換甚至是代碼示例。

2)的替代方法是在C#中解壓縮DOCX文件並掃描您需要的文件。 您可以在此處閱讀ZIP文件的結構。

編輯:啊,是的,我忘了指出Skurmedel在下面指出你必須在要進行轉換的系統上安裝Office。

我做了一次docx文本提取器,它非常簡單。 基本上docx和我認為的其他(新)格式是帶有一堆XML文件的zip文件。 可以使用XmlReader並僅使用.NET類來提取文本。

我似乎沒有代碼了,似乎:(但我找到了一個有類似解決方案的人

如果您需要讀取.doc和.xls文件,這可能不適合您,因為它們是二進制格式,可能更難解析。

微軟還發布了仍在CTP中的OpenXML SDK

如果您正在尋找asp.net選項,除非您在服務器上安裝office,否則互操作將無法工作。 即使這樣,微軟也表示不這樣做。

我使用Spire.Doc,工作得很漂亮。 Spire.Doc下載它甚至可以讀取真正的.txt文件,但保存了.doc。 他們有免費和付費版本。 您還可以獲得試用許可證,從您創建的文檔中刪除一些警告,但我沒有創建任何,只是搜索它們,所以免費版本就像一個魅力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM