1

关于 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

4

0 回答 0