【问题标题】:Apache POI characters run for .docxApache POI 字符为 .docx 运行
【发布时间】:2015-07-16 16:20:51
【问题描述】:

在.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 中调用字符 run 时,它不会返回一个字符给你,但它会在文档中返回一些随机长度的字符串

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

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

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

【问题讨论】:

  • .doc.docx 的工作方式相同 - CharacterRun 是应用相同格式的字符序列。它可能是 1 个或多个字符长,这取决于 Word 想做什么。所以,你需要在一个段落中一点一点地啃,而不是一次一个字符
  • 有没有办法一次读取一个字符?我不知道如何让它在整个段落中阅读并在段落结尾时停止。
  • 感谢您的回答,我如何获取段落中的所有运行,您能告诉我示例代码吗?附言。我还使用了 XWPFRun.getFontFamily() 方法,它返回 null 给我这是什么意思? PS2。 getFontSize 也返回 0 给我
  • 只是表示默认应用。稍后将发布代码

标签: java api apache-poi document docx


【解决方案1】:

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

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来说,获取段落的方式和从段落中获取runs的方式类似但不完全相同,所以没有通用的接口。 XWPFRun 和 HWPF 的 CharacterRun 共享一个通用接口,所以部分代码可以重用

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

【讨论】:

    猜你喜欢
    • 2020-12-13
    • 2012-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2016-10-29
    • 1970-01-01
    • 2017-08-09
    • 2020-02-27
    相关资源
    最近更新 更多