使用 Apache POI XMLSlideShow,无法创建气球、标注等形状

问题描述 投票:0回答:1

使用 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)

它可能是一些非常基本的属性,也可能是我缺少的属性,但由于我是新图书馆而无法弄清楚。非常感谢任何指点。

java apache-poi presentation
1个回答
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);
   
  }
 }
}
© www.soinside.com 2019 - 2024. All rights reserved.