2017-08-02 3 views
1

Microsoft Word文書(.docx)に接続して、.docxにあるテーブルの値を読み取ろうとしています。私はOpen-XML SDK 2.0を使って.docxファイルに接続しています。これまでの例とアイデアを探していた後、私はこれを持って、C#を使用してword docのテーブルから値を読み取る方法

public static string TextFromWord(string file) 
{ 
    const string wordmlNamespace = "http://schemas.openxmlformats.org/wordprocessingml/2006/main"; 

    StringBuilder textBuilder = new StringBuilder(); 
    using (WordprocessingDocument wDoc = WordprocessingDocument.Open(filename,false)) 
     { 
      //Manage namespaces to perform Xpath queries 
      NameTable nt = new NameTable(); 
      XmlNamespaceManager nsManger = new XmlNamespaceManger(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(); 
} 

コードは、.docxの中だけのテキストがある場合に動作しますが、テキストがテーブルにあるときに失敗しました。これを修正して.docxのテーブルで動作する方法はありますか?

答えて

0

次の簡単なメソッドの書き直しをお試しください。これは、System.XML呼び出しと名前空間項目をOpenXML elements (Document, Body, Paragraph, Table, Row, Cell, Descendants, etc)に置き換えます。 install and use the OpenXML 2.5 SDKをお願いします。

public static string TextFromWord(string filename) 
    { 
     StringBuilder textBuilder = new StringBuilder(); 
     using (WordprocessingDocument wDoc = WordprocessingDocument.Open(filename, false)) 
     { 
      var parts = wDoc.MainDocumentPart.Document.Descendants().FirstOrDefault(); 
      if (parts != null) 
      { 
       foreach (var node in parts.ChildElements) 
       { 
        if(node is Paragraph) 
        { 
         ProcessParagraph((Paragraph)node, textBuilder); 
         textBuilder.AppendLine(""); 
        } 

        if (node is Table) 
        { 
         ProcessTable((Table)node, textBuilder); 
        } 
       } 
      } 
     } 
     return textBuilder.ToString(); 
    } 

    private static void ProcessTable(Table node, StringBuilder textBuilder) 
    { 
     foreach (var row in node.Descendants<TableRow>()) 
     { 
      textBuilder.Append("| "); 
      foreach (var cell in row.Descendants<TableCell>()) 
      { 
       foreach (var para in cell.Descendants<Paragraph>()) 
       { 
        ProcessParagraph(para, textBuilder); 
       } 
       textBuilder.Append(" | "); 
      } 
      textBuilder.AppendLine(""); 
     } 
    } 

    private static void ProcessParagraph(Paragraph node, StringBuilder textBuilder) 
    { 
     foreach(var text in node.Descendants<Text>()) 
     { 
      textBuilder.Append(text.InnerText); 
     } 
    } 

注 - このコードは、段落と表で構成される単純なWord文書でのみ機能します。このコードは、複合語文書ではテストされていません。

ここenter image description here

はテキスト出力です:

次のドキュメントには、コンソールアプリで上記のコードで処理された

enter image description here

+0

はどのようにして数字を読むことができるか、アン順序あなたがリストの種類と番号を取得するMS Wordのリスト? – Shuaib

関連する問題