2017-10-20 4 views
0

私は明らかに見えないと思っています。Apache POIを使用してPowerPointスライド内の2つの点の間に線を描く

与えられたコードでは、座標[x1、y1]から[x2、y2]まで線を描きたいと思います。私は[X1、Y1]のアンカーでを開始しますが、その後、私は目標点の座標の代わりに、幅と高さを入力する必要がラインを見ることができるものから、

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>); 

。しかし、ターゲット座標のy成分が開始座標よりも小さいので、PowerPointが生成されたPPTXドキュメントを開こうとするとエラーが発生するような高さを負の値に設定しようとしました( "PowerPointがコンテンツに問題が見つかりましたファイル内で.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

良い点。私は今それを実装しました。ありがとう! –

関連する問題