使用 Apache POI 从 Word 文档获取文本框段落

Ran*_*tne 5 java ms-word apache-poi xwpf

我们使用 Apache POI 来操作 Microsoft Word 文档。

到目前为止,我们可以使用以下 API 访问文档中所有必需的段落(包括页眉、页脚、表格)XWPFDocument

val allBodyElements = bodyElements
    .plus(headerList.flatMap { it.bodyElements })
    .plus(footerList.flatMap { it.bodyElements })

val allParagraphs = allBodyElements.flatMap {
    when (it) {
        is XWPFParagraph -> listOf(it)
        is XWPFTable -> it.rows
            .flatMap { row -> row.tableCells }
            .flatMap { cell -> cell.paragraphs }
        else -> emptyList()
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这遗漏了文本框中包含的段落。查看底层word/document.xml这些 TextBox 的嵌入方式如下:

<w:body>
  <w:p>
    <w:r>
      <mc:AlternateContent>
        <mc:Choice>
          <w:drawing>
            <wp:anchor>
              <a:graphic>
                <a:graphicData>
                  <wps:wsp>
                    <wps:txbx>
                      <w:txbxContent>
                        <!-- DESIRED PARAGRAPH -->
                      </w:txbxContent>
        ...
        </mc:Choice>
          <mc:Fallback>
            <w:pict>
              <v:shape>
                <v:textbox>
                  <w:txbxContent>
                    <!-- DESIRED PARAGRAPH -->
                  </w:txbxContent>
Run Code Online (Sandbox Code Playgroud)

有没有办法访问这些段落并XWPFParagraph使用 apache poi 将它们作为对象接收,这样我们就可以使用 Java 代码来操作它们?

我们目前使用的是 apache poi 版本4.1.2

编辑:感谢这里提供的解决方案: https: //stackoverflow.com/a/25877256/611032我能够提取段落并读取数据,但我不知道如何保存手动创建、操作的数据XWPFParagraph回到所附段落。