java - Apache POI 字符运行为 .docx

标签 java api apache-poi document 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中调用character run时,它不会返回一个字符给你,而是会返回文档中一些长度随机的字符串

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

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

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

最佳答案

假设您要迭代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,获取段落的方式和从段落中获取运行的方式类似但不完全相同,因此没有通用的接口(interface)。 XWPFRun 和 HWPF 的 CharacterRun 共享一个公共(public)接口(interface),因此可以重用该部分代码

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

关于java - Apache POI 字符运行为 .docx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30078283/

相关文章:

laravel - Flutter 中出现 401 未经授权的错误,但在 Postman 中工作正常

java - poi HSSFCell setCellFormula 中的公式有什么问题?

java - 如何在 HSSF apache poi (JAVA) 上克隆具有相关引用的函数

java - 为什么我们不能在 Map Reduce 中使用 Java 原始数据类型?

java - JTextField 的固定高度和宽度

api - REST API 错误代码 500 处理

c# - 每个派生类的 Web API 方法还是只有一种方法可以服务于所有类?

java - 如何将条形图放置在刻度线之间?

java - BouncyCaSTLe,桌面/安卓签名的不同行为

gwt - 带有 GWT 的 jre 1.6