我正在使用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;
}
答案 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/