No Programming, No Life

プログラミング関連の話題や雑記

POIのHSSFを使ってExcelに画像を挿入

POIのHSSFを使って画像を挿入したExcelファイルを作りたいって要望があったんで、用意したJpeg画像をExcelに挿入するテストを行ってみました。ネットとかで軽く探してみると、POIは画像挿入できないよ的な情報が多かったもので出来るのか不安だったが、出来たんで良しとしよう。コーディングは例によって練習も兼ねてGroovyで。*1

以下、ソースです。*2
import org.apache.poi.util.*
import org.apache.poi.hssf.usermodel.*

/* ブック作成 */
def book = new HSSFWorkbook()
/* シート作成 */
def sheet = book.createSheet("画像挿入テスト")
/* 画像をストリームで読み込む */
def bytes = IOUtils.toByteArray(new FileInputStream("./image/fumo.jpg"))
def pictureIdx = book.addPicture(bytes, HSSFWorkbook.PICTURE_TYPE_JPEG)
/* 描画オブジェクト生成(一回のみ実行する) */
def patriarch = sheet.createDrawingPatriarch()
/* アンカーの生成 */
def anchor = new HSSFClientAnchor()
// 0 = Move and size with Cells.
// 2 = Move but don't size with cells.
// 3 = Don't move or size with cells.
anchor.setAnchorType(0) // ここではセルにあわせて移動&リサイズを選択
/*
 * 余白微調整?
 *   このsetD〜を指定しないとセルにぴったりくっついた感じになる
 */
anchor.setDx1(100)
anchor.setDy1(100)
anchor.setDx2(-100)
anchor.setDy2(-100)
/*
 * 画像の左上がセル(0,0)の左上〜
 *       右下がセル(10,3)の左上(=セル(9,2)の右下)
 */
anchor.setRow1(0)
anchor.setCol1(0 as short)
anchor.setRow2(10)
anchor.setCol2(3 as short)
/* partiachに画像を設定 */
patriarch.createPicture(anchor, pictureIdx)

/* ファイル出力 */
book.write(new FileOutputStream("./excel/insert_image.xls"))

んまあ、画像はバイナリファイルなんでバイト配列(byte[])で読み込んで追加するだけですね、大筋は。HSSFWorkbook.PICTURE_TYPE_JPEGのところで今回はJpeg画像を読み込むよ〜って指定しています。
ここで注意として、sheet.createDrawingPatriarch()は一回だけ行えばいいみたいです([[参考)。描画領域を定義する?みたいなイメージかな?
あと、anchor.setDx1(100)などは余白をつけられるみたいです。*3

出来上がったExcelファイル

f:id:fumokmm:20081122154405j:image

*1:ほぼJavaと同じなんてJavaに転用も簡単ですね

*2:動作環境 jre1.6.0_07, groovy-all-1.5.6.jar. poi-3.2-FINAL-20081019.jar

*3:Javadocちゃんと読んでないんでよくわかってないけど。