【问题标题】:JSF exporting excel data from another pageJSF从另一个页面导出excel数据
【发布时间】:2012-04-28 14:45:19
【问题描述】:

我是 jsf 的新手,我正在设置一个基本的报告工具(sql 查询),它在主页中显示报告列表。我想在主页中放置一个 excel 导出命令按钮并导出用户选择的报告或将用户驱动到不同的执行页面以在所选报告的数据表中显示结果。我怎样才能做到这一点?当然,带有查询结果的数据表仅在执行页面中可见,并且是在查询执行期间动态创建的(这部分工作正常)。我会无缘无故发疯吗?提前感谢您的任何建议。

【问题讨论】:

  • 我正在使用 primefaces 3.2 和 dataexporter 组件,但如果它有助于解决问题,我愿意使用其他组件!谢谢

标签: jsf jsf-2 primefaces


【解决方案1】:

如果要将数据导出到 Excel,则需要使用第三方库。有免费的,如JExcelApiApache POI。此外,还有像Aspose 这样的商业库。如果您要选择开源库,请检查以下问题:Choosing an excel java api

当您将数据导出到 Excel 时,您必须创建 Excel 文件并为客户端下载内容。您可以通过@BalusC(JSF 专家)查看如何download a file using JSF

还有一个建议,当您下载文件时,不要将 ajax 功能添加到命令链接/按钮。

【讨论】:

  • 感谢@luiggi 的回答,我知道,我的问题与架构问题更相关:从与实际显示数据的页面不同的页面调用 excel 下载。昨天我找到了一个解决方法,我在第一页放置了一个未呈现的数据表,并根据需要填充它以供下载 excel。我不确定这是最干净的方法,但可以。
  • @jsfviky71 运行查询时,您使用数据表构建报告。为您的报告使用相同的数据而无需提出其他请求,您可以构建 Excel 文件并下载它。您可以按请求传递数据。恕我直言,也许您的问题是关于定义托管 bean 的范围。如果我错了,请纠正我
  • 嗨@luiggi,很抱歉回答迟了,不完全是,我的主要问题是第一页有excel按钮,另一页有数据表,执行页面仅用于数据显示目的,而主页显示报表列表,因此用户可以下载报表的 excel 版本,甚至不显示查询结果。
  • 所以我的“解决方案”是将会话 bean 作为 sql 引擎,在主页中放置一个视图 bean 用于报告列表,并在同一页面中放置一个假(未呈现)数据表来获取数据excel下载。在您看来,这是一种干净的方式吗?因为对我来说听起来很奇怪,谢谢你的时间
  • @jsfviky71 如果我是对的,您可以拥有一个检索报告的业务类(不一定是托管 bean)(对于包含不同参数的报告类型可能是 1 个业务类)。然后您调用方法getDataForReportA() 来获取报告数据并构建您的excel 文件或根据用户的选择向用户显示数据。这样,生成报表的逻辑就灵活、可维护,并且与表示层分离。
【解决方案2】:

您可以在代码下使用此代码块提供 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);
}

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-12
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多