初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