我正在使用Apache POI在Java Servlet中生成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
如果我删除 block1
或block2
从上面的代码,它不会给出错误,但我想发送客户端 Excel file
以及我添加到 request
的两个属性对象。
所以可以发送Excel
使用 request.getRequestDispatcher
将文件发送给客户端?或者有更好的方法吗?
如有任何建议,我们将不胜感激。
编辑1
我知道为什么我得到 IllegalStateException
,但我的问题是我应该如何发送 ExcelFile
和Request Attributes
都给客户端?
编辑2
我想同时发送Excel file
的原因和Attributes
对客户来说是MyFile.jsp
有一个<div>
这将显示从 servlet
发送的消息.
<div style="background-color: aliceblue">
<h3>${Message}</h3>
</div>
编辑3
我想向客户端发送消息的原因是我正在发送此 Excel file
作为对Import Excel operation
的回应其中客户将提供 excel file
用于在数据库中插入数据,然后我突出显示 excel rows
由于重复或任何其他原因而无法插入。所以我想在 Message
中显示导入统计数据给客户并给他一份 Excel 文件的副本,其中突出显示了错误行。
最佳答案
您正在刷新您的响应
,然后尝试转发
。容器已经将响应
发送回客户端,现在陷入了如何将请求转发
到另一个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 - if the response was already committed.
编辑1后:
不,你不能两者兼而有之。你需要决定你想要什么。将字节写入响应并设置正确的 header 和 MIME 类型。您无法让浏览器下载某些内容并从同一响应中显示 JSP 页面。
关于java - 使用java servlet将excel文件发送到客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17491527/