在使用Apache POI的PowerPoint幻灯片中的两点之间绘制一条线
问题描述:
我开始认为我只是无法看清明显。在使用Apache POI的PowerPoint幻灯片中的两点之间绘制一条线
给出以下代码,我想绘制一条从坐标[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分量小于如果开始坐标,所以我试图将高度设置为负值,这导致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.
}
使用你的代码的矩形开始在左上角X,Y:20,5和右下X结尾,Y:30,10。该行按照默认设置从左上到右下。所以这条线是从x,y:20,5到x,y:30,10。在你的代码之后放置一个'shape.setFlipVertical(true);'。然后翻转的线是从左下到右上。所以这条线是根据需要从x,y:20,10到x,y:30,5。 –
好点。我现在已经实现了。谢谢! –