# Apache POI Word Text einfügen



## imox (30. Jun 2016)

Hey Leute,

ich benutz die Apache POI API gerade zum ersten Mal und versuche Word files zu verändern. Kann mir jemand sagen, wie ich an einer bestimmten Stelle einen anfangen kann Text einzufügen? Ich finde immer nur Beispiele wo ein Satz geschrieben.

Vielen Dank schon mal 
Gruß
Imox


----------



## VfL_Freak (30. Jun 2016)

imox hat gesagt.:


> [...] wie ich an einer bestimmten Stelle einen anfangen kann Text einzufügen [...]


Nochmal auf Deutsch bitte


----------



## imox (30. Jun 2016)

ähmm ja sorry nicht so viel geschlafen ^^  Also ich will ein bestimmtes Wort in dem Word Dokument finden und an der Stelle dann Text bzw. mehre Text einfügen.


----------



## VfL_Freak (30. Jun 2016)

Aha ... und wo ist dabei Dein Problem ?? 
Ein paar mehr Info und Code dürften es schon sein .... 

Lies Dir bitte mal dies hier durch: http://www.java-forum.org/forum-faq-beitraege/7407-man-fragen-richtig-stellt.html

Gruß Klaus


----------



## Kababär (30. Jun 2016)

Freak jetzt sei doch mal nicht so. Steht doch im Prinzip alles da  
Ob da jetzt steht "ich suche das Wort 'Buttertoast'" oder "ich suche ein bestimmtes Wort" ist doch letztendlich egal. 

@TE: das hier schon gesehen?
http://stackoverflow.com/questions/...ic-position-in-the-word-file-using-apache-poi


----------



## VfL_Freak (30. Jun 2016)

Kababär hat gesagt.:


> Freak jetzt sei doch mal nicht so. Steht doch im Prinzip alles da


nö   weder was bislang versucht wurde, noch Code, noch evt. auftredende Fehler .....


----------



## Kababär (30. Jun 2016)

Ich denke der TE sucht einfach nur nach dem Konstrukt (welche Objekte von Apache, welche Methoden, etc.), um auf die Indexstelle in einer Worddatei zuzugreifen,  dort was anzuhängen und den Text wieder abzuspeichern. 

Aber recht hast du. Von allem nix da. Aber vermutlich weil er noch nichts relevantes hat :/


----------



## imox (30. Jun 2016)

yo sorry Leute habt alle Recht hehe 

also hiermit such ich mir die Position, aber wie dann genau weiter? Also klar neue Paragraphen erstellen und der stelle einfügen oder? Blick noch nicht so ganz durch bei den Objekten ^^Also Klar ne Range hat Paragraphen und die hat dann runs (warum das auch immer run heisst?) Also einfach dann an der Stelle neue Paragraphen einfügen? Aber das ist ja dann wieder voll umständlich muss ich alle danach löschen und wieder hinzufügen. Das muss es doch sauberer geben oder ^^?  Danke schon mal und ich find echt keinen weg den Code hier als Code zu formatieren. Vermutlich hab ich aber nur Tomaten auf den Augen



```
public static int[] getPosition(HWPFDocument doc, String findText) {
   findText = findText(findText);
   Range range = doc.getRange();
   int[] position = null;
   for (int i = 0; i < range.numSections(); ++i) {
     Section s = range.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)) {
           position = new int[2];
           position[0] = i;
           position[1] = x;
           break;
         }
       }
     }
   }
   return position;
}
```


----------



## Joose (30. Jun 2016)

Code bitte in Code-Tags packen, danke! 
[code=java] .. dein java code .. [/code]


----------



## imox (30. Jun 2016)

Danke das hab ich gesucht  Könnte aber mal in das Menü von dem Editor hier


----------



## Kababär (30. Jun 2016)

