java - 使用 Apache POI 设置 PowerPoint 文档中圆角矩形的半径

标签 java apache apache-poi powerpoint

我使用 Apache POI 3.16 在 PowerPoint 演示文稿中插入圆角矩形形状:

XSLFAutoShape cardRect = slide.createAutoShape();
cardRect.setShapeType(ShapeType.ROUND_RECT);
cardRect.setLineColor(Color.LIGHT_GRAY);

如何调整矩形的圆角半径?

最佳答案

到目前为止,这还没有在 apache poi 中实现。但我们可以使用以 org.openxmlformats.schemas.presentationml.x2006.main.CTShape 开头的底层对象.

要获取更多信息,我们可以使用 PowerPoint 创建一个具有圆角矩形形状的简单 PPT,然后简单地解压缩 *.pptx 文件并查看/ppt/slides/slide1.xml

对于圆角矩形的半径,我们在那里找到:

<a:avLst>
 <a:gd name="adj" fmla="val 25000"/>
</a:avLst>

在形状的 XML 中。

这意味着:有一个 gd(Shape Guide)具有名称“adj”和公式“val n”,其中 n 介于 0(最小值)和 50000(最大值)之间。

所以:

import java.io.FileOutputStream;

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

import org.apache.xmlbeans.XmlObject;
import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;
import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuideList;
import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuide;

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

public class CreatePPTXRoundedRectangelShape {

 static void setRadius(XSLFAutoShape autoShape, int percent) {
  if (ShapeType.ROUND_RECT.equals(autoShape.getShapeType())) {
   XmlObject xmlObject = autoShape.getXmlObject();
   CTShape ctShape = (CTShape)xmlObject;
   CTGeomGuideList ctGeomGuideList = ctShape.getSpPr().getPrstGeom().getAvLst();
   CTGeomGuide ctGeomGuide = ctGeomGuideList.addNewGd();
   ctGeomGuide.setName("adj");
   ctGeomGuide.setFmla("val " + (50000*percent/100));
  }
 }

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

  SlideShow slideShow = new XMLSlideShow();

  Slide slide = slideShow.createSlide();

  int slideWidth = slideShow.getPageSize().width;

  XSLFAutoShape cardRect = ((XSLFSlide)slide).createAutoShape();
  cardRect.setShapeType(ShapeType.ROUND_RECT);
  cardRect.setLineColor(Color.LIGHT_GRAY);
  cardRect.setAnchor(new Rectangle(100, 10, slideWidth-200, 90));
  //default radius

  cardRect = ((XSLFSlide)slide).createAutoShape();
  cardRect.setShapeType(ShapeType.ROUND_RECT);
  cardRect.setLineColor(Color.LIGHT_GRAY);
  cardRect.setAnchor(new Rectangle(100, 110, slideWidth-200, 90));
  setRadius(cardRect, 0); //0 radius

  cardRect = ((XSLFSlide)slide).createAutoShape();
  cardRect.setShapeType(ShapeType.ROUND_RECT);
  cardRect.setLineColor(Color.LIGHT_GRAY);
  cardRect.setAnchor(new Rectangle(100, 210, slideWidth-200, 90));
  setRadius(cardRect, 50); //50% radius

  cardRect = ((XSLFSlide)slide).createAutoShape();
  cardRect.setShapeType(ShapeType.ROUND_RECT);
  cardRect.setLineColor(Color.LIGHT_GRAY);
  cardRect.setAnchor(new Rectangle(100, 310, slideWidth-200, 90));
  setRadius(cardRect, 100); //100% radius

  cardRect = ((XSLFSlide)slide).createAutoShape();
  cardRect.setShapeType(ShapeType.ROUND_RECT);
  cardRect.setLineColor(Color.LIGHT_GRAY);
  cardRect.setAnchor(new Rectangle(100, 410, slideWidth-200, 90));
  setRadius(cardRect, 33); //33% radius

  FileOutputStream out = new FileOutputStream("CreatePPTXRoundedRectangelShape.pptx");
  slideShow.write(out);
  out.close();
 }
}

关于java - 使用 Apache POI 设置 PowerPoint 文档中圆角矩形的半径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44030139/

相关文章:

java - 使用 Log4j2 从静态方法记录

css 不会从文件加载

java - 如何在java中转换em破折号

java - Excel 中的背景或前景合并单元格

apache-poi - Excel Biff5到Biff8的转换

java - JPA Web 应用程序管理策略

java - 哪些 Android 事件 View 元素可用

javac - 生成特定于平台的二进制代码

Apache Mahout - 如何将数据集对象保存到 HDFS?

php - 我在 WAMP 安装的 httpd.conf 中输入了错误的信息...