2014-03-24 15 views
7

Ich möchte ein Vorlage Word-Dokument laden, um Inhalt hinzuzufügen und als neues Dokument zu speichern. Ich arbeite an der .doc Datei.Ersetzen von Variablen in einer Word-Dokumentvorlage mit Java

Nach langer Forschung fand ich nur Lösungen für docx:

http://www.smartjava.org/content/create-complex-word-docx-documents-programatically-docx4j

http://www.sambhashanam.com/mail-merge-in-java-for-microsoft-word-document-part-i/

Deshalb möchte ich eine Variable in diesem Format geschrieben ersetzen: $VAR durch seinen Wert. Kann ich es mit Velocity oder Apache-Poi machen, was ist die beste Lösung dafür? Jede Hilfe wird geschätzt.

Antwort

18

Ja, Sie können es mit Apache-POI tun. Ihre Variablennamen müssen eindeutig sein. Siehe den folgenden Code

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import org.apache.poi.hwpf.HWPFDocument; 
import org.apache.poi.hwpf.usermodel.CharacterRun; 
import org.apache.poi.hwpf.usermodel.Paragraph; 
import org.apache.poi.hwpf.usermodel.Range; 
import org.apache.poi.hwpf.usermodel.Section; 
import org.apache.poi.poifs.filesystem.POIFSFileSystem; 

public class HWPFTest { 
    public static void main(String[] args){ 
     String filePath = "F:\\Sample.doc"; 
     POIFSFileSystem fs = null;   
     try {    
      fs = new POIFSFileSystem(new FileInputStream(filePath));    
      HWPFDocument doc = new HWPFDocument(fs); 
      doc = replaceText(doc, "$VAR", "MyValue1"); 
      saveWord(filePath, doc); 
     } 
     catch(FileNotFoundException e){ 
      e.printStackTrace(); 
     } 
     catch(IOException e){ 
      e.printStackTrace(); 
     } 
    } 

    private static HWPFDocument replaceText(HWPFDocument doc, String findText, String replaceText){ 
     Range r1 = doc.getRange(); 

     for (int i = 0; i < r1.numSections(); ++i) { 
      Section s = r1.getSection(i); 
      for (int x = 0; x < s.numParagraphs(); x++) { 
       Paragraph p = s.getParagraph(x); 
       for (int z = 0; z < p.numCharacterRuns(); z++) { 
        CharacterRun run = p.getCharacterRun(z); 
        String text = run.text(); 
        if(text.contains(findText)) { 
         run.replaceText(findText, replaceText); 
        } 
       } 
      } 
     } 
     return doc; 
    } 

    private static void saveWord(String filePath, HWPFDocument doc) throws FileNotFoundException, IOException{ 
     FileOutputStream out = null; 
     try{ 
      out = new FileOutputStream(filePath); 
      doc.write(out); 
     } 
     finally{ 
      out.close(); 
     } 
    } 
} 
+0

Welches Glas wird benötigt, um obigen Code zu verwenden? –

+0

@SanjayPatel seine Apache POI [https://poi.apache.org/download.html](https://poi.apache.org/download.html) – Liquidpie

+0

es nicht ersetzen, wenn Lesezeichen auf Tabelle in Wort –

-5

Vikrant,

Der Code Snippet oben und in Auftrag gegeben wird, zu arbeiten, brauchen wir jar oben erwähnt. Zusammen mit diesem Jar, benutze/download poi-3.5-FINAL.jar.

Ich hoffe, dies wird Ihre Frage beantworten.

+3

As [im Apache POI FAQ - Gläser zwischen den Versionen Mischen] erklärt (http://poi.apache.org/faq.html#faq-N101F8) (zB 3,2-Scratchpad und 3,5 -main) ** wird nicht unterstützt **! Also sagst du jemandem, etwas zu tun, was nicht unterstützt wird, und sag ihm, dass er [sehr alte Versionen] (http://poi.apache.org/changes.html) verwenden soll, nicht großartig :( – Gagravarr