使用 Apache POI 5.2.5,在
XMLSlideShow
中,我能够创建一些基本形状,例如三角形、矩形。但由于某种原因,无法创建气球和标注。
这是相关代码段(在
Kotlin
中)
val slideShow: SlideShow<*, *> = XMLSlideShow()
val slide = slideShow.createSlide()
var autoShape = slide.createAutoShape()
autoShape.shapeType = ShapeType.ACCENT_CALLOUT_1
autoShape.fillColor = Color.BLUE
autoShape.anchor = Rectangle(100, 400, 50, 50)
autoShape = slide.createAutoShape()
autoShape.shapeType = ShapeType.BALLOON
autoShape.fillColor = Color.GREEN
autoShape.anchor = Rectangle(200, 400, 50, 50)
autoShape = slide.createAutoShape()
autoShape.shapeType = ShapeType.BENT_ARROW
autoShape.fillColor = Color.YELLOW
autoShape.anchor = Rectangle(300, 400, 50, 50)
// this is working
autoShape = slide.createAutoShape()
autoShape.shapeType = ShapeType.ROUND_1_RECT
autoShape.fillColor = Color.CYAN
autoShape.anchor = Rectangle(400, 400, 50, 50)
val line = slide.createAutoShape()
line.shapeType = ShapeType.LINE
line.anchor = Rectangle(250, 250, 100, 200)
line.fillColor = Color(0, 128, 0)
它可能是一些非常基本的属性,也可能是我缺少的属性,但由于我是新图书馆而无法弄清楚。非常感谢任何指点。
org.apache.poi.sl.usermodel.ShapeType 背后的想法是保护旧的二进制 OLE
*.ppt
文件格式以及当前的 Office Open XML *.pptx
文件格式。但由于 Microsoft 在提供向后兼容性方面并不擅长,因此某些旧的二进制 PowerPoint 形状类型无法在当前的 PowerPoint 版本中使用。有些根本不会显示,有些甚至没有 ooxmlId。对于后者,在 *.pptx
文件中使用时,当前 PowerPoint 在打开文件时会引发错误。
如果您检查以下输出:
for (ShapeType shapeType : ShapeType.values()) {
System.out.println(shapeType.name());
System.out.print("Native " + shapeType.nativeId);
System.out.println(" - " + shapeType.nativeName);
System.out.print("OOXML " + shapeType.ooxmlId);
System.out.println(" - " + shapeType.getOoxmlName());
System.out.println("----------------------------");
}
您会看到某些形状类型只有
nativeId
并且 ooxmlId
是 -1
。这些不能与 XMLSlideShow
一起使用,而只能使用 HSLFSlideShow
。反之亦然,有些有 ooxmlId
并且 nativeId
是 -1
。这些不能与 HSLFSlideShow
一起使用,只能使用 XMLSlideShow
。
以下示例使用所有可能的形状类型创建自动形状。当与
SlideShow slideShow = new HSLFSlideShow(); FileOutputStream out = new FileOutputStream("./CreatePPTXShapeTypes.ppt");
一起使用时,则适用于二进制 *.ppt
;当与 SlideShow slideShow = new XMLSlideShow(); FileOutputStream out = new FileOutputStream("./CreatePPTXShapeTypes.pptx");
一起使用时,则适用于当前 *.pptx
。
import java.io.FileOutputStream;
import org.apache.poi.sl.usermodel.*;
import org.apache.poi.xslf.usermodel.*;
import org.apache.poi.hslf.usermodel.*;
import java.awt.Rectangle;
import java.awt.Color;
public class CreatePowerPointShapeTypes {
public static void main(String[] args) throws Exception {
try (
SlideShow slideShow = new XMLSlideShow(); FileOutputStream out = new FileOutputStream("./CreatePPTXShapeTypes.pptx");
//SlideShow slideShow = new HSLFSlideShow(); FileOutputStream out = new FileOutputStream("./CreatePPTXShapeTypes.ppt");
) {
Slide slide = slideShow.createSlide();
int x = 20;
int y = 20;
int width = 100;
int height = 100;
for (ShapeType shapeType : ShapeType.values()) {
if ((slideShow instanceof XMLSlideShow && shapeType.ooxmlId > -1) ||
(slideShow instanceof HSLFSlideShow && shapeType.nativeId > -1)) {
AutoShape autoShape = slide.createAutoShape();
autoShape.setText(shapeType.name());
autoShape.setShapeType(shapeType);
autoShape.setFillColor(Color.BLUE);
autoShape.setAnchor(new Rectangle(x, y, width, height));
x = x + width + 5;
if (x > 600) {
x = 20;
y = y + height + 5;
}
if (y > 400) {
slide = slideShow.createSlide();
x = 20;
y = 20;
}
}
}
slideShow.write(out);
}
}
}