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