Apache POI PPT - Vertikales Alignment von Text im XSLFAutoShape

Hallo zusammen,

mit ersten Schritten mit Apache POI möchte ich Shapes in einer Powerpoint-Datei erstellen. Das funktioniert auch bereits. Jedoch habe ich das Problem, dass ich den Text in den Shapes vertikal nicht positioniert bekomme.

Per Suche im Internet finde ich quasi nix zum VerticalAlignment innerhalb von PPT-Shapes, da es meist nur um Excel geht.

Java:
            XSLFAutoShape rect = s1.createAutoShape();
            rect.setShapeType(ShapeType.RECT);
            rect.setAnchor(new Rectangle2D.Double(startH, calc.getShapeY(0, timeline.getLineHeight(), timeline.getLineHeight(), timeline.getLineSpace(), timeline.getStartY()), shapeWidth, timeline.getLineHeight()));
            rect.setFillColor(parseStringtoColor(timeline.getTlMonthColor()));
            rect.setLineWidth(0.5);
            rect.setLineColor(java.awt.Color.BLACK);
            rect.setHorizontalCentered(true);

            rect.setText(monthNames[currentDate.plusMonths(i - 1).getMonthOfYear() - 1]);
            XSLFTextRun tr = rect.getTextParagraphs().get(0).getTextRuns().get(0);
            tr.setFontSize(timeline.getTlFontSize());
            tr.setFontFamily(timeline.getTlFont());
            
            rect.setVerticalAlignment(org.apache.poi.sl.usermodel.VerticalAlignment.MIDDLE);
Die letzte Zeile scheint keinerlei Effekt zu haben.
Kann mich jemand in die richtige Richtung stoßen?

Danke!!
mace
 
Zuletzt bearbeitet von einem Moderator:
Funktioniert einwandfrei:
Java:
import org.apache.poi.xslf.usermodel.*;
import org.apache.poi.sl.usermodel.*;
import java.io.FileOutputStream;
import java.awt.Color; 
import java.awt.geom.*;

public class Test {
    public static void main(String[] args) throws Exception {
        XMLSlideShow ppt = new XMLSlideShow();
        XSLFSlide slide = ppt.createSlide();
        XSLFAutoShape shape = slide.createAutoShape();
        shape.setShapeType(ShapeType.RECT);
        shape.setAnchor(new Rectangle2D.Double(10, 10, 200, 200));
        shape.setFillColor(Color.YELLOW);
        shape.setVerticalAlignment(VerticalAlignment.MIDDLE);
        shape.setHorizontalCentered(true);
        XSLFTextParagraph p = shape.addNewTextParagraph();
        XSLFTextRun r1 = p.addNewTextRun();
        r1.setText("The");
        r1.setFontColor(Color.blue);
        r1.setFontSize(24.);

        try(FileOutputStream fos = new FileOutputStream("out.ppt")) {
            ppt.write(fos);
        }
    }
}
 
Vielen Dank für deine Antwort.
Ich habe deinen Code fast unverändert ausprobiert: Funktionierte.
Dann habe ich deinen Code für meinen übernommen: Funktionierte nicht.
Die Ursache habe ich jetzt gefunden, auch wenn ich sie immer noch nicht verstehe. Das Shape verfügte scheinbar bereits über einen Paragraphen, noch bevor ich Text zugewiesen habe. Dieser hat eine Zeile eingenommen und damit meinen Text nach unten geschoben. Das rect.clearText() hat das Problem behoben. Wo jetzt der Unterschied zwischen deinem und meinem Code liegt, hab ich noch nicht gesehen... Trotzdem danke.

Code:
            XSLFAutoShape rect = s1.createAutoShape();
            rect.setShapeType(ShapeType.RECT);
            rect.setAnchor(new Rectangle2D.Double(startH, calc.getShapeY(0, timeline.getLineHeight(), timeline.getLineHeight(), timeline.getLineSpace(), timeline.getStartY()), shapeWidth, timeline.getLineHeight()));
            rect.setFillColor(parseStringtoColor(timeline.getTlMonthColor()));
            rect.setLineWidth(0.5);
            rect.setLineColor(java.awt.Color.BLACK);
            rect.setVerticalAlignment(VerticalAlignment.MIDDLE);
            rect.setHorizontalCentered(true);
            rect.clearText();

            
            XSLFTextParagraph p = rect.addNewTextParagraph();
            XSLFTextRun r1 = p.addNewTextRun();
            r1.setText(monthNames[currentDate.plusMonths(i - 1).getMonthOfYear() - 1]);
            r1.setFontSize(timeline.getTlFontSize());
            r1.setFontFamily(timeline.getTlFont());
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben