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