使用java servlet将excel文件发送到客户端
我正在使用Apache POI在Java 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
如果我从上面的代码中删除block1
或block2
然后它不会给出错误,但我想发送客户端Excel file
和我添加到request
对象的两个属性。
那么可以使用request.getRequestDispatcher
将Excel
文件发送到客户端吗? 或者有更好的方法吗?
任何建议将不胜感激。
EDIT1
我知道为什么我得到了IllegalStateException
,但后来我的问题是我应该如何向客户端发送ExcelFile
和Request Attributes
?
EDIT2
我想将Excel file
和Attributes
发送到客户端的原因是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页面。
- 将样式文本写入.docx文件
- java.lang.NoClassDefFoundError:org / openxmlformats / schemas / spreadsheetml / x2006 / main / CTWorkbook $ Factory
- 使用apache poi读取Excel文件时出现exception
- 如何使用POI读取word文档中每个单词的字体大小?
- 如何使用Apache POI操纵注释的内容
- 在XSSFRichTextString中忽略新行
- 替换Apache POI XWPF中的文本
- 缺少Apache POI Java的单元策略
- 使用Apache POI 4.0运行官方示例LineChars和ScatterChart时出现问题