我开始认为我只是看不到明显的东西。
给定以下代码,我想从坐标[x1,y1]到[x2,y2]画一条线。
int x1 = 20;
int y1 = 10;
int x2 = 30;
int y2 = 5;
XSLFSlide pptSlide = ...
XSLFAutoShape shape = pptSlide.createAutoShape();
shape.setShapeType(ShapeType.LINE);
shape.setAnchor(x1, y1, <width>, <height>);
从中可以看到,线从[x1,y1]的锚点开始,但是随后我必须输入宽度和高度,而不是目标点的坐标。但是目标坐标的y分量小于起始坐标的y分量,因此我尝试将高度设置为负值,这会在PowerPoint尝试打开生成的PPTX文档时导致错误(“ PowerPoint发现内容存在问题文件out.pptx。”);
我敢肯定,我只是忽略了显而易见的解决方案,因此有人可以帮助我找出如何在文档中为一个点画线到另一点吗?
最佳答案
SetAnchor()
使用AWT Rectangle2D
,实际上它并不关心您的宽度或高度是否为负(尽管负高度的矩形毕竟不是真正的对象,对吗?)。但是POI不会以这种方式解释它,并且不幸的是,它不会抛出异常让您知道。
据我了解,您只需要在x1
和x2
,y1
和y2
之间选择较低的起始坐标,以使正的宽度和高度与所需的端点一致。
像这样:
// using Apache POI ooxml 3.17
static void drawBetweenTwoPoints(XSLFAutoShape shape, double x1, double x2, double y1, double y2) {
shape.setAnchor(new Rectangle2D.Double(
x1 <= x2 ? x1 : x2, // choose the lowest x value
y1 <= y2 ? y1 : y2, // choose the lowest y value
Math.abs(x2 - x1), // get the actual width
Math.abs(y2 - y1) // get the actual height
));
shape.setFlipVertical(y2 < y1); // lines are drawn from rectangle top-left to
// bottom right by default.
// When y2 is less than y1, flip the shape.
}
关于java - 使用Apache POI在PowerPoint幻灯片中的两点之间画一条线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46850603/