Создание файла 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
за это.