2017-10-20 96 views
0

我開始認爲我只是無法看清明顯。在使用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。「);

我很確定我只是忽略了這個明顯的解決方案,所以任何人都可以幫我找出如何在文檔中的一個點繪製一條線到另一個點?

回答

2

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. 
} 
+1

使用你的代碼的矩形開始在左上角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。 –

+0

好點。我現在已經實現了。謝謝! –

相關問題