Java 从servlet响应下载excel工作表

Java 从servlet响应下载excel工作表,java,servlets,Java,Servlets,我正在尝试从servlet响应下载excel工作表 当我单击向服务器发送返回excel工作表请求的链接时,会打开“另存为”对话框,请求保存excel工作表。这是预期的行为 但在这两者之间,如果我尝试使用IE6或更低版本,它会在点击链接后打开一个新窗口。然后打开“另存为”对话框 其他操作按预期运行,但问题是,新窗口显示消息“无法打开页面” 有没有办法,我可以避免打开这扇新窗户 我希望“保存/另存为”对话框直接出现在单击链接的同一窗口中。我已经看到新窗口打开了很多次,但其中从未出现错误 尝试在IFr

我正在尝试从servlet响应下载excel工作表

当我单击向服务器发送返回excel工作表请求的链接时,会打开“另存为”对话框,请求保存excel工作表。这是预期的行为

但在这两者之间,如果我尝试使用IE6或更低版本,它会在点击链接后打开一个新窗口。然后打开“另存为”对话框

其他操作按预期运行,但问题是,新窗口显示消息“无法打开页面”

有没有办法,我可以避免打开这扇新窗户


我希望“保存/另存为”对话框直接出现在单击链接的同一窗口中。

我已经看到新窗口打开了很多次,但其中从未出现错误

尝试在IFrame中启动下载。如果下载本身仍然触发,则可能有助于隐藏错误消息。最好弄清楚显示错误的原因并停止它,但如果失败,您至少可以向用户隐藏它


虽然我以前见过IE在IFrames中做过一些奇怪的错误处理(偶尔会出现framebust),但我认为这只与非标准协议处理程序有关,而不是HTTP错误。

如果您想从servlet(或实际上任何web应用程序)发送响应并将其视为下载,您可以通过提供正确的内容配置(甚至可以指定独立于URI的文件名):

HttpServletResponse res=。。。 /* *设置标题 */ res.setContentType(“application/vnd.ms excel”); res.setHeader(“内容处置”,“附件;文件名=我的工作簿.xls”); /* *将下载内容传递给响应 */ 试一试{ OutputStream out=res.getOutputStream(); InputStream in=this.download.getInputStream(); 字节[]缓冲区=新字节[res.getBufferSize()]; int available=in.read(缓冲区); 而(可用>0){ out.write(缓冲区,0,可用); 可用=in.read(缓冲区); } in.close(); out.flush(); out.close(); }捕获(IOE异常){ //处理异常 } HttpServletResponse res = ... /* * set headers */ res.setContentType("application/vnd.ms-excel"); res.setHeader("Content-Disposition", "attached; filename=my-workbook.xls"); /* * pass the download to the response */ try { OutputStream out = res.getOutputStream(); InputStream in = this.download.getInputStream(); byte[] buffer = new byte[res.getBufferSize()]; int available = in.read(buffer); while (available > 0) { out.write(buffer, 0, available); available = in.read(buffer); } in.close(); out.flush(); out.close(); } catch (IOException e) { // handle exception }