Apache POI:从java

时间:2016-06-02 17:57:38

标签: java apache-poi docx

我有一堆word文档(docx),它将测试用例名称作为段落标题和后续表格中的测试步骤以及其他一些信息进行详细说明。

我需要使用Apache POI从表​​中提取测试用例名称(来自段落)和测试步骤(来自表格)。

示例单词内容为

Section 1: Index
Section 2: Some description
    A. Paragraph 1
    B. Table 1
    C. Paragraph 2
    D. Paragraph 3
    E. Table 2
Section 3: test cases ( The title "test cases" is constant, so I can look for it in the doc)
    A. Paragraph 4 (First test case)
    B. Table 3 (Test steps table immediately after the para 4)
    C. Paragraph 5 (Second test case)
    B. Table 4 (Test steps table immediately after the para 5)

Apache POI提供API以提供段落和表格列表,但我无法阅读段落(测试用例)并立即查找本段后面的表格。

我尝试使用XWPFWordExtractor(读取所有文本),bodyElementIterator(迭代所有body元素),但大多数都使用getParagraphText()方法提供段落[para1, para2, para3, para4, para5]和{{ 1}}方法,将文档中的所有表格作为列表getTables()

如何查看所有段落,停在标题'测试用例'之后的段落。 (第4段)然后寻找紧接第4段(表3)之后的表格。然后对第5段和第4段重复此步骤。

以下是我尝试的gist link(代码),它提供了一个段落和表列表的列表,但不是我可以跟踪的序列。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

POI中的Word API仍然处于不稳定状态,但您应该能够通过以下两种方式之一迭代这些段落:

XWPFDocument doc = new XWPFDocument(fis);
List<XWPFParagraph> paragraphs = doc.getParagraphs();
for (XWPFParagraph p : paragraphs) {
   ... do something here
}

XWPFDocument doc = new XWPFDocument(fis);
Iterator<XWPFParagraph> iter = doc.getParagraphsIterator();
while (iter.hasNext()) {
   XWPFParagraph p = iter.next();
   ... do something here
}

Javadocs说XWPFDocument.getParagraphs()检索在页眉或页脚中保留文本的段落,但我必须相信这是一个剪切和粘贴错误,因为XWPFHeaderFooter.getParagraphs()说同样的事情。查看源代码,XWPFDocument.getParagraphs()返回一个不可修改的列表,而使用迭代器时,段落可以修改。这可能会在未来发生变化,但现在它仍然有效。

要检索所有正文元素,段落和表格的列表,您需要使用:

XWPFDocument doc = new XWPFDocument(fis);
Iterator<IBodyElement> iter = doc.getBodyElementsIterator();
while (iter.hasNext()) {
   IBodyElement elem = iter.next();
   if (elem instanceof XWPFParagraph) {
      ... do something here
   } else if (elem instanceof XWPFTable) {
      ... do something here
   }
}

这应该允许你按顺序遍历所有的body元素。