Das ist in dem Menü des Editors hier 
Mal angenommen du willst ein Buchstabe in die Mitte des Wortes "Stumel" einfügen, weil dir aufgefallen ist (oder der Autokorrektur), dass dieses Wort mit zwei 'm' geschrieben wird. Was wird getan?
Identifizieren des Index, an welcher der Buchstabe eingefügt werden soll.
Nun hat man drei Möglichkeit:
1. Buchstaben vorne an das Wort hängen und in Einzelschritten den Buchstaben nach rechts shiften, wobei der rechte Nachbar die Position mit dem einzufügenden Buchstaben tauscht
2. analog, nur wird der Buchstabe rechts abgehängt.
3. Teilen des Wortes in eine linke und rechts Hälfte in Abhängigkeit des Index, an dem der Buchstabe eingefügt werden soll. Der Index ist die Stelle, wo der linke Teil endet und der rechte Teil anfängt.
Man hängt den Buchstaben an das Ende des linken Teils und danach hängt man den rechten Teil an.
Wie würdest du es denn machen?
Auch wenn es dir nicht klar ist: viele Anweisungen bestehen aus einem Algorithmus. Ein Algorithmus ist das Lösen eines Problems, in dem man das Problem in endlich viele Schritte auf möglichst kleine Teilprobleme herunterbricht.

Aber nun zum Eigentlichen. Wenn dir nicht klar ist, was du als nächstes tun sollst, du aber weißt, mit welchen Objekt du arbeiten sollst und des Weiteren weißt, dass es eine Dokumentation über dieses Objekt gibt, so wäre doch der nächste Schritt, in die Doku zu gucken, um herauszufinden, was das Objekt alles kann und was davon du gebrauchen kannst, oder?
Manches wirst du direkt anwenden können, bei anderen Dingen wirst du noch selbst entwickelte Zwischenschritte zur Vorbereitung implementieren müssen.

Edit: hatte gerade etwas Zeit und dachte mir ich erzähle mal bisschen was


----------



## imox (11. Jul 2016)

Hey,

ja danke für deine Erklärung. Aber das ist mir ja schon klar. Ich raff die API einfach nicht genau. Und hatte gehofft jemand hat das hier schon mal gemacht. Und nein das ist nicht so einfach mit der API. Darum gehts doch.


----------



## imox (11. Jul 2016)

So habs jetzt so mehr oder weniger. Text kann ich einfüge, was ich aber nicht verstehe, dass wenn ich den Text einfüge zerschießt es mir meinen Header. Jemand eine Idee warum? bzw. warum da immer so komische side effects auftreten?


```
private void writeEntries(HWPFDocument doc) {

        int[] position = WordPOIUtil.getPosition(doc, "epoche");

        if (position != null) {

            Range range = doc.getRange();

            for (int i = 0; i < range.numSections(); ++i) {

                Section s = range.getSection(i);

                for (int x = 0; x < s.numParagraphs(); x++) {

                    Paragraph p = s.getParagraph(x);

                    for (int z = 0; z < p.numCharacterRuns(); z++) {

                        if (i == position[0] && x == position[1]

                                && z == position[2]) {

                            CharacterRun run = p.getCharacterRun(z);

                            CharacterRun newRun = run.insertAfter("test");

                            newRun.setBold(true);

                        }

                    }

                }

            }

        }

    }
```


----------



## Kababär (11. Jul 2016)

> zerschießt es mir meinen Header.



Genauer geht's nicht?


----------



## imox (11. Jul 2016)

Ich führe wirklich nur diese Methode mehr aus. Das reicht damit der Header zerschossen wird. Führe ich Sie nicht aus ist alles ok.

Vorher





Nacher


----------



## Kababär (11. Jul 2016)

Sieht eher so aus, als ob dein Java Code deinen Header als Paragraph betrachtet.
Schon mal so etwas versucht?


```
Run headerRun = new Run();
  headerRun.addText("Header text");
Paragraph headerParagraph = new Paragraph();
            headerParagraph.add(headerRun);
            headerParagraph.setHorizontalTextAlignment(HorizontalAlignmentType.RIGHT);

            Header header = new Header();
            header.add(headerParagraph);
```


----------



## imox (11. Jul 2016)

Kababär hat gesagt.:


> Sieht eher so aus, als ob dein Java Code deinen Header als Paragraph betrachtet.



