.docx 的 Apache POI 字符 运行

Apache POI characters run for .docx

在.doc文件中,有一个函数可以使用

获取段落中的每个字符
 CharacterRun charrun = paragraph.getCharacterRun(k++);

然后我可以使用这些字符 运行 来检查它们的属性,例如

if ( charrun.isBold() == true) System.out.print(charrun.text());

或类似的东西。但是 .docx 文件似乎没有字符 运行 方法可以读取每个单词,我尝试使用

XWPFParagraph item = paragraph.get(i);
List<XWPFRun> charrun = item.getRuns();

我发现当你在 XWPF 中调用字符 运行 时,它不会 return 一个字符给你,但它会 return 一些随机长度的字符串文档

XWPFRun temp = charrun.get(0);
System.out.println(temp.gettext(0));

此代码不会 return 段落中的第一个字符。

那么我该如何解决这个问题?

假设你想遍历word文档中的所有(主要)段落(不包括表格,headers等),然后遍历该段落中的字符运行,然后一次遍历 运行 一个字符的文本,你会想要做这样的事情:

XWPFDocument doc = new XWPFDocument(OPCPackage.open("myfile.docx"));
for (XWPFParagraph paragraph : doc.getParagraphs()) {
    int pos = 0;
    for (XWPFRun run : paragraph.getRuns()) {
        for (character c : run.text().toCharArray()) {
            System.out.println("The character at " + pos + " is " + c);
            pos++;
        }
    }
}

这将遍历每个字符,并将制表符和换行符等表示为它们的等效字符(如 w:tab 将被转换)。

对于 HWPF,获取段落的方式与从段落中获取 运行s 的方式相似但不完全相同,因此没有通用接口。 XWPFRun 和 HWPF 的 CharacterRun 共享一个公共接口,所以这部分代码可以是 re-used

请注意,给定 character run 中的所有文本都将共享相同的样式/格式信息。由于 Word 的工作方式很奇怪,两个相邻的 运行 也可能共享相同的样式,而 Word 尚未合并它们...