2017-09-05 85 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

相关问题