1

私は jsf を初めて使用し、ホームページにレポートのリストを表示する基本的なレポート ツール (SQL クエリ) をセットアップしています。ホームページに Excel エクスポート コマンドボタンを配置し、ユーザーが選択したレポートをエクスポートするか、ユーザーを別の実行ページに移動して、選択したレポートのデータ テーブルに結果を表示したいと考えています。どうすればそれを達成できますか?もちろん、クエリ結果を含むデータテーブルは実行ページにのみ表示され、クエリの実行中に動的に作成されます (この部分は正常に機能します)。私は何のために狂っていますか?ご提案いただきありがとうございます。

4

2 に答える 2

0

データを Excel にエクスポートする場合は、サード パーティのライブラリを使用する必要があります。JExcelApiApache POIなどの無料のものがあります。また、Asposeのような商用ライブラリもあります。オープン ソース ライブラリを選択する場合は、次の質問を確認してください

データを Excel にエクスポートする場合、Excel ファイルを作成し、クライアントのコンテンツをダウンロードする必要があります。@BalusC (JSF エキスパート) によるJSF を使用したファイルのダウンロード方法を確認できます。

ファイルをダウンロードするときは、コマンド リンク/ボタンに ajax 機能を追加しないでください。

于 2012-04-29T10:43:51.627 に答える
0

コードの下でこのコード ブロックを使用して、一般的な方法で Excel エクスポートを提供できます。任意のリストを送信し、任意のファイル名を送信できます

パブリック クラス ExcelUtils {

public static <T> void writeToExcel(String fileName, List<T> data) {

    FacesContext context = FacesContext.getCurrentInstance();

    HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();

    response.setContentType("application/vnd.ms-excel");
    response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xls");
    response.setHeader("Pragma", "no-cache");

    OutputStream fos = null;
    try {
        fos = response.getOutputStream();
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
    XSSFWorkbook workbook = null;
    try {
        // File file = new File(fileName);
        workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet();
        List<String> fieldNames = getFieldNamesForClass(data.get(0).getClass());
        int rowCount = 0;
        int columnCount = 0;
        Row row = sheet.createRow(rowCount++);
        for (String fieldName : fieldNames) {
            if (!fieldName.equals("serialVersionUID")) {
                Cell cell = row.createCell(columnCount++);
                cell.setCellValue(fieldName);
            }
        }
        Class<? extends Object> classz = data.get(0).getClass();
        for (T t : data) {
            row = sheet.createRow(rowCount++);
            columnCount = 0;
            for (String fieldName : fieldNames) {
                if (!fieldName.equals("serialVersionUID")) {
                    Cell cell = row.createCell(columnCount);
                    Method method = null;
                    try {
                        method = classz.getMethod("get" + capitalize(fieldName));
                    } catch (NoSuchMethodException nme) {
                        method = classz.getMethod("get" + fieldName);
                    }

                    Object value = method.invoke(t, (Object[]) null);
                    if (value != null) {
                        if (value instanceof String) {
                            cell.setCellValue((String) value);
                        } else if (value instanceof Long) {
                            cell.setCellValue((Long) value);
                        } else if (value instanceof Integer) {
                            cell.setCellValue((Integer) value);
                        } else if (value instanceof Double) {
                            cell.setCellValue((Double) value);
                        }
                    }
                    columnCount++;
                }
            }
        }
        workbook.write(fos);
        fos.flush();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (fos != null) {
                fos.close();
                context.responseComplete();
                context.renderResponse();
            }
        } catch (IOException e) {
        }
        try {
            if (workbook != null) {
                workbook.close();
            }
        } catch (IOException e) {
        }
    }
}

// retrieve field names from a POJO class
private static List<String> getFieldNamesForClass(Class<?> clazz) throws Exception {
    List<String> fieldNames = new ArrayList<String>();
    Field[] fields = clazz.getDeclaredFields();
    for (int i = 0; i < fields.length; i++) {
        fieldNames.add(fields[i].getName());
    }
    return fieldNames;
}

// capitalize the first letter of the field name for retriving value of the
// field later
private static String capitalize(String s) {
    if (s.length() == 0)
        return s;
    return s.substring(0, 1).toUpperCase() + s.substring(1);
}

}

于 2019-08-05T11:51:01.740 に答える