当前位置: 首页 > 面试题库 >

导出到Excel JSF和PrimeFaces

伯丁雷
2023-03-14
问题内容

使用JDK 1.6,JSF 2.1,PrimeFaces 2.2.1,POI 3.2和Apache Tomcat 7

我正在尝试设置一个servlet,以允许根据用户选择下载excel文件。excel文档是在运行时创建的。

没有错误,代码确实进入了servlet。

我单击按钮,没有任何反应。我没有使用PrimeFaces使用的数据表导出,因为我需要对Excel文档中的数据进行重新排序和自定义格式。

ExportExcelReports.java

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {       
    response.setContentType("application/vnd.ms-excel");
    response.setHeader("Content-Disposition", "attachment; filename=\"my.xls\"");

    HSSFWorkbook workbook = new HSSFWorkbook();

    HSSFSheet sheet = workbook.createSheet();
    HSSFRow row = sheet.createRow(0);
    HSSFCell cell = row.createCell(0);
    cell.setCellValue(0.0);

    FileOutputStream out = new FileOutputStream("my.xls");
    workbook.write(out);
    out.close();
}

ProjectReportBean.java

public void getReportData() {
    try {
        FacesContext ctx = FacesContext.getCurrentInstance();
        ExternalContext ectx = ctx.getExternalContext();
        HttpServletRequest request = (HttpServletRequest) ectx.getRequest();
        HttpServletResponse response = (HttpServletResponse) ectx.getResponse();
        RequestDispatcher dispatcher = request.getRequestDispatcher("/ExportExcelReports");
        dispatcher.forward(request, response);
        ctx.responseComplete();
    } catch (Exception e) {}
}

index.xhtml

<h:form id="reportsForm">
    <h:outputLabel for="report" value="Reports" /><br />
    <h:selectOneMenu id="report" value="#{projectReportBean.selectedReport}" required="true" requiredMessage="Select Report">
        <f:selectItem itemLabel="---" noSelectionOption="true" />
        <f:selectItems value="#{projectReportBean.reports}" />
    </h:selectOneMenu>

    <p:commandButton action="#{projectReportBean.getReportData}" value="Export" update="revgrid" />                      
</h:form>

问题答案:

有两个问题。

第一个问题是<p:commandButton>默认情况下发送的Ajax请求。此请求由JavaScript代码触发。但是,JavaScript无法对包含文件下载的响应进行任何操作。由于安全限制,JavaScript无法生成“
另存为” 对话框或其他内容。该响应基本上被完全忽略。

您需要添加ajax="false"<p:commandButton>关闭Ajax,以便该按钮触发正常的同步HTTP请求,或者您需要将其替换为standard
<h:commandButton>

<p:commandButton ajax="false" ... />

要么

<h:commandButton ... />

第二个问题是您的servlet根本不将Excel文件写入响应,而是写入存储在服务器工作目录中的本地文件。基本上,HTTP响应不包含 任何内容
。您需要传递HttpServletResponse#getOutputStream()给该WorkBook#write()方法。

workbook.write(response.getOutputStream());

毫无关系,我想知道servlet在这里有什么用。您是否想在JSF之外重用它?如果不是这样,您根本不必调度到servlet,而只需在bean的action方法中执行相同的代码即可。空catch块也不是很好。我只是将其声明为throwsin方法或至少将其重新抛出为new FacesException(e)

*根据您似乎对servlet完全不感兴趣的注释进行 *更新 。这是一个小小的重写,说明了如何使用JSF操作方法以编程方式发送Excel文件。

public void getReportData() throws IOException {
    HSSFWorkbook workbook = new HSSFWorkbook();
    HSSFSheet sheet = workbook.createSheet();
    HSSFRow row = sheet.createRow(0);
    HSSFCell cell = row.createCell(0);
    cell.setCellValue(0.0);

    FacesContext facesContext = FacesContext.getCurrentInstance();
    ExternalContext externalContext = facesContext.getExternalContext();
    externalContext.setResponseContentType("application/vnd.ms-excel");
    externalContext.setResponseHeader("Content-Disposition", "attachment; filename=\"my.xls\"");

    workbook.write(externalContext.getResponseOutputStream());
    facesContext.responseComplete();
}


 类似资料:
  • 导出(export)和导入(import)指令有几种语法变体。 在上一节,我们看到了一个简单的用法,现在让我们来探索更多示例吧。 在声明前导出 我们可以通过在声明之前放置 export 来标记任意声明为导出,无论声明的是变量,函数还是类都可以。 例如,这里的所有导出均有效: // 导出数组 export let months = ['Jan', 'Feb', 'Mar','Apr', 'Aug',

  • 导出和导入容器 导出容器 如果要导出本地某个容器,可以使用 docker export 命令。 $ docker container ls -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NA

  • 我有一个表格数据,我需要在不使用任何外部插件或API的情况下导出到csv。我使用了

  • 我点击一个文件,选择->Export->runnable JAR文件。问题是有些项目(和类)没有出现在“启动配置”中,即使它们包含一个主类,这意味着我不能导出它们。我该怎么办?

  • 我正在写一些Javascript代码。我创建了一个js文件,其中包含我的导出。然而,当我将它导入到另一个js文件中时,我得到一个错误,它说

  • 问题内容: 我已经找到了将HTML表导出到Excel的方法,但是在将JavaScript表导出从网站导出到excel时遇到了问题。请帮助我找到一种方法,将此表导出到Excel。 页面,从那里我需要信息: www.jalgpall.ee/players.php?year=2012&team=84&player=28469&b=ML 此页面javascript表函数的示例: 问题答案: 我自己找到了答