セルコメントと画像
同じように「XSSFDrawing」を利用して操作できるオブジェクトに「セルコメント」や「画像」があります。セルコメントの扱いは、テキストボックスを利用するのに似ています。POIがサポートする画像の種類は現状では「PNG」「JPG」「DIB」です。
「XSSFDrawing」を利用したパターンを習得してしまうために、Apache提供のサンプルプログラムから一部抜粋・変更したものでセルコメントと画像の操作方法も確認しましょう。
Workbook wb = new XSSFWorkbook();
CreationHelper createHelper = wb.getCreationHelper();
Sheet sheet = wb.createSheet();
Cell cell1 = sheet.createRow(3).createCell(5);
cell1.setCellValue("F4");
// (1)セルコメントオブジェクトを生成
Drawing patriarch = sheet.createDrawingPatriarch();
ClientAnchor anchor = createHelper.createClientAnchor();
Comment comment = patriarch.createCellComment(anchor);
// (2)コメント情報を設定後、セルにセルコメントオブジェクトを設定
RichTextString message = createHelper.createRichTextString("Hello, World!");
comment.setString(message);
comment.setAuthor("Apach POI");
cell1.setCellComment(comment);
- ソース5 -(1)
- ソース5 -(2)
SSパッケージの「Drawing」インターフェースにワークシートオブジェクトから生成した「XSSFDrawing」を代入しています。SSパッケージのClientAnchorインターフェースにCreationHelperインターフェースを利用して位置情報を管理する「XSSFClientAnchor」オブジェクトを代入しています。引数なしで生成した場合、位置情報の項目はすべてデフォルト値の0になります。最後に位置情報を渡して、「XSSFDrawing」のセルコメント生成メソッドを利用してセルコメントオブジェクトが取得できます。
セルコメントにコメントとコメント作者情報を設定後、セルコメントをセルに挿入しています。
Workbook wb = new XSSFWorkbook();
CreationHelper createHelper = wb.getCreationHelper();
// (1)ワークブックに画像を追加
InputStream is = new FileInputStream(args[0]);
byte[] bytes = IOUtils.toByteArray(is);
is.close();
int pictureIdx = wb.addPicture(bytes, Workbook.PICTURE_TYPE_PNG);
Sheet sheet = wb.createSheet();
// (2)指定した位置に画像を配置
Drawing patriarch = sheet.createDrawingPatriarch();
ClientAnchor anchor = createHelper.createClientAnchor();
anchor.setCol1(1);
anchor.setRow1(1);
Picture picture = patriarch.createPicture(anchor, pictureIdx);
// (3)画像サイズを1.2倍に拡大
picture.resize(1.2);
FileOutputStream fileOut = new FileOutputStream(file);
wb.write(fileOut);
fileOut.close();
- ソース6 -(1)
- ソース6 -(2)
- ソース6 -(3)
ワークブックオブジェクトのaddPictureメソッドを利用してバイト配列に変換した画像データを、フォーマット(サンプルではPNG)の指定をしてワークブックに追加します。戻り値は追加した画像を指すインデックスで0から始まる整数です。
位置情報と利用したい画像を指すインデックスを渡して、「XSSFDrawing」の画像生成メソッドを利用して画像オブジェクトが取得できます。
オリジナルの画像のサイズを変更するメソッドresizeを利用しています。0.5を指定すればオリジナル画像の半分のサイズ、引数なしまたは1.0を指定すればオリジナルのサイズのままです。ただし、このメソッドが有効であるのはデフォルトのフォントサイズを利用している場合という制限があります。
Apache POIのロゴを表示した実行結果を参考に掲載しておきます。
まとめ
今回はUsermodel APIの中から名前の定義、計算式、図形と画像の利用方法を解説しました。名前の定義を利用した計算式はプログラムの可読性が上がるので積極的に利用してみてください。POIでの図形や画像の操作はHSSFコンポーネントを利用した経験がある方でも、あまりなじみがなかったかもしれません。ぜひこれを機会に試してみてください。これら以外にも紹介したかったAPIは数多くあるのですが、Usermodel APIの利用方法に焦点を当てた基礎編はここまでとします。次回はこれまでの基礎知識を土台にして、POIを利用した帳票作りに挑戦してみたいと思います。

