XSSFWorkbook # write () приводит к пустому ответу - PullRequest
1 голос
/ 16 марта 2012

Я пытаюсь заставить мой JSF экспортировать электронную таблицу для загрузки.Я использую библиотеку POI Apache для написания документов в Excel.Я получаю следующую ошибку в окне предупреждения при запуске кода:

emptyResponse: An empty response was received from the server.

Ниже приведен метод генерации электронной таблицы и экспорта в OutputStream (для простоты я переименовал классы, методы и т. Д.).

private void generateSpreadsheet(Object object) throws Exception {
    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletResponse response = (HttpServletResponse)context.getExternalContext().getResponse();

    String fileName = object.getProperty() + ".xlsx";
    response.setContentType("application/vnd.ms-excel");
    response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName +"\"");
    OutputStream os = response.getOutputStream();

    Workbook wb = new XSSFWorkbook();
    Sheet sheet = wb.createSheet("Sheet 1");
    Row row = sheet.createRow(0);
    Cell cell = row.createCell(0);
    cell.setCellValue("test");
    wb.write(os);

    os.flush();
    os.close();
    FacesContext.getCurrentInstance().responseComplete();
}

Любой совет высоко ценится, спасибо.

1 Ответ

3 голосов
/ 16 марта 2012

Если это имеет значение, я использую AJAX (тег <f:ajax>) в форме отправки, которая вызывает этот метод.

Это определенно имеет значение. Вы можете не загружать файлы Ajax. Ajax выполняется кодом JavaScript. Но в JavaScript нет средств, чтобы вызвать диалог Сохранить как или запустить приложение платформы по умолчанию, связанное с типом mime файла (к счастью, это было бы серьезной проблемой безопасности / вторжения). Кроме того, JSF Ajax API ожидает, что XML-ответ в указанной структуре соответствует спецификациям JSF. Когда вместо этого вы отправляете полный файл Excel, весь ответ Ajax будет игнорироваться как непонятный мусор API JSF Ajax.

Вам необходимо отправить обычный синхронный запрос. Удалите тег <f:ajax> из командной ссылки / кнопки. Текущая страница в любом случае останется прежней, если загрузка отправлена ​​как attachment.

...