在apache POI HWPF中使用CharacterRun替换文本

时间:2017-11-30 16:34:32

标签: java apache ms-word apache-poi hwpf

我对Apache POI中的字符串替换有一个小问题。

private static HWPFDocument replaceText(HWPFDocument doc, String findText, String replaceText) {
    Map<String, Range> ranges = new HashMap<String, Range>();

    ranges.put("COMMENTS", doc.getCommentsRange());
    ranges.put("ENDNOTE", doc.getEndnoteRange());
    ranges.put("FOOTNOTE", doc.getFootnoteRange());
    ranges.put("HEADERSTORY", doc.getHeaderStoryRange());
    ranges.put("MAINTEXT", doc.getMainTextboxRange());
    ranges.put("OVERALL", doc.getOverallRange());
    ranges.put("DEFAULT", doc.getRange());

    for (Entry<String, Range> e : ranges.entrySet()) {
        Range r = e.getValue();

        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)) {
                        System.out.println("OLD:" + run.text());
                        run.replaceText(findText, replaceText);
                        System.out.println("NEW:" + run.text());
                    }
                }
            }
        }
    }
    return doc;
}

在99%的情况下,这种情况很好,但在一种情况下,它会切断这样的字符: 在我的sysoutput中它看起来是正确的:

OLD:CUSTOMER_ROW1
NEW:Try and Error customer

但在创建的Word文档中,它仅显示为

rror customer

对我而言,看起来替换不会扩大此CharacterRun的大小并切断所有内容(从头开始),因为打印的替换文本的大小等于要替换的文本的大小。

仅供参考:在其他替换案例中,我甚至用一个包含超过500个字符的文本替换了一个10个字符长的图案,并且工作正常。

到目前为止有没有人遇到过这样的问题并且可以帮到我?我正在使用POI 3.17

0 个答案:

没有答案