2017-09-05 223 views
0

我在docx文件中使用apache poi作爲迭代表。所有工作正常,但如果表中文本框中,我的代碼不看錶 - table.size()= 0Apache poi從文本框中獲取表格

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

下面的代碼是低層次解析*.docx文件並在它的文檔體中獲取所有表格。

該方法使用 org.apache.xmlbeans.XmlCursor並搜索document.xml中的所有w:tbl元素。如果發現將它們添加到List<CTTbl>

由於文本框矩形形狀在document.xml中提供了回退內容,因此我們需要跳過mc:Fallback元素。否則,我們會在文本框內顯示兩次表格。

最後我們通過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的全部罐子。

+0

謝謝Axel,你會爲我的日子=)這個鏈接對解決java.lang.NoClassDefFoundError有用:org/openxmlformats/schemas/wordprocessingml http://poi.apache.org /faq.html#faq-N10025 – nickolson

+0

@nickolson:不客氣。並感謝您提示需要完整的jar包含所有模式'ooxml-schemas-1.3.jar'。 –

+0

我相信上面的代碼總是適合從* .docx獲取表格,而不取決於表格如何「隱藏」在文檔中。我真的嗎? – nickolson

相關問題