2014-09-24 112 views
2

這裏是我的代碼:使用'替換()`方法不存在於Apache POI替換文本

import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import org.apache.poi.hwpf.HWPFDocument; 
import org.apache.poi.hwpf.usermodel.Range; 
import org.apache.poi.openxml4j.exceptions.InvalidFormatException; 
import org.apache.poi.openxml4j.opc.OPCPackage; 
import org.apache.poi.poifs.filesystem.POIFSFileSystem; 
import org.apache.poi.xwpf.usermodel.XWPFDocument; 
import org.apache.poi.xwpf.usermodel.XWPFParagraph; 
import org.apache.poi.xwpf.usermodel.XWPFRun; 


public class POI { 

    public POI() throws IOException, InvalidFormatException 
    { 

     XWPFDocument doc = new XWPFDocument(OPCPackage.open("input.docx")); 
     for (XWPFParagraph p : doc.getParagraphs()) { 
      for (XWPFRun r : p.getRuns()) { 
       String text = r.getText(0); 

       System.out.println(text); 
       if (text.contains("needle")) 
       { 
        text = text.replace("needle", "haystack"); 

        r.setText(text); 
        System.out.println(text); 
        } 
       } 
      } 
     doc.write(new FileOutputStream("output.docx")); 


    } 


} 

這個代碼意味着.docx文件替換文本。我輸入到程序input.docx,它包含以下數據

needle 
game 
system 

我的產量爲output.docx,它包含以下數據

needlehaystack 
game 
system 

你可以看到區別。它只是在needle旁邊加上haystack,而不是用needle替換haystack

我不知道我在做什麼錯在這裏。如何正確替換.docx文件中的文本?

+0

你可以試試這個在您的替換所有PLZ? 「^ needle \\ w +」 – 2014-09-24 18:26:16

+0

@KickButtowski:現在輸出的是'needleneedle'而不是'needlehaystack'這是以前的輸出。 – 2014-09-24 18:28:54

回答

1

絕對數經驗,但對稱的,它應該是:

r.setText(text, 0); 
+0

woooooow !!!你知道,它工作!你能解釋一下我的理論嗎?因爲我的原始文檔有很多段落.. – 2014-09-24 23:09:37

+0

就像這樣,你能夠友好地告訴我如何訪問表格內的文本? – 2014-09-24 23:13:06

+0

我看了,XWPFTable是一個IBodyElement,所以請參閱XWPFDocument.getBodyElement或[iterate](http://poi.apache.org/apidocs/org/apache/poi/xwpf/usermodel/XWPFDocument.html#getBodyElementsIterator())。 – 2014-09-25 09:19:26

0

使用text.replace("needle", "haystack");

replaceAll使用正則表達式和「針」並非是指爲正則表達式的嘗試。

+0

不好。它是第一個輸出。 – 2014-09-24 18:24:40

+0

@Sniper我想我可能會感到困惑。被替換的String顯示的system.out.println是什麼?它是否顯示預期的輸出?如果是這樣的話,那麼它就不是導致問題的替代聲明,而是寫作。設置後的getText的println可能會啓發我們。 – Compass 2014-09-24 18:28:20

+0

@Sniper你確定Compass的方式不起作用嗎?因爲它適用於我:) – 2014-09-24 18:30:58