2017-08-24 6 views
0

Ich habe eine Powerpoint-Präsentationsfolie mit benannten TextBoxen. Ich möchte in der Lage sein, den Text von einer Java-Anwendung in einer bestimmten benannten TextBox zu ändern. Ich habe ähnlich mit Excel gemacht, wo ich eine Methode habe, die eine Zeichenfolge akzeptiert, die den Namen darstellt, dann durch jede TextBox in der Excel-Tabelle schreitet und den Namen der TextBox mit dem angegebenen Namen vergleicht und das TextBox-Objekt zurückgibt. Ich habe einen ähnlichen Code für Powerpoint verwendet und es funktioniert nicht. Beim Schreiben einer Test-Routine unten fand ich, dass .getShapeName() im Grunde den ShapeType zurückgibt und nicht den tatsächlichen Namen, den ich in ppt angegeben habe.Abrufen einer benannten TextBox aus PPT mit Apache Poi

Kann mir jemand helfen, einen Weg zu finden, die Namen der ppt TextBoxen zu bekommen?

private void getTextBox() { 
    for (HSLFShape myShape : slide.getShapes()) { 
     if (myShape instanceof HSLFTextBox) { 
      myTextBox = (HSLFTextBox) myShape; 
      System.out.println(myTextBox.getShapeName() + " " + myTextBox.getShapeType()); 
     } 
    } 
} 

Diese Routine gibt die folgenden:

TextBox Text_box

TextBox Text_box

TextBox Text_box

TextBox Text_box

TextBox Text_box

+0

getShapeId() ist wahrscheinlich nicht das, was Sie wollen. ist HSLFTextBox.getMetroShape() alles zurückgeben? ... wenn ja, überprüfen Sie den Namen der Form. – kiwiwings

Antwort

2

Dies scheint ein Fehler in HSLF zu sein, da die aktuelle Implementierung keinen Sinn ergibt, dh den Namen des Formtyps zurückgeben, wenn getShapeName() aufgerufen wird :(
Ich werde das in der nächsten Version beheben, dh POI 4.0.1.

Als Abhilfe können Sie diese verwenden können:

import java.io.FileInputStream; 
import java.io.IOException; 

import org.apache.poi.ddf.EscherComplexProperty; 
import org.apache.poi.ddf.EscherProperties; 
import org.apache.poi.hslf.usermodel.HSLFShape; 
import org.apache.poi.hslf.usermodel.HSLFSlide; 
import org.apache.poi.hslf.usermodel.HSLFSlideShow; 
import org.apache.poi.util.StringUtil; 

public class ShapeName { 
    public static void main(String[] args) throws IOException { 
     FileInputStream is = new FileInputStream("shapeName.ppt"); 
     HSLFSlideShow ppt = new HSLFSlideShow(is); 
     is.close(); 

     HSLFSlide slide = ppt.getSlides().get(0); 

     for (HSLFShape shape : slide.getShapes()) { 
      EscherComplexProperty ep = HSLFShape.getEscherProperty(shape.getEscherOptRecord(), EscherProperties.GROUPSHAPE__SHAPENAME); 
      String name; 
      if (ep != null) { 
       name = StringUtil.getFromUnicodeLE(ep.getComplexData()); 
      } else { 
       name = shape.getShapeName()+shape.getShapeId(); 
      } 
      System.out.println(name); 
     } 

     ppt.close(); 
    } 
}