Apache POIでExcelワークブックに画像を挿入してみる。

2018-02-07イントラマート

イントラマートにApache POIでExcelワークブックに画像を挿入する方法です。

イントラマートとは
株式会社NTTデータイントラマート社が開発・販売している、Webアプリケーションシステムのシステム共通基盤(統合型フレームワーク)で、国内の著名企業を中心に6,000社以上に導入されています。 イントラマートを導入することにより、Webシステム開発における短納期・低コスト・標準化推進・品質向上を実現できます。
詳しくはこちらをご覧ください。

Apache POIでExcelワークブックに画像を挿入してみる。

イントラマートのスクリプト開発で「Apache POI」を利用してExcelに画像を挿入します。

イントラマートIWP/AFW Ver.7.2では、標準で「Apache POI 3.2」が同梱されています。
また「Apache POI Version 3.8」への対応方法が
org.apache.poi_v3_8.* にpkg変更した「POI 3.8」を公開
にありますので、「Apache POI Version 3.8」で実行したい場合はそちらをご覧ください。

本記事は「Apache POI 3.2」を利用しています。

1.Excelワークブックの準備

Excelワークブックを準備します。

function init( request ){
    var    workbook = new Packages.org.apache.poi.hssf.usermodel.HSSFWorkbook() ;
    var    sheet = workbook.createSheet() ;
    var    patriarch ;

    sheet = workbook.createSheet() ;
    patriarch = sheet.createDrawingPatriarch() ;    //シートに画像オブジェクトを生成

ここまででExcelのワークブックにシートを作成し、画像挿入用のオブジェクトを
生成しています。

2.画像ファイルの読み込み

次に挿入する画像データを読み込みます。

    var    jpeg = new java.io.FileInputStream( "hello.jpg" ) ;
    var    bytes = new Packages.org.apache.commons.io.IOUtils.toByteArray( jpeg ) ;
    var    pictureIndex = workbook.addPicture(bytes,Packages.org.apache.poi.hssf.usermodel.HSSFWorkbook.PICTURE_TYPE_JPEG ) ;
    jpeg.close();

3.画像ファイルの設定

読み込んだ画像をExcel出力用にアンカーに設定します。

    var    anchor = new Packages.org.apache.poi.hssf.usermodel.HSSFClientAnchor( 0, 0, 0, 0, 1, 3, 2, 5 ) ;
    anchor.setAnchorType( 0 ) ;    // 0 = Move and size with Cells.
    var    picture = patriarch.createPicture( anchor, pictureIndex ) ;
    workbook.write( new java.io.FileOutputStream( "image.xls" )) ;

4.Excelワークブックへの書き込み

Excelワークブックへ書き込みます。

    workbook.write( new java.io.FileOutputStream( "image.xls" )) ;

5.Excelワークブック転送

作成したExcelワークブックをブラウザーへ転送します。

    var strXlsFileName =  Client.identifier() + ".xls" , outputStream , strFileData , exfile ;
    var local_file = new Packages.jp.co.intra_mart.foundation.service.client.file.NetworkFile(strXlsFileName);
    if(local_file.exists()){ local_file.remove(); }
    var	 baos = new java.io.ByteArrayOutputStream();
    workbook.write(baos); local_file.save(baos.toByteArray());

    var exfile = new VirtualFile( strXlsFileName ) ;
    strFileData = exfile.load() ;
    exfile.remove() ;
    Module.download.send( strFileData, "insert_jpgfile.xls", "application/vnd.ms-excel" ) ;
}

これで読み込んだ画像が挿入されたExcelワークブックがブラウザーに転送されます。

以下がソースのすべてです。

function init( request ){
    var    workbook = new Packages.org.apache.poi.hssf.usermodel.HSSFWorkbook() ;
    var    sheet = workbook.createSheet() ;
    var    patriarch ;

    sheet = workbook.createSheet() ;
    patriarch = sheet.createDrawingPatriarch() ;

    var    jpeg = new java.io.FileInputStream( "hello.jpg" ) ;
    var    bytes = new Packages.org.apache.commons.io.IOUtils.toByteArray( jpeg ) ;
    var    pictureIndex = workbook.addPicture(bytes,Packages.org.apache.poi.hssf.usermodel.HSSFWorkbook.PICTURE_TYPE_JPEG ) ;
    jpeg.close();
    var    anchor = new Packages.org.apache.poi.hssf.usermodel.HSSFClientAnchor( 0, 0, 0, 0, 1, 3, 2, 5 ) ;
    anchor.setAnchorType( 0 ) ;    // 0 = Move and size with Cells.
    var    picture = patriarch.createPicture( anchor, pictureIndex );
    workbook.write( new java.io.FileOutputStream( "image.xls" )) ;

    var strXlsFileName =  Client.identifier() + ".xls" , outputStream , strFileData , exfile ;
    var local_file = new Packages.jp.co.intra_mart.foundation.service.client.file.NetworkFile(strXlsFileName);
    if(local_file.exists()){ local_file.remove(); }
    var	 baos = new java.io.ByteArrayOutputStream();
    workbook.write(baos); local_file.save(baos.toByteArray());

    var exfile = new VirtualFile( strXlsFileName ) ;
    strFileData = exfile.load() ;
    exfile.remove() ;
    Module.download.send( strFileData, "insert_jpgfile.xls", "application/vnd.ms-excel" ) ;
}
株式会社システムトラスト

イントラマートの導入・開発についてなど気軽にご相談ください。

お問合せ