2017-09-05 16 views
0

私はdocxファイルの反復テーブルにApache poiを使用しています。すべてが正常に動作しますが、テキストボックス内のテーブルには、私のコードは、テーブルが表示されない場合 - 低レベルは*.docx文書を解析しているコードに続いてtable.size()= 0Apache poi get table from text box

enter image description here

XWPFDocument doc = new XWPFDocument(new FileInputStream(fileName)); 

    List<XWPFTable> table = doc.getTables(); 

    for (XWPFTable xwpfTable : table) { 
     List<XWPFTableRow> row = xwpfTable.getRows(); 
     for (XWPFTableRow xwpfTableRow : row) { 
      List<XWPFTableCell> cell = xwpfTableRow.getTableCells(); 
      for (XWPFTableCell xwpfTableCell : cell) { 
       if(xwpfTableCell != null){ 
       List<XWPFTable> itable = xwpfTableCell.getTables(); 
        if(itable.size()!=0){ 
         for (XWPFTable xwpfiTable : itable) { 
          List<XWPFTableRow> irow = xwpfiTable.getRows(); 
          for (XWPFTableRow xwpfiTableRow : irow) { 
           List<XWPFTableCell> icell = xwpfiTableRow.getTableCells(); 
           for (XWPFTableCell xwpfiTableCell : icell) { 
            if(xwpfiTableCell!=null){ 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
+0

うわー。誰がその方法でワードプロセッシングを悪用しているのですか?表のセルに含まれる表は十分に奇妙です。しかし、形に入ったテーブル?私は '* .docx/word/document.xml'を特別な構文解析なしにこのテーブルを得ることはできません。 –

+0

はい、このケースは非常に奇妙ですが、このテーブルを解析する必要があります。 docx https://ufile.io/6xmqd – nickolson

+0

をダウンロードできます。正確には何が必要ですか?テーブルの内容を読むだけですか?これは比較的簡単に可能です。または、四角形の中でテーブルを操作しますか?これも可能ですが、はるかに複雑です。 –

答えて

1

をすべてのテーブルをそのドキュメント本体に取り込みます。

このアプローチでは、 org.apache.xmlbeans.XmlCursorを使用し、w:tblのすべての要素をdocument.xmlに検索しています。見つかった場合はList<CTTbl>に追加してください。

テキストボックスの長方形の形状は、document.xmlにフォールバックコンテンツを提供するため、mc:Fallback要素をスキップする必要があります。それ以外の場合は、テキストボックス内のテーブルを2回使用します。

最後にList<CTTbl>にアクセスして、すべてのテーブルの内容を取得します。

import java.io.*; 
import org.apache.poi.xwpf.usermodel.*; 

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBody; 
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl; 
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRow; 
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc; 
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP; 
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR; 
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTText; 

import org.apache.xmlbeans.impl.values.XmlAnyTypeImpl; 
import org.apache.xmlbeans.XmlCursor; 

import javax.xml.namespace.QName; 

import java.util.List; 
import java.util.ArrayList; 

public class WordReadAllTables { 

public static void main(String[] args) throws Exception { 

    XWPFDocument document = new XWPFDocument(new FileInputStream("22.docx")); 

    CTBody ctbody = document.getDocument().getBody(); 

    XmlCursor xmlcursor = ctbody.newCursor(); 

    QName qnameTbl = new QName("http://schemas.openxmlformats.org/wordprocessingml/2006/main", "tbl", "w"); 
    QName qnameFallback = new QName("http://schemas.openxmlformats.org/markup-compatibility/2006", "Fallback", "mc"); 

    List<CTTbl> allCTTbls = new ArrayList<CTTbl>(); 

    while (xmlcursor.hasNextToken()) { 
    XmlCursor.TokenType tokentype = xmlcursor.toNextToken(); 
    if (tokentype.isStart()) { 
    if (qnameTbl.equals(xmlcursor.getName())) { 
    if (xmlcursor.getObject() instanceof CTTbl) { 
     allCTTbls.add((CTTbl)xmlcursor.getObject()); 
    } else if (xmlcursor.getObject() instanceof XmlAnyTypeImpl) { 
     allCTTbls.add(CTTbl.Factory.parse(xmlcursor.getObject().toString())); 
    } 
    } else if (qnameFallback.equals(xmlcursor.getName())) { 
    xmlcursor.toEndToken(); 
    } 
    } 
    } 

    for (CTTbl cTTbl : allCTTbls) { 
    StringBuffer tableHTML = new StringBuffer(); 
    tableHTML.append("<table>\n"); 
    for (CTRow cTRow : cTTbl.getTrList()) { 
    tableHTML.append(" <tr>\n"); 
    for (CTTc cTTc : cTRow.getTcList()) { 
    tableHTML.append(" <td>"); 
    for (CTP cTP : cTTc.getPList()) { 
     for (CTR cTR : cTP.getRList()) { 
     for (CTText cTText : cTR.getTList()) { 
     tableHTML.append(cTText.getStringValue()); 
     } 
     } 
    } 
    tableHTML.append("</td>"); 
    } 
    tableHTML.append("\n </tr>\n"); 
    } 
    tableHTML.append("</table>"); 

    System.out.println(tableHTML); 

    } 

    document.close(); 

} 
} 

このコードはfaq-N10025で述べたように、スキーマooxml-schemas-1.3.jarのすべての完全なjarファイルを必要とします。

+0

ありがとうございましたAxel、あなたは私の日です=)このリンクはjava.lang.NoClassDefFoundErrorの解決に役立ちます:org/openxmlformats/schemas/wordprocessingml http://poi.apache.org /faq.html#faq-N10025 – nickolson

+0

@nickolson:どうぞよろしくお願いいたします。そして、すべてのスキーマ 'ooxml-schemas-1.3.jar'の完全な瓶が必要であるというヒントについてありがとうございます。 –

+0

私は上記のコードはいつも* .docxからテーブルを取得するのに適しているとドキュメントの "隠された"テーブルに依存しないと考えています。本当ですか? – nickolson