Apache POI replaceText() 副作用,更改行 space

Apache POI replaceText() side effect, changes line space

我在 Java 中使用 POI 3.15 来替换我的 .doc 模板中的一些文本。

private HWPFDocument replaceText(HWPFDocument doc, String findText, String replaceText) {
    Range r = doc.getRange();
    for (int i = 0; i < r.numSections(); ++i) {
        Section s = r.getSection(i);
        for (int j = 0; j < s.numParagraphs(); j++) {
            Paragraph p = s.getParagraph(j);
            for (int k = 0; k < p.numCharacterRuns(); k++) {
                CharacterRun run = p.getCharacterRun(k);
                String text = run.text();
                if (text.contains(findText)) {
                    run.replaceText(findText, replaceText);
                }
            }
        }
    }
    return doc;
}

保存文件后。里面的所有内容都是正确的。但是文档的样式不是。行间的 space 已更改。行与行之间的原始间隙丢失了。所有行都紧密排列在一起。

为什么?如何保持模板的样式?

HWPF 库可能不支持 doc 文件中存在的所有功能,这可能会导致格式发生变化。它还可能导致无法读取文件。

几年前,我创建了一个自定义的 HWPF 库,它可以为我的一个客户正确修改和编写各种文档文件,并且我获得了很多关于文档文件格式和 HWPF 库的经验。

问题是,必须正确支持 HWPF 中的所有功能,这些功能可能存在于 doc 文件中。例如,如果文件中包含剪贴画,则会有单独的表格,用于维护剪贴画的位置和属性。如果在不调整其他内部表格中的地址的情况下更改内容(文本),格式等可能会被移动、忽略或丢失。 (或者在最坏的情况下,文档不可读)

我不确定这些天 HWPF 的状态,但我预计它不会完全支持主要的相关 doc 文件功能。

如果你想使用 HWPF 来修改/编写 doc 文件,你可能会成功地使用文件,这些文件具有减少的 "feature set"。例如,没有表格、没有剪贴画、没有文本框——诸如此类。如果您需要支持用户可能提供的几乎所有文档,我建议您寻找不同的解决方案。

一种选择是使用 rtf 个名为 .doc 的文件。或者使用适用于 .docx 个文件的 XWPF 库。