gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:20:16 26 4
gpt4 key购买 nike

我正在使用 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 文件发送到客户端,但给了我异常:

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 文件的副本,其中突出显示了错误行。

最佳答案

您正在刷新您的响应,然后尝试转发。容器已经将 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 - if the response was already committed.

EDIT1 之后:

不,你不能两者兼顾。你需要决定你想要什么。将字节写入响应设置正确的 HEADERS 和 MIME-TYPE。您无法让浏览器下载某些内容并显示来自同一响应的 JSP 页面。

关于java - 使用 java servlet 将 excel 文件发送到客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17491527/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com