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