В таблице XSLFTable
есть два столбца: один с текстом, а другой с процентами, как показано на изображении ниже.
Хотя создание таблицы и данных довольно просто, как можно включить закругленную прямоугольную форму в каждую ячейку под текстом (в первом столбце), где ширина прямоугольной формы на самом деле представляет собой число из второй ячейки?
Вот код таблицы (в Kotlin
, но его легко преобразовать в Java
через IDEA):
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. Не могли бы вы рассказать подробнее: «Я бы сделал это, используя групповые фигуры, которые группируют два текстовых поля и прямоугольник для каждого варианта». ? Спасибо за быстрый ответ @Axel.
Невозможно включить фигуры в каждую ячейку под текстом в ячейке таблицы 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();
}
}
Результат:
Благодарим вас за быстрый ответ с полным рабочим кодом и объяснением @Axel. Я понимаю использование GroupShape
и его преимущества. Спасибо !
Как отрегулировать высоту GroupShape
, если количество символов больше и последовательность символов переходит к следующему варианту? Простая проверка количества символов не может быть очень надежным решением, поскольку это шрифт не фиксированной ширины. В случае таблицы вторая строка перемещается автоматически без перекрытия текста опции.
«Как можно включить прямоугольник с закругленными углами в каждую ячейку под текстом»: невозможно. Ячейка таблицы PowerPoint представляет собой только текстовую фигуру. Поэтому он может содержать только текст. У него может быть фон, но это не может быть форма, а только изображение. Как бы вы создали то, что вам нужно, с помощью графического интерфейса PowerPoint? Я бы сделал это, используя групповые фигуры, которые группируют два текстовых поля и прямоугольник для каждого параметра.