poi 3.9 Range发现一个bug

在poi3.9 20121203版本
org.apache.poi.hwpf.usermodel.Range中有一个替换Word文本的方法如下

public void replaceText(String pPlaceHolder, String pValue)
{
boolean keepLooking = true;
while (keepLooking)
{
String text = text();
int offset = text.indexOf(pPlaceHolder);
if (offset >= 0)
replaceText(pPlaceHolder, pValue, offset);
else
keepLooking = false;
}
}

该方法有bug,大部分情况下使用起来都正常,但是当你需要把例如“你好”替换成“你好吗”的时候会引起死循环。因为“你好吗”包含“你好”,可以一直替换下去。

我自己的解决方案,重写该方法。
public class MyRange {

private Range range;
public MyRange(){

}
public MyRange(Range range){
// super();
this.range=range;
}
public void setRange(Range range){
this.range=range;
}

public void replaceText(String pPlaceHolder, String pValue)
{
boolean keepLooking = true;
int offset=0;
while (keepLooking)
{
String text = range.text();
offset = text.indexOf(pPlaceHolder,offset);

if (offset >= 0){
range.replaceText(pPlaceHolder, pValue, offset);
if(pValue.length()>=pPlaceHolder.length()){
offset=offset+(pValue.length()-pPlaceHolder.length()+1);
}

}else{
keepLooking = false;
}
}
}
}


调用的地方也做相应的修改
Range range = document.getRange();
range.replaceText(str1, str2);
改为:
Range range = document.getRange();
MyRange myRange = new MyRange(range);
myRange.replaceText(str1, str2);

还有我们原来是用jacob替换文本的,但是jacob在linux下不支持,所以替换成了poi。
遇到同样问题的,请给我一个赞。不足之处请指出。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值