2017-08-24 52 views
0

我有一個帶有命名文本框的幻燈片演示文稿幻燈片。我希望能夠在特定的命名文本框中更改Java應用程序中的文本。我已經完成了類似的Excel,我有一個接受表示名稱的字符串的方法,然後遍歷Excel工作表中的每個文本框,並將文本框名稱與提供的名稱進行比較,並返回TextBox對象。 我用Powerpoint的類似代碼,它不起作用。在編寫下面的測試例程時,我發現.getShapeName()基本上返回shapeType,而不是我在ppt中給出的實際名稱。從ppt與Apache Poi中檢索一個已命名的文本框

任何人都可以幫助我找到一種方法來獲取ppt文本框的名稱?

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

此例程輸出以下:

文本框TEXT_BOX

文本框TEXT_BOX

文本框TEXT_BOX

文本框TEXT_BOX

文本框TEXT_BOX

+0

getShapeId()可能不是你想要的。 HSLFTextBox.getMetroShape()返回什麼? ...如果是,請檢查其形狀名稱。 – kiwiwings

回答

2

這似乎是HSLF中的錯誤,因爲當前實現沒有意義,即在調用getShapeName()時返回形狀類型的名稱:(
我將在下一個版本中修復此問題,即POI 4.0.1。

作爲一種變通方法,您可以使用此:

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(); 
    } 
}