在使用Apache POI的PowerPoint幻灯片中的两点之间绘制一条线

2019年10月26日 72点热度 0条评论 来源: perdian

我开始认为我只是无法看清明显。在使用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并不以这种方式解释,但不幸的是,并没有抛出异常让你知道。

据我了解您的情况,您只需要选择x1x2y1y2之间的较低的起始坐标,这样一个积极的宽度和高度认同你期望的终点。

事情是这样的:

// 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. 
} 
    原文作者:perdian
    原文地址: https://stackoverflow.com/q/46850603
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。