# .doc text ändern



## neela (17. Aug 2011)

Hallo 
ich stehe vor dem Problem das ich aus meinen Java Programm heraus in einer doc-datei den Text anpassen muss.
Ich habe schon die api von POI durchforstet aber bin nicht wirklich fündig geworden
Könnt ihr mir vlt weiter helfen?

Vielen Dank


----------



## Gonzo17 (17. Aug 2011)

Wieso öffnest du einen neuen Thread? Zumal es ja mit Apache POI geht, du machst es anscheinend nur eben noch nicht richtig.

Apache POI - HWPF - Java API to Handle Microsoft Word Files


----------



## neela (17. Aug 2011)

ich habe es jetzt folgendermaßen probiert 


```
HWPFDocument doc;
				try {
					doc = new HWPFDocument(new FileInputStream("C:\\Desktop\\Blubber.doc"));
				

	            Range range = doc.getRange();
	            range.replaceText("*Blubber*", "blub");
	            OutputStream out = new FileOutputStream("C:\\Desktop\\Blubber2.doc");
	            
	            doc.write(out);
	            
	            out.flush();
	            out.close();
```

Die doc Datei besteht nur aus dem String *Blubber*
das Programm legt mir die Datei Blubber2 an jedoch kann ich diese nicht öffnen.

Word bringt die Fehlermeldung das das Programm zu Umfangreich ist


----------



## Gonzo17 (17. Aug 2011)

Sorry, bitte bleib doch in einem Thread. Kann man das hier closen / zusammenführen? Bringt ja nix wenn wir parallel in zwei Threads schreiben und du hier schon weiter bist wie im anderen.


----------



## neela (17. Aug 2011)

sry hab den alten geschlossen


----------



## Gonzo17 (17. Aug 2011)

Habs auch mal getestet und es zeigt bei mir ähnliches Verhalten. Leider kann ich dir da jetzt nicht explizit helfen, da wirst du dich wohl an die Mailinglist wenden müssen.

http://poi.apache.org/mailinglists.html


----------



## neela (17. Aug 2011)

Ein Einfügen am Ende des Textes mit folgenden Code funktioniert.

```
HWPFDocument doc;
                try {
                    doc = new HWPFDocument(new FileInputStream("C:\\Desktop\\Blubber.doc"));
                
 
                Range range = doc.getRange();
                range.insertAfter("Versuch");

	         //  range.replaceText("*Blubber*", "blub");
                OutputStream out = new FileOutputStream("C:\\Desktop\\Blubber2.doc");
                
                doc.write(out);
                
                out.flush();
                out.close();
```

Also muss der Fehler in Folgender Zeile liegen 
	
	
	
	





```
range.replaceText("*Blubber*", "blub");
```
Jedoch finde ich keine Fehler


----------



## Gonzo17 (17. Aug 2011)

Bei mir ist es egal, ob ich das mache oder sogar garnichts mache (also nur einlesen und anschließend speichern). Die Datei öffnet er zwar, allerdings kommt auch jedes Mal die Meldung, dass Probleme erkannt wurden und ein Bearbeiten der Datei gefährlich sein kann. Bearbeite ich sie trotzdem, dann poppen ständig Warnungen auf, dass der Arbeitsspeicher nicht genügt, um die Datei zu bearbeiten. Ich benutze Word 2010.

Wie gesagt, wende dich an die Mailinglist. Die wissen da mehr und antworten dir auch recht schnell.


----------



## neela (17. Aug 2011)

ich versuch mein glück mal da wenn ich de lösung weis werde ich sie posten


----------



## neela (18. Aug 2011)

bis jetzt hab ich von der mailinglist keine antwort
aber was ich gerade herausgefunden habe das wenn der zuersetzende text und der neue text gleich lang sind geht es warum auch immer ???:L


----------



## Gonzo17 (18. Aug 2011)

neela hat gesagt.:


> bis jetzt hab ich von der mailinglist keine antwort
> aber was ich gerade herausgefunden habe das wenn der zuersetzende text und der neue text gleich lang sind geht es warum auch immer ???:L



Du kannst dir auch einfach mal den Source-Code anschauen, ist ja Open Source. Geh einfach mal in die Methode rein und schau, was da passiert. Vielleicht fällt dann der Groschen.


----------



## neela (18. Aug 2011)

Irgendwie sieht für mich der Code richtig aus und anhand dem Beispiel weis ich nun das das irgendwie gehen muss wenn die Wörter unterschiedlich lang sind 

```
/**
	 * Replace (one instance of) a piece of text with another...
	 *
	 * @param pPlaceHolder
	 *            The text to be replaced (e.g., "${organization}")
	 * @param pValue
	 *            The replacement text (e.g., "Apache Software Foundation")
	 * @param pOffset
	 *            The offset or index where the text to be replaced begins
	 *            (relative to/within this <code>Range</code>)
	 */
	public void replaceText(String pPlaceHolder, String pValue, int pOffset) {
		int absPlaceHolderIndex = getStartOffset() + pOffset;
		Range subRange = new Range(absPlaceHolderIndex, (absPlaceHolderIndex + pPlaceHolder
				.length()), getDocument());

		// this Range isn't a proper parent of the subRange() so we'll have to
		// keep
		// track of an updated endOffset on our own
		int previousEndOffset = subRange.getEndOffset();

		subRange.insertBefore(pValue);

		if (subRange.getEndOffset() != previousEndOffset) {
			adjustForInsert(subRange.getEndOffset() - previousEndOffset);
		}

		// re-create the sub-range so we can delete it
		subRange = new Range((absPlaceHolderIndex + pValue.length()), (absPlaceHolderIndex
				+ pPlaceHolder.length() + pValue.length()), getDocument());

		// deletes are automagically propagated
		subRange.delete();
	}

	/**
	 * Replace (all instances of) a piece of text with another...
	 *
	 * @param pPlaceHolder
	 *            The text to be replaced (e.g., "${organization}")
	 * @param pValue
	 *            The replacement text (e.g., "Apache Software Foundation")
	 */
	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;
		}
	}
```

edit: OpenOffice öffnet er problemlos nur leider bin ich gezwungen das für mircosoft zu programmieren


----------



## neela (23. Aug 2011)

ich verzichte nun auf jede api 
da ich ja in dem .doc nur was ersetzen will und nix weiter machen will.
Ich speicher den Inhalt der Datei in einen String und dann replace ich.

Also Problem gelöst


----------

