XLSへの書き出し
では、書き出し処理に進みましょう。まずは、ストリーム関係のクラスを収めておく変数をそれぞれ用意しておきます。
FileOutputStream output = null;
BufferedOutputStream boutput = null;
POIでは、ファイルアクセスのためには通常のjava.ioに用意されているバイナリファイルアクセスと同じファイル関係のストリームを使います。ここでは、ファイルアクセス用のFileOutputStreamクラスと、バッファ機能を持つBufferedOutputStreamを用意しておくことにしました。
では、ファイル関係のストリームを用意しましょう。ここからは、ファイル関係の例外が発生する可能性があるのでtry内での処理となります。
output = new FileOutputStream(fname);
boutput = new BufferedOutputStream(output);
出力ストリーム関係を準備します。先ほどJFileChooserから取り出したFileインスタンスを使ってFileOutputStreamを作成し、これを使ってBufferedOutputStreamを作ります。これで出力のためのストリームは用意できました。
続いて、Excelのデータを作成していきます。Excelでは、データ類はワークブックと呼ばれる中にシートとして各ページごとのデータがまとめられていますね。これらを、Javaのオブジェクトとして作成していきます。これには、org.apache.poi.hssf.usermodelパッケージに用意されているクラスを使います。
HSSFWorkbook workbook = new HSSFWorkbook();
最初にワークブックのオブジェクトを作成します。これは「HSSFWorkbook」というクラスとして用意されています。newでインスタンスを作成し、そこにシートを追加していきます。
HSSFSheet sheet1 = workbook.createSheet();
workbook.setSheetName(0,"Sheet1");
シートは、「HSSFSheet」というクラスとして用意されています。これはHSSFWorkbookの「createSheet」メソッドで作成します。これでHSSFWorkbookに新たにシートが作成されます。
シートができたら、ここにデータを組み込んでいくことになります。シートのデータは、「HSSFRow」という行データと、「HSSFCell」というセルデータから構成されます。まず、シートに行データを作成し、その行データにセルデータを作成して値を設定する、といった形でデータの組み込みを行っていきます。
for(int i = 0;i < row_num;i++){
HSSFRow row = sheet1.createRow(i);
for(int j = 0;j < col_num;j++){
HSSFCell cell = row.createCell((short)j);
String val = (String)table.getModel().getValueAt(i,j);
cell.setCellValue(new HSSFRichTextString(val));
}
}
ここでは、二重の繰り返しを使ってデータの作成をしています。まず、最初の繰り返しの中で、HSSFSheetの「createRow」を呼び出して行データのHSSFRowをシートに作成します。そして第2の繰り返しで、HSSFRowの「createCell」を呼び出してセルデータのHSSFCellを行データに作成します。
行データとセルデータを作成するcreateRowとcreateCellでは、それぞれ作成する行とセルのインデックス番号を引数に指定するようになっています。こうすることで、シート全体の、特定の地点のデータだけを組み込んでいけるようになっているのですね。
セルができたら、JTableのgetModelからgetValueAtで値を取得し、これをHSSFCellの「setCellValue」でセルの値に設定します。このsetCellValueは、さまざまな値を設定できるように各種の引数がオーバーロードされています。が、注意しておきたいのはテキストを保存する場合です。
引数にStringを指定するsetCellValueも用意されてはいるのですが、これは現在、日推奨となっています。ではStringを保存する場合はどうするのか? これは、「HSSFRichTextString」という専用のリッチテキストのクラスを作成し、これを引数として渡すのがよいでしょう。
workbook.write(boutput);
一通りセルへの値の設定が終わったら、ワークシートをファイルに書き出します。これは、HSSFWorkbookの「write」メソッドを呼び出します。引数にOutputStreamを指定することで、そのストリームに出力を行います。ここでは、あらかじめ用意してあるBufferedOutputStream(FileStream)がありますから、これを引数に指定すれば、ファイルに保存できるというわけです。
最後に、BufferedOutputStreamをcloseして、すべて作業終了です。