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

Ser*_*o76 6 java android docx apache-poi kotlin

我正在为我的应用程序使用库 Apache-POI。具体来说,POIshadow-all (ver. 3.17) 用于阅读 Word 文档。我成功地提取了每个段落,如下所示:

在此处输入图片说明

我真正需要的是提取每一,如下所示:

在此处输入图片说明

提取每个段落的代码是这样的:

 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")

                        ...
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,变量 currentParagraph 返回整个段落。但是,我需要一个名为 currentLine 的变量,它返回一行。

我在 stackoverflow 和其他网站上研究过这个问题。我找到了一些建议,但没有一个适合我。我还尝试通过 ctr 和使用 XWPFRun 获取日期,但没有成功。

对于如何进行的任何建议,我将不胜感激。

在此先感谢您的帮助。

小智 3

文档的元数据不存储给定段落中有多少行 ,因为它取决于您呈现或查看它的方式。想象一下 Word 文档,如果字体大小较大,则给定段落中的行数会较多;反之,如果字体大小较小,则段落中的行数会较少。因此,每个段落的行数是不一致的,即一个变量。

\n

但是,如果您的应用程序中存在\xe2\x80\x99s硬性且快速的要求来进行估计,您可以编写一些逻辑,例如\xe2\x80\x9c在X(常量)个字符(四舍五入)之后开始一个新行到单词的末尾)\xe2\x80\x9d。这又可能会根据屏幕尺寸、字体大小、缩放级别等而改变。所以我的建议是在您的应用程序中制定一个场景,在该场景中您不明确测量给定段落中的行数,而是测量数字单词或字符,并在绝对必要时使用它作为插入换行符的衡量标准。

\n

您可以使用的另一种可能的方法是使用转义字符分隔句子,例如\xe2\x80\x9c 在每个 \xe2\x80\x98?\xe2\x80\x99, \xe2\x80\x98!\xe2\ 之后开始一个新句子x80\x99 或 \xe2\x80\x98。\xe2\x80\x99 段落中的字符。\xe2\x80\x9d这也可能变得相当棘手,具体取决于某些句子的结构。

\n

因此,你的问题的答案是,没有 \xe2\x80\x9cout of the box\xe2\x80\x9d 方法来使用 Apache POI 检测给定段落中的行数,你必须编写自己的逻辑如果绝对必要的话,可以在那里(也许使用上面概述的方法)。

\n