使用java servlet将excel文件发送到客户端

我正在使用Apache POIJava Servlets中生成Excel文件。

getExcel()函数返回我要发送给客户端的HSSFWorkbook

 HSSFWorkbook wb = getExcel(); 

这是我到目前为止所尝试的。

 //block1 ByteArrayOutputStream outByteStream = new ByteArrayOutputStream(); wb.write(outByteStream); byte [] outArray = outByteStream.toByteArray(); response.setContentType("application/ms-excel"); response.setContentLength(outArray.length); response.setHeader("Expires:", "0"); response.setHeader("Content-Disposition", "attachment; filename=Demo1.xls"); OutputStream outStream = response.getOutputStream(); outStream.write(outArray); outStream.flush(); //block2 request.setAttribute("Message", str1); request.setAttribute("MessageDetails", str2); request.getRequestDispatcher("/MyFile.jsp").forward(request, response); 

上面的代码将excel文件发送到客户端,但是给了我exception:

 java.lang.IllegalStateException: Cannot forward after response has been committed 

如果我从上面的代码中删除block1block2然后它不会给出错误,但我想发送客户端Excel file和我添加到request对象的两个属性。

那么可以使用request.getRequestDispatcherExcel文件发送到客户端吗? 或者有更好的方法吗?

任何建议将不胜感激。

EDIT1
我知道为什么我得到了IllegalStateException ,但后来我的问题是我应该如何向客户端发送ExcelFileRequest Attributes

EDIT2
我想将Excel fileAttributes发送到客户端的原因是MyFile.jsp有一个

,它将显示从servlet发送的消息。

 

${Message}

EDIT3
我想向客户端发送消息的原因是我发送此Excel file作为对Import Excel operation的响应,其中客户端将提供excel file以在数据库中插入数据,然后我突出显示无法插入的excel rows由于重复或任何其他原因。 因此,我想在Message向客户端显示Import statistics,并为其提供excel文件的副本,并突出显示错误行。

你正在冲洗你的response然后试图forward 。 Container已经将response发送回客户端,现在处于如何将请求forward到另一个JSP的两难境地,因此它会在抛出exception的过程中中止操作。 HTTP是请求 – 响应模型。 一旦您提出要求 ,您就会收到回复 。 但是一旦响应已经提交,整个事务就结束了。

 outStream.write(outArray); // you already committed the response here by flushing the output stream outStream.flush(); //block2 request.setAttribute("Message", str1); request.setAttribute("MessageDetails", str2); // this is illegal after you have already flushed the response request.getRequestDispatcher("/MyFile.jsp").forward(request, response); 

根据Javadoc :

IllegalStateException – 如果响应已提交。

在EDIT1之后:

不,你不能两者都做。 你需要决定你想要什么。 将字节写入响应设置正确的HEADERS和MIME-TYPE。 您无法从浏览器下载内容以及从同一响应中显示JSP页面。