当前位置: 首页 > 知识库问答 >
问题:

Apache POI:在java中从word文档(docx)中提取一个段落和随后的表

冷俊健
2023-03-14

示例单词内容为

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(遍历所有主体元素),但大多数都给出了getPartishText()方法,该方法给出了段落列表[para1,para2,para3,para4,para5]getTable()方法,该方法给出了文档中的所有表的列表[table1,table2,table3,table4]

我如何浏览所有段落,停在标题‘测试用例’之后的段落(第4段),然后寻找紧接第4段之后的表格(表3)。然后对第5段和表4重复这一点。

下面是我尝试的gist链接(代码),它给出了段落列表和表列表,但不是以我可以跟踪的顺序。

任何帮助都是非常感谢的。

共有1个答案

郭易安
2023-03-14

POI中的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.getgarages()检索将文本保存在页眉或页脚中的段落,但我必须相信这是一个剪切和粘贴错误,因为xwpfheaderfooter.getgarages()也说了同样的话。查看源代码,xwpfdocument.getgarages()返回一个不可修改的列表,而使用迭代器保留可修改的段落。这在未来很可能会改变,但这是目前的工作方式。

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
   }
}
 类似资料:
  • 我正在尝试创建一个包含多列的word文档。这样做(而不是使用表)的原因是,数据将跨越多个页面,在添加到新页面之前,我只能用列填充整个页面。 可以用ApachePOI实现吗?谢谢

  • 正如您在word文档中看到的,有许多带有要点的问题。现在,我正在尝试使用apache POI从文件中提取每个段落。这是我当前的代码 上述方法的问题在于它打印的是每一行而不是段落。此外,项目符号也从提取的字符串中删除。返回一个纯字符串。 谁能解释一下我做错了什么。也请建议如果你有一个更好的想法来解决它。

  • 在使用ApachePOI写入word文档时,对于必须根据某个“计数”动态复制段落的位置,这些段落的标题必须按照章节顺序编号。假设它是word文档中的第7节,那么其中每个段落的标题应按顺序编号为7.1、7.2等。 尽管我看到了一些解决方案,其中考虑了word文档的xml,并使用了XWPFN编号。 还有其他更简单的方法吗? 或 如果我的word模板已经有了一个带有编号标题的段落,并且我必须多次复制相同

  • 我正在开发一个程序,需要从MS Word文档中提取两个图像,以便在另一个文档中使用它们。我知道图像的位置(文档中的第一个表),但当我试图从表中提取任何信息(即使只是纯文本)时,我会得到空单元格。 这是我想从中提取图像的Word文档。我想从第一页(第一个表,第0行和第1行,第2列)中提取“Rentel”图像。 我尝试了以下代码: 这只会给我空话。。。 我已经读过这篇讨论和这篇文章,问题可能是“包含在

  • 我试图通过ApachePOI阅读Microsoft word文档,发现提供了两种方便的方法来扫描文档,如getText()、getParagraphList()等。。但我的用例略有不同,我们希望扫描任何文档的方式是,它应该按照文档中出现的相同顺序为我们提供事件/信息,如标题、段落、表格。它将帮助我准备一个文档结构,比如, 其主要目的是保持标题和段落之间的关系,如原始文件所示。不确定,但像这样的东西

  • 我正在使用库python-docx解析docx文件。我需要阅读文档和段落的标题,但是我在文档中找不到任何关于文档标题的东西。有关于将标头写入新文件的文档,但没有关于读取标头的文档。有办法做到这一点吗?