6

<rich:dataTable>またはの内容をエクスポートしたいのですが、<rich:extendedDataTable>優れています。

  • PrimeFacesには「エクスポーター機能」があることがわかりましたhttp://www.primefaces.org/showcase/ui/exporter.jsf

  • PrimeFacesを使用せずに、richFaces(バージョン3.3.3)を使用して、これと同様のことを実行できるようにしたいと思います...(将来的にRichFaces 4に移行したいのですが、3.3でスタックしています.3今のところ)

  • http://poi.apache.org/を使用して独自のビルドを行うことは可能であると読みましたが 、このような実装をどこから始めればよいのかわかりません...

目的のエクスポートと例を実行するための最善の方法についての考えは大歓迎です!

4

2 に答える 2

10

JSFでPOIを使用することは、プレーンJavaでPOIを使用することと実際には違いはありません。各レコードを表すアイテムのコレクションを用意するだけです。このようなコレクションも取得するデータテーブルを使用しているため、すでにそれを持っている必要があります。POIでExcelシートを作成するには、まったく同じコレクションを繰り返す必要があります。

キックオフの例を次に示します。ここで、itemsList<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からファイルをダウンロードする方法も参照してください。

于 2012-11-02T16:50:08.490 に答える
-2

この機能も必要だったので、primefaces dataExporterコンポーネントを取得し、Richfacesで使用するように変更しました。また、テーブル内にcollapsibleSubTableをエクスポートする機能も追加しました。PrimefacesとRichfacesはオープンソースです。気軽に改善してください。ソースと例を含むパッケージ: バンドル

于 2014-09-19T13:35:47.067 に答える