使用Apache Poi从{ppt}检索命名的textBox

时间:2017-08-24 07:14:36

标签: java apache-poi

我有一个名为TextBoxes的powerpoint演示幻灯片。我希望能够在特定的命名文本框中更改Java应用程序中的文本。我已经用Excel做了类似的工作,我有一个方法接受表示名称的String,然后逐步遍历excel表中的每个textBox,并将textBox的名称与提供的名称进行比较,并返回TextBox对象。 我使用类似的Powerpoint代码,它不起作用。在编写下面的测试例程时,我发现.getShapeName()基本上返回了shapeType,而不是我在ppt中给出的实际名称。

任何人都可以帮我找到获取ppt textBoxes名称的方法吗?

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

此例程输出以下内容:

TextBox TEXT_BOX

TextBox TEXT_BOX

TextBox TEXT_BOX

TextBox TEXT_BOX

TextBox TEXT_BOX

1 个答案:

答案 0 :(得分: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();
    }
}