XSLFTable表中,有两列-一列包含文本,另一列是百分比数字,如下图所示.

enter image description here

虽然创建表格和数据非常简单,但如何将圆角矩形包含在文本(in the first column)下方的每个单元格中,其中矩形的宽度实际上是第二个单元格的数字?

以下是该表的代码(单位为Kotlin,但应该通过IDEA轻松转换为Java)-


val pptx = XMLSlideShow()
val slide = ppt.createSlide()

val tbl = slide.createTable()
tbl.anchor = Rectangle(10, 90, 200, 150)

// row 1
val tr = tbl.addRow()
val td1 = tr.addCell()
val td2 = tr.addCell()
val r1 = td1.addNewTextParagraph().addNewTextRun()
r1.setText("Option 1")
val r2 = td2.addNewTextParagraph().addNewTextRun()
r2.setText("8.3%")

// row 2
// ...

// row 3
val tr1 = tbl.addRow()
val td3 = tr1.addCell()
val td4 = tr1.addCell()
val r3 = td3.addNewTextParagraph().addNewTextRun()
r1.setText("Option 3")
val r4 = td4.addNewTextParagraph().addNewTextRun()
r4.setText("51.9%")
r4.isBold = true

// row 4
// ...

tbl.setColumnWidth(0, 150.0)
tbl.setColumnWidth(0, 50.0)

推荐答案

PowerPoint表格单元格文本下方的每个单元格中不能包含形状.PowerPoint表格单元格仅为文本形状.因此,它只能包含文本.PowerPoint不提供与文本内联对齐的形状或图片.表格单元格可能有背景,但它不能是形状,而只是图片.

因此,关于此类要求的第一个问题始终是:如何使用PowerPoint图形用户界面创建您需要的内容?

我会使用分组形状来完成这一任务,分组形状将两个文本框和每个选项的矩形形状分组.

完整示例:

import java.io.FileOutputStream;

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

import java.awt.Rectangle;

public class CreatePPTXGroupShape02 {

 public static void main(String[] args) throws Exception {
     
  Object[][] data = new Object[][] {
   new Object[] {"Option1", 8.3, java.awt.Color.LIGHT_GRAY},
   new Object[] {"Option2", 38.3, java.awt.Color.LIGHT_GRAY},
   new Object[] {"Option3", 51.9, java.awt.Color.GREEN},
   new Object[] {"Option4", 1.3, java.awt.Color.LIGHT_GRAY}
  };

  SlideShow slideShow = new XMLSlideShow();

  Slide slide = slideShow.createSlide();
  
  int groupLeft = 100;
  int groupTop = 50;
  int groupWidth = 500;
  int groupHeight = 40;
  int groupPadding= 10;

  TextShape textShape;
  Rectangle rect;
  String text;
  Number value;
  AutoShape autoShape;
  java.awt.Color color;
  
  for (Object[] row : data) {
   GroupShape shapeGroup = slide.createGroup();
   shapeGroup.setInteriorAnchor(new Rectangle(groupLeft, groupTop, groupWidth, groupHeight));
   shapeGroup.setAnchor(new Rectangle(groupLeft+groupPadding, groupTop+groupPadding, groupWidth-groupPadding, groupHeight-groupPadding));
 
   int x = groupLeft;
   int y = groupTop;
   int width;
   int height = 40;
   
   text = (String)row[0];
   value = (Number)row[1];
   color = (java.awt.Color)row[2];

   // AutoShape = rounded rect bar  
   width = (int)Math.round(400d * value.doubleValue() / 100d);
   autoShape = shapeGroup.createAutoShape();
   rect = new Rectangle(x, y, width, height);
   autoShape.setAnchor(rect);
   autoShape.setShapeType(ShapeType.ROUND_RECT);
   autoShape.setFillColor(color);

   // TextBox = option text
   width = 400;
   textShape = shapeGroup.createTextBox();
   rect = new Rectangle(x, y, width, height);
   textShape.setAnchor(rect);
   textShape.setText(text);

   // TextBox = percentages
   x = groupLeft + 400;
   y = groupTop;
   width = 100;
   height = 40;

   textShape = shapeGroup.createTextBox();
   rect = new Rectangle(x, y, width, height);
   textShape.setAnchor(rect);
   text = String.valueOf(value);
   textShape.setText(text + " %");

   groupTop += 40;
  
  }

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

结果:

enter image description here

Java相关问答推荐

将@ManyToOne JPA Composite Key用作Id保存实体添加额外参数

Annotation @ Memphier无法正常工作,并表示:class需要一个bean,但找到了2个bean:

@从类文件中删除JsonProperty—Java

强制Mockito返回null而不是emtpy list

相同的Java SerializedLambda为implMethodKind返回不同的结果

如何在Java中从XML中获取特定的 node ,然后将其删除?

有没有办法让扩展变得多态?

无法在Java中处理PayPal支付响应

Arrays.hashcode(int[])为不同的元素提供相同的散列

Java ArrayList的整数和数组的泛型

为什么当我创建Robot对象时,JavaFX引发IlLegalStateException异常?

如何使用路径过渡方法使 node 绕圆旋转?

与IntArray相比,ArrayList<;Int>;对于大量元素的性能极差

是否有一个Java Future实现可以在池繁忙时在调用者线程中执行?

使用迭代器遍历HashMap不会因IF条件而停止

没有Tomcat,IntelliJ如何在本地运行API?

在Java中使用StorageReference将数据从Firebase存储添加到数组列表

设置背景时缺少Android编辑文本下划线

SonarQube在合并升级到java17后对旧代码提出错误

java 11上出现DateTimeParseException,但java 8上没有