从ppt与Apache Poi中检索一个已命名的文本框
问题描述:
我有一个带有命名文本框的幻灯片演示文稿幻灯片。我希望能够在特定的命名文本框中更改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
答
这似乎是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();
}
}
getShapeId()可能不是你想要的。 HSLFTextBox.getMetroShape()返回什么? ...如果是,请检查其形状名称。 – kiwiwings