使用 Apache-POI 获取 docx 的每个段落的行
Getting the lines of each paragraphs of a docx with Apache-POI
我正在为我的应用程序使用 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")
...
变量 currentParagraph returns 一整段,符合预期。但是,我需要一个名为 currentLine 的变量,其中 returns 一行。
我在 Whosebug 和其他网站上研究过这个问题。我找到了一些建议,但其中 none 对我有用。
我也尝试通过 ctr 和使用 XWPFRun 获取日期,但没有成功。
如有任何关于如何进行的建议,我将不胜感激。
在此先感谢您的帮助。
document does not store how many lines are there in a given paragraph 的元数据,因为它取决于您如何呈现或查看它。想想一个 word 文档,如果你有一个更大的 font-size,你将在给定的段落中有更多的行,或者,如果你有一个较小的 font-size,你将在一个段落中有更少的行。因此,每段行数不一致即变量。
但是,如果您的应用程序中有一个硬性要求来进行估算,您可以编写一些逻辑,例如 “在 X(常量)数字之后开始一个新行字符数(四舍五入到词尾)”。这也可能会根据屏幕大小、font-size、zoom-level 等而改变。所以我的建议是在您的应用程序中制定一个场景,在该场景中您没有明确测量给定段落中的行数, 而不是单词或字符的数量,并将其用作衡量标准,以在绝对必要时插入 line-break。
您可以使用的另一种可能方法是使用转义字符分隔句子,例如“在段落中的每个 '?'、'!' 或 '.' 字符后开始一个新句子。” 这也可能变得相当棘手, 取决于某些句子的结构。
因此,您的问题的答案是没有“开箱即用”的方法来使用 Apache POI 检测给定段落中的行数,您必须在那里编写自己的逻辑(可能使用上面概述的方法),如果绝对必要的话。
我正在为我的应用程序使用 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")
...
变量 currentParagraph returns 一整段,符合预期。但是,我需要一个名为 currentLine 的变量,其中 returns 一行。
我在 Whosebug 和其他网站上研究过这个问题。我找到了一些建议,但其中 none 对我有用。 我也尝试通过 ctr 和使用 XWPFRun 获取日期,但没有成功。
如有任何关于如何进行的建议,我将不胜感激。
在此先感谢您的帮助。
document does not store how many lines are there in a given paragraph 的元数据,因为它取决于您如何呈现或查看它。想想一个 word 文档,如果你有一个更大的 font-size,你将在给定的段落中有更多的行,或者,如果你有一个较小的 font-size,你将在一个段落中有更少的行。因此,每段行数不一致即变量。
但是,如果您的应用程序中有一个硬性要求来进行估算,您可以编写一些逻辑,例如 “在 X(常量)数字之后开始一个新行字符数(四舍五入到词尾)”。这也可能会根据屏幕大小、font-size、zoom-level 等而改变。所以我的建议是在您的应用程序中制定一个场景,在该场景中您没有明确测量给定段落中的行数, 而不是单词或字符的数量,并将其用作衡量标准,以在绝对必要时插入 line-break。
您可以使用的另一种可能方法是使用转义字符分隔句子,例如“在段落中的每个 '?'、'!' 或 '.' 字符后开始一个新句子。” 这也可能变得相当棘手, 取决于某些句子的结构。
因此,您的问题的答案是没有“开箱即用”的方法来使用 Apache POI 检测给定段落中的行数,您必须在那里编写自己的逻辑(可能使用上面概述的方法),如果绝对必要的话。