通过Servlet下载Excel文件

时间:2016-06-25 19:24:17

标签: java servlets apache-poi

我正在使用以下通过ajax调用调用的代码来创建我的excel文件。单击下载按钮excel文件在根位置生成。但我无法看到用户保存/另存为文件的提示。我可以看到excel的内容即将到来的浏览器的响应选项卡。但我想要另存为“另存为”对话框选项。以下代码中的任何修正都可以解决这个问题吗?

            final Date date = new Date();
            final String generateDate= new SimpleDateFormat("yyyy-MM-dd").format(date);
            final String filename = form_name+"-extraction-"+generateDate.toString()+".xls";
            final FileOutputStream fileOutputStream = new FileOutputStream(filename);
            workbook.write(fileOutputStream);
            downloadFile(filename, response);

下面是下载文件方法:

private void downloadFile(final String fileName, final SlingHttpServletResponse response){
        try {
            final File f = new File(fileName);
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "inline; filename="+fileName);
            response.setHeader("Pragma", "public");
            response.setHeader("Cache-Control", "no-store");
            response.addHeader("Cache-Control", "max-age=0");
            FileInputStream fin = null;
            try {
                fin = new FileInputStream(f);
            } catch (final FileNotFoundException e) {
                e.printStackTrace();
            }
            final int size = 1024;
            try {
                response.setContentLength(fin.available());
                final byte[] buffer = new byte[size];
                ServletOutputStream os = null;

                os = response.getOutputStream();
                int length = 0;
                while ((length = fin.read(buffer)) != -1) {
                    os.write(buffer, 0, length);
                }
                fin.close();
                os.flush();
                os.close();
            } catch (final IOException e) {
                e.printStackTrace();
            }
        }catch (final Exception ex){
            LOGGER.error("ERROR IS ::: {}",ex.getMessage());
    }

2 个答案:

答案 0 :(得分:1)

  

如果处置类型匹配"附件" (不区分大小写),   这表示收件人应提示用户保存   在当地做出反应,而不是正常处理(根据其媒体而言)   类型)。

     

另一方面,如果匹配"内联" (不区分大小写),   这意味着默认处理。因此,配置类型   "直列"只有在使用附加功能进行扩充时才有用   参数,例如文件名(见下文)。

     

未知或未处理的处置类型应由
处理   收件人的方式与"附件"相同(另见[RFC2183],
  第2.8节。

因此,您强制浏览器显示该文件,而不是使用您的

下载它
response.setHeader("Content-Disposition", "inline; filename="+fileName);

呼叫。您应该使用"附件" 而不是"内联"。

response.setHeader("Content-Disposition", "attachment; filename="+fileName);

阅读Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP)了解详情。

答案 1 :(得分:0)

如果在Excel中填充了以前搜索过的数据输出,则应删除静态声明。例如:

private static hasmap hs = new hashmap();