Apache POI:如何在Java中从Word文档(docx)中提取一个段落和随后的表格

8

我有一堆word文档(docx),其中包含测试用例名称作为段落标题,随后的表格中包含测试步骤和其他信息。

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

示例word内容如下:

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(迭代所有正文元素),但大多数都给出getParagraphText()方法,该方法以列表形式给出段落[para1,para2,para3,para4, para5]getTables()方法,该方法将文档中的所有表格作为列表[table1,table2,table3,table4]给出。

如何遍历所有段落,在标题“测试用例”(第4段)之后停止,然后查找紧随第4段之后的表格(第3个表格)。 然后对段落5和表格4重复此操作。

这里是我尝试的代码链接,它提供了段落和表格列表,但不是我可以跟踪的顺序。

非常感谢您的任何帮助。

2个回答

12
在POI中,Word API仍在变化中且存在漏洞,但您应该能够通过以下两种方式之一迭代段落:

在POI中,Word API仍在变动中,且有些bug,但您可以通过以下两种方式之一来迭代一个段落:

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元素。


1
感谢您的评论,我的主要关注点是,段落列表提供了段落列表,表格列表提供了表格列表,但是我如何跟踪它们出现的顺序?我的要求是提取紧随特定段落内容后的表格内容。不知何故,我必须继续阅读段落,并在找到所需段落后停止并从那一点开始阅读表格。 - Sauchin
@Sauchin,你解决了这个问题吗?我也遇到了同样的问题。如果你有解决方案,或许可以发布为自己的答案。 - Sebastian Zeki
我已经找到了解决方案。很抱歉没有早点发布。我会在几天内发布答案。我正在旅行,不幸的是无法访问源代码。 - Sauchin
@SebastianZeki - 答案在上面的编辑中,该编辑是在6月5日进行的。请注意,XWPFDocument中有一个bodyElements列表,其中按顺序包含所有段落和表格。 - jmarkmurphy
@Sauchin 我仍然想看看你的解决方案。 - akshay2000

0
我能想到的唯一解决方案是使用单词提取器,将来自该提取器的段落内容与 XWPFDocumentgetParagraphArray 进行比较,然后通过比较提取器和 getTables() 的内容来定位表格。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接