Создание файла Xls с использованием JSP

Мне нужно создать файл XLS из JSP.

это код для генерации xls.

 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
 java.io.File fn=new java.io.File(this.getServletContext().getRealPath("/")+"BillSummaryReport.xls");
 if(!fn.exists()){
 fn.createNewFile();
 }
System.out.println(this.getServletContext().getRealPath("/")+"BillSummaryReport.xls");
//FileOutputStream fileOut = new FileOutputStream(f);
java.io.FileInputStream fin = new java.io.FileInputStream(fn);
ServletOutputStream outStream =response.getOutputStream();
hwb.write(response.getOutputStream());
response.setHeader("Content-Disposition","attachment;filename=BillSummaryReport.xls");
byte[] buffer = new byte[1024];
int n = 0;
while ((n = fin.read(buffer)) != -1) {  
outStream.write(buffer, 0, n);
System.out.println(buffer);}
outStream.flush();
fin.close();
outStream.close();
} catch( Exception ex ) {
System.out.println(ex);
}

Ошибка возникает так, когда я пытаюсь запустить приложение.

    >Sep 19, 2014 11:45:28 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [jsp] in context with path [/Midrest] threw exception   [java.lang.IllegalStateException: getOutputStream() has already been called for this response] with root cause
java.lang.IllegalStateException: getOutputStream() has already been called for this response
    at org.apache.catalina.connector.Response.getWriter(Response.java:636)
    at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:213)
    at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
    at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
    at org.apache.jasper.runtime.PageContextImpl.release(PageContextImpl.java:194)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

1 ответ

Вы не можете использовать файл jsp, который содержит (записывает) текст в выходные данные для отправки файла обратно (например, xls). JSP-файлы (которые скомпилированы в сервлеты) будут пытаться записать в вывод, используя response.getWriter(),

Так как ты звонил response.getOutputStream() чтобы отправить файл, файл jsp (сервлет) пытается вызвать response.getWriter() записать данные HTML не удастся, потому что только один из этих 2 методов (getOutputStream() а также getWriter()) может быть использован.

Если вы хотите отправить обратно файл, используйте простой Servlet для этого, а не файл JSP. Или, если необходимо, вы можете использовать jsp для этого, но тогда вы не можете ничего написать в вывод, даже разрыв строки. Так что лучше всего использовать Servlet за это.

Другие вопросы по тегам