Was meinst du damit? Ich fasse den Header doch auch gar nicht an.

Also ich habe eine Vorlage und die lese ich ein. Also wird der Header nicht von mir erstellt, sondern eingelesen.


----------



## Kababär (11. Jul 2016)

Du liest ja jeden Paragraph ein und am Ende schreibst du wieder die Datei bzw. aktualisiert die Änderungen von dir, richtig?
Dann ist das Problem, dass dein Header als Paragraph eingelesen wird und als solchen behandelt wird, ergo ist dein Header kein Header mehr.
Das vermute ich jetzt einfach mal.


----------



## imox (11. Jul 2016)

ok klingt logisch aber wo ist das Problem? Ich fasse den Paragraphen Header doch gar nicht an? Ich füge doch an einer anderen Stelle andere Paragraphen bzw. sogar nur run's hinzu. Wenn ich das ja nicht tue ist der Header ja auch nicht kaputt.


----------



## Kababär (11. Jul 2016)

Ich weiß nicht wie ich es dir erklären soll, wenn es logisch klingt, aber doch nicht verstanden wird. 
Ich leite dich mal hier hin: https://poi.apache.org/apidocs/org/apache/poi/hwpf/HWPFDocument.html


----------



## imox (11. Jul 2016)

Ich meinte damit das es logisch klingt, dass der Header kein Header ist sondern ein Paragraph. Aber warum ist das mein Problem? Ich fasse den Paragraphen doch gar nicht an?

Was auch komisch ist, dass mein Header abhängig von dem Text den ich einfüge anders aussieht. Also mal mehr Striche mal weniger usw. 

Wie auch immer hast du eine Idee wie ich das Problem jetzt lösen kann?


----------



## Kababär (11. Jul 2016)

also laut dem Snippet von mir, ist ein Header nicht weiteres als eine spezielle Art Paragraph, das heißt:
Liest du alle Paragraphen ein, liest du auch alle header ein und definierst die Header als Paragraph beim Schreiben.

Guck dir mal headerStories an, vielleicht hilft dir das irgendwie.


----------



## imox (11. Jul 2016)

Ja ok aber wo ist denn das Problem? Ich mache doch gar nichts mit den Headerparagraphen. Das doc selber hat ja auch mehrere Methoden. 

doc.getHeaderStoryRange()
doc.getRange()

Damit bekommen man ja die verschiedenen Paragraphen. Und ich verändere ja nur die normale Range nicht die HeaderRange.


----------



## imox (11. Jul 2016)

Ich glaube du verstehst das hier gerade falsch? Ich füge andere Paragraphen in der normalen Range hinzu und mein Header zerschießt sich. Ich fasse den Header doch gar nicht an.


----------



## Kababär (11. Jul 2016)

Debugge mal durch und gucke mal, ob du nicht wirklich deinen header anfasst.
http://www.programcreek.com/java-api-examples/index.php?api=org.apache.poi.hwpf.usermodel.Paragraph
Guck dir mal diese Beispiele an und versuche dein Code mal anzupassen.


----------



## imox (11. Jul 2016)

Habe ich bereits. Ich fasse meinen Header nicht an. In meinen Java Code oben wo ich zeige was ich mache, habe ich auch mal ein sysout von jedem run gemacht. Das ist wirklich nur der Text der in dem Doc steht nicht im Header etc.

Und was genau soll ich denn an meinem code anpassen? In Bezug auf den Link den du mir gegeben hast?


----------



## Kababär (11. Jul 2016)

Also ich weiß nicht, was da passiert, aber selbst probieren kann ich es auch nicht, da keinen vollständigen Code und kein Word-Exemplar habe, sonst würde ich da mal bisschen rumprobieren.
Ich bin kein Java Apache POI Profi, weiß also nicht was genau da unter der Haube läuft.
Daher kann ich dir leider jetzt auch nicht sagen, was genau da nicht stimmt.

Aber fest steht doch, dass irgendwas mit dem Header passiert. Auch wenn du diesen nicht explizit anfasst, passiert da was. Nur weiß ich auch nicht was.


----------

