表格内容提取部分在.docx文件中明智

时间:2017-10-06 04:06:53

标签: java ms-word apache-poi

我正在使用Apache POI 3.9从.docx文件中提取表内容。这个doc包含不同部分下的多个表。我可以提取所有表内容而不管各个部分,但我想在特定部分下提取表内容只有。有人可以帮忙吗?

.docx outline:

第1节:ABC           表格1:           表2: 第2节:CDE           表3:           表4:

表格提取代码:

XWPFDocument documentContent = new XWPFDocument(inputStream); 
                                    Iterator<IBodyElement> bodyElementIterator = documentContent.getBodyElementsIterator(); 
                                    while(bodyElementIterator.hasNext()) 
                                    { 
                                             IBodyElement element = bodyElementIterator.next(); 
                                             if("TABLE".equalsIgnoreCase(element.getElementType().name())) 
                        {   
                                                     List<XWPFTable> tableList =  element.getBody().getTables(); 

                             //Extract the table row name and their corresponding values from the word stream content 
                                                     tableRowValues = getTableRowValues(tableList); 

                        } 
                                    } 

方法: private static ArrayList getTableRowValues(List tableList){

            ArrayList<String> tableValues = new ArrayList<String>(); 

          for (XWPFTable xwpfTable : tableList) 
        { 
            List<XWPFTableRow> row = xwpfTable.getRows(); 

            for (XWPFTableRow xwpfTableRow : row) 
            { 

                List<XWPFTableCell> cell = xwpfTableRow.getTableCells(); 

                for (XWPFTableCell xwpfTableCell : cell) 
                { 

                 List<XWPFParagraph> para = xwpfTableCell.getParagraphs(); 
                for (XWPFParagraph xwpfTablePara : para) 
                { 
                if(xwpfTablePara!=null) 
                           { 
                     tableValues.add( xwpfTablePara.getText()); 

                           } 
                } 


                } 
            } 
        } 
          return tableValues; 
    }

1 个答案:

答案 0 :(得分:0)

我做了同样的事情。 使用此代码,我将使用下面的表格提取所有部分:

 Iterator<IBodyElement> iter = xdoc.getBodyElementsIterator();

               while (iter.hasNext())
               {    

                  IBodyElement elem = iter.next();

                  if (elem instanceof XWPFParagraph)
                  { 
                      relevantText.setText(((XWPFParagraph) elem).getText());
                      relevantText.addBreak();
                      relevantText.addCarriageReturn();
                  }

                  else if (elem instanceof XWPFTable)
                  {     
                      relevantText.addBreak();
                      relevantText.setText(((XWPFTable) elem).getText());
                      relevantText.addCarriageReturn();
                  }

               }

您可以在if-statement之前创建getText(),以便在正确条件为真时仅提取文本。 在示例中,您可以检查;风格,文字等。

paragraph.getStyle() //filters on word styles, eg ""header1"
paragraph.getNumFmt() //filters on bullet text

有关详情,请参阅Apache中的文档 https://poi.apache.org/