Export to Excel JSF and PrimeFaces

There are two problems.

The first problem is that the <p:commandButton> sends by default an Ajax request. This request is fired by JavaScript code. However, JavaScript can’t do anything with a response which contains a file download. Due to security restrictions JavaScript can’t spawn a Save As dialogue or something. The response is basically totally ignored.

You need to add ajax="false" to <p:commandButton> to turn ajax off so that the button fires a normal synchronous HTTP request, or you need to replace it by standard <h:commandButton>.

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

or

<h:commandButton ... />

The second problem is that your servlet doesn’t write the Excel file to the response at all, but instead to a local file which is stored in server’s working directory. Basically, the HTTP response contains nothing. You need to pass HttpServletResponse#getOutputStream() to the WorkBook#write() method.

workbook.write(response.getOutputStream());

On an unrelated note, I wonder how the servlet is useful here. Do you want to reuse it outside JSF? If not, you don’t necessarily need to dispatch to the servlet at all, but just execute the same code in bean’s action method. That empty catch block is also not nice. I’d just declare it as throws in method or at least rethrow it as new FacesException(e).


Update as per the comments you seem not be interested in the servlet at all. Here’s a minor rewrite how you could send the Excel file programmatically in a JSF action method.

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();
}

Leave a Comment