valid,invalid

関心を持てる事柄について

Apache POI XSSFClientAnchor でoffset を指定して画像を貼り付ける

初POI。
EXCEL(.xlsx)ファイルに画像を貼り付ける際の offset の指定に苦戦。

画像の位置指定は XSSFClientAnchor クラスを用いて行う。
設定方法は下記の2通りが可能。

1.create時に位置指定を行う。

XSSFClientAnchor anchor = XSSFDrawing.createAnchor(
dx1, dy1, dx2, dy2, col1, row1, col2, row2);

 

2.create後に位置指定を行う。

XSSFClientAnchor anchor = XSSFCreationHelper.createClientAnchor();
anchor.setDx1(dx1);
anchor.setDy1(dy1);
anchor.setDx2(dx2);
anchor.setDy2(dy2);
anchor.setCol1(col1);
anchor.setRow1(row1);
anchor.setCol2(col2);
anchor.setRow2(row2);


※XSSFDrawing クラスに引数無しのcreateAnchorメソッドは無い模様。

 

開始位置・終了位置の指定

XSSFAnchor.setCol , setRowでcolumn・rowをそれぞれ指定する。
注意点としては、指定したセルの最右下の座標から開始されること。

anchor.setCol1(1);
anchor.setRow1(1);
anchor.setCol2(4);
anchor.setRow2(4);
 
と指定すると

 

と出力される。

また、左辺と上辺は罫線上に描画され、右辺と下辺は罫線に重ならない。


オフセットの指定

XSSFClientAnchor#setDx1, setDy1, setDx2, setDy2 で指定する。
これら setter の引数はjavadocには

the x coordinate within the first cell.

とあり、int型の引数が要求されているが、ピクセルなのかポイントなのかわからない。

適当な数字を入れても挙動の法則がわからなかったので、
 
The offsets are measured in EMUs (english metric units). There are 12700 emus in a point , see EMU_PER_PIXEL and EMU_PER_POINT constants in the XSSFShape class. 

To position a rectange with given width and height at a point (x,y) 
you need to transform all coordinates to Excel coordinate system, i.e 

x1 --> col1 + dx1 
y1 --> row1 + dy1 
x2 --> col2 + dx2 
y2 --> row2 + dy2 

EMUという単位で指定する、とのこと。
この数字はXSSFShape クラスに定義されており、1ポイント=12700EMU、1ピクセル=9525となっている。

その為、setColやsetRowで指定した開始位置から10ピクセルのoffsetを作りたい時は

setDx1(XSSFShape.EMU_PER_PIXEL * 10);

とすれば良い模様。


指定するdx1, dy1, dx2, dy2 はそれぞれ下記のようにオフセットを構成する。




【環境】

POI 3.10
Java SE7

【参考】

apache poi の HSSFClientAnchor について。 - 人工無脳が作りたかった
POI - User - How to calculate location of the shape in Excel 2007?
POI - Dev - Re: Anchor type for images in Excel