Apache POIでExcelワークブックに画像を挿入してみる。
イントラマートに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" ) ; }