JSFでPOIを使用することは、プレーンJavaでPOIを使用することと実際には違いはありません。各レコードを表すアイテムのコレクションを用意するだけです。このようなコレクションも取得するデータテーブルを使用しているため、すでにそれを持っている必要があります。POIでExcelシートを作成するには、まったく同じコレクションを繰り返す必要があります。
キックオフの例を次に示します。ここで、items
はList<Item>
データテーブルでも使用しています。
Workbook workbook = new HSSFWorkbook();
Sheet sheet = workbook.createSheet("sheet title");
int rowIndex = 0;
for (Item item : items) {
Row row = sheet.createRow(rowIndex++);
int columnIndex = 0;
row.createCell(columnIndex++).setCellValue(item.getId());
row.createCell(columnIndex++).setCellValue(item.getName());
row.createCell(columnIndex++).setCellValue(item.getValue());
// ...
}
workbook.write(someOutputStream); // Write the Excel result to some output.
ExternalContext#getResponseOutputStream()
これをJSF応答へのダウンロードとして提供するには、 asを提供する必要がありますsomeOutputStream
。また、応答コンテンツタイプ(ブラウザーがそれに関連付けるアプリケーションを認識できるようにするため)と応答コンテンツ処理(添付ファイルとして開かれ、有効なファイル名を持つようにするため)を設定する必要があります。
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext externalContext = context.getExternalContext();
externalContext.responseReset();
externalContext.setResponseContentType("application/vnd.ms-excel");
externalContext.setResponseHeader("Content-Disposition", "attachment;filename=export.xls");
workbook.write(externalContext.getResponseOutputStream());
context.responseComplete(); // Prevent JSF from performing navigation.
最後に、FacesContext#responseComplete()
JSFがデフォルトのナビゲーションタスクを実行しないようにするために呼び出す必要があります(これは、ナビゲートされたページのHTML出力を最後に追加することによってのみExcelファイルを破損します)。
上記のJSFの例は、JSF2.xを想定していることに注意してください。ExternalContext
いくつかの便利なデリゲートメソッドがないJSF1.xを実際に使用している場合は、rawHttpServletResponse
を取得しExternalContext#getResponse()
て、アクションを実行する必要があります。JSFバッキングBeanからファイルをダウンロードする方法も参照してください。