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。
遇到同样问题的,请给我一个赞。不足之处请指出。

你可能感兴趣的:(poi Range bug)