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

时间:2019-05-28 18:19:12

标签: java apache-poi hwpf

我正在使用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;
}

保存文档后。里面的所有内容都是正确的。但是文档的样式不是。线之间的间距已更改。线之间的原始间隙缺失。所有行都紧密地包装在一起。

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

1 个答案:

答案 0 :(得分:2)

HWPF库可能不支持doc文件中存在的所有功能,这可能会导致格式更改。这也可能导致文件无法读取。

几年前,我创建了一个定制的HWPF库,该库可以为我的一个客户正确地修改和编写各种doc文件,并且我在doc文件格式和HWPF库方面积累了很多经验。

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

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

如果要使用HWPF修改/写入doc文件,则可以使用“功能集”减少的文件来获得成功。例如,没有表格,没有剪贴画,没有文本框-诸如此类。如果您需要支持用户可能提供的几乎所有文档,建议您选择其他解决方案。

一种选择是使用rtf文件,它们被命名为.doc。或使用适用于.docx文件的XWPF库。