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

标签 java jsp servlets apache-poi export-to-excel

我正在使用Apache POIJava 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

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

所以可以发送Excel使用 request.getRequestDispatcher 将文件发送给客户端?或者有更好的方法吗?

如有任何建议,我们将不胜感激。

编辑1
我知道为什么我得到 IllegalStateException ,但我的问题是我应该如何发送 ExcelFileRequest 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/

相关文章:

java - 使用 Java 开发多线程应用程序

java - 逆向工程图像裁剪和调整大小

java - 加载或实例化 TagLibraryValidator 失败

html - 页脚下方的大空白显示在 iPhone 实际设备的某些页面上,但在 Chrome 中的模拟器上不显示

java - 尝试嵌入 a-href 时出现 JSP 语法错误

java - 如何在 java 中创建自定义编译器警告?

java - 使用 Jersey 时未生成 JSON

jsp - 如何将变量设置为小数点后 2 位

java - 使用 Select 的 MySQL 和 JDBC PreparedStatement

java - servlet 响应何时提交或刷新?