java - 使用 Apache-POI 获取 docx 的每个段落的行

标签 java android kotlin apache-poi docx

我正在为我的应用程序使用库 Apache-POI。具体来说,POIshadow-all (ver. 3.17) 用于读取 Word 文档。
我成功地提取了每个段落,如下所示:
enter image description here
我真正需要的是提取每一行,如下所示:
enter image description here
提取每个段落的代码是这样的:

 try {

            val fis = FileInputStream(path.path + "/" + document)
            val xdoc = XWPFDocument(OPCPackage.open(fis))

            val paragraphList: MutableList<XWPFParagraph> = xdoc.paragraphs

            private val newParagraph = paragraph.createRun()

                ...

            for (par in paragraphList) {

                    var currentParagraph = par.text
                    Log.i("TAG","current: $currentParagraph")

                        ...
正如预期的那样,变量 currentParagraph 返回一个完整的段落。但是,我需要一个名为 currentLine 的变量,它返回一行。
我在 stackoverflow 和其他网站上研究过这个问题。我找到了一些建议,但没有一个适合我。
我还尝试通过 ctr 获取日期并使用 XWPFRun,但没有任何成功。
对于如何进行的任何建议,我将不胜感激。
在此先感谢您的帮助。

最佳答案

document does not store how many lines are there in a given paragraph 的元数据因为这取决于您如何渲染或查看它。想想一个word文档,如果你有一个更大的字体大小,你会在一个给定的段落中有更多的行,或者,如果你有一个更小的字体大小,你会在一个段落中有更少的行。因此,每个段落中的行数是不一致的,即一个变量。
但是,如果您的应用程序中有一个硬性和快速的要求来进行估算,您可以编写一些逻辑,例如 “在 X(常数)个字符后开始新行(四舍五入到单词的末尾)” .这又可能会根据屏幕大小、字体大小、缩放级别等而改变。所以我的建议是在您的应用程序中制定一个场景,您不会明确测量给定段落中的行数,而是数字单词或字符,并在绝对必要时将其用作插入换行符的衡量标准。
您可以使用的另一种潜在方法是使用转义字符分隔句子,例如 “在段落中的每个‘?’、‘!’或‘。’字符之后开始一个新句子。” 这也可能变得相当棘手,具体取决于某些句子的结构。
因此,您的问题的答案是,没有“开箱即用”的方法来使用 Apache POI 检测给定段落中的行数,您必须在那里编写自己的逻辑(可能使用上面概述的方法) ,如果绝对必要的话。

关于java - 使用 Apache-POI 获取 docx 的每个段落的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63875832/

相关文章:

kotlin - 如何在 Kotlin 中创建可变的字母表?

java - JTextArea 自动换行调整大小

java - 为什么 ByteBuffer 不提供读写 boolean 数据类型的方法

java - JSP获取不到请求参数

java - 为什么我的 fragment 在我的 View 页面中重新初始化?

android - 将Android Numberpicker Maven项目转换为Android Studio的Gradle项目

Android Studio 无法在设备 : stuck on "Waiting for process: <project>" 上运行应用程序

Java:对字节子数组的引用

generics - 接口(interface)之间的 Kotlin 多重继承

intellij-idea - 如何将 Kotlin 模块导出到 .jar