1

我正在使用 Apache POI 3.16(撰写本文时的最新版本)。在下面的代码片段中,我创建了一个 XSLFGroupShape,然后我用它来创建一堆子形状:

XSLFGroupShape group = slide.createGroup();

XSLFAutoShape cardRect = group.createAutoShape();
cardRect.setShapeType(ShapeType.RECT);
cardRect.setAnchor(rect);

XSLFPictureShape avatarShape = group.createPicture(avatar);

// More shapes added to the group here...

问题如下:在生成的 PowerPoint 文件中,组位置和尺寸似乎未初始化(我选择了内容被像素化的矩形;整个矩形及其内容是单个 XSLFGroupShape;注意组的操纵器在幻灯片的左上角): PowerPoint 屏幕截图显示未初始化的组的操纵器

我的代码中是否缺少任何内容?有没有办法规避或解决这个问题?

4

1 回答 1

3

GroupShape需要一个AnchorInteriorAnchor一个。并且分组的形状必须适合GroupShape. 当PowerPoint用户使用组时,GUI 会自动管理它。但apache poi需要正确设置,因为它只是将程序所说的写入文件。

示例:宽 350、高 300、左 100、前 50 的组形状和每个角的简单形状。

import java.io.FileOutputStream;

import org.apache.poi.xslf.usermodel.*;
import org.apache.poi.sl.usermodel.*;

import java.awt.Rectangle;
import java.awt.Color;

public class CreatePPTXGroupShape {

 public static void main(String[] args) throws Exception {

  SlideShow slideShow = new XMLSlideShow();

  Slide slide = slideShow.createSlide();

  int groupLeft = 100;
  int groupTop = 50;
  int groupWidth = 350;
  int groupHeight = 300;
  int groupPadding= 10;

  GroupShape group = slide.createGroup();
  group.setInteriorAnchor(new Rectangle(groupLeft, groupTop, groupWidth, groupHeight));
  group.setAnchor(new Rectangle(groupLeft+groupPadding, groupTop+groupPadding, groupWidth-groupPadding, groupHeight-groupPadding));

  AutoShape shape = group.createAutoShape();
  shape.setShapeType(ShapeType.RECT);
  shape.setFillColor(Color.GREEN);
  shape.setAnchor(new Rectangle(groupLeft, groupTop, 150, 100));

  shape = group.createAutoShape();
  shape.setShapeType(ShapeType.TRIANGLE);
  shape.setFillColor(Color.RED);
  shape.setAnchor(new Rectangle(groupLeft+groupWidth-120, groupTop, 120, 100));

  shape = group.createAutoShape();
  shape.setShapeType(ShapeType.DONUT);
  shape.setFillColor(Color.YELLOW);
  shape.setAnchor(new Rectangle(groupLeft, groupTop+groupHeight-90, 90, 90));

  shape = group.createAutoShape();
  shape.setShapeType(ShapeType.ELLIPSE);
  shape.setFillColor(Color.BLUE);
  shape.setAnchor(new Rectangle(groupLeft+groupWidth-100, groupTop+groupHeight-100, 100, 100));

  FileOutputStream out = new FileOutputStream("CreatePPTXGroupShape.pptx");
  slideShow.write(out);
  out.close();
 }
}
于 2017-05-23T16:11:00.320 回答