Java HttpServlet如何下载excel文件

时间:2014-10-28 14:53:33

标签: java excel http servlets download

我正在尝试向我的网络应用添加一项功能,让用户下载excel文件。

我尝试使用以下代码实现此目的:

@Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) {
        File file = new File("d:/test/test.xls");
        response.setContentType("application/xls");
        response.addHeader("Content-Disposition", "attachment; filename=test.xls");
        response.setContentLength((int) file.length());

        try {
            FileInputStream fileInputStream = new FileInputStream(file);
            OutputStream responseOutputStream = response.getOutputStream();
            int bytes;
            while ((bytes = fileInputStream.read()) != -1) {
                responseOutputStream.write(bytes);
            }
            fileInputStream.close();
            responseOutputStream.close();

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

我可以使用上面的代码下载excel文件,但文件已损坏。如果我用microsoft excel打开它,我会弹出一条消息:

"文件格式和扩展名不匹配。该文件可能已损坏或不安全"。

excel文件为空。

运行代码后,原始文件(d:/test/test.xls)也会损坏。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

Excel文件.xls的官方MIME类型为application/vnd.ms-excel,而.xlsxapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet

此外,我建议在关闭response.reset()之前写入输出流responseOutputStream.flush()(重要)之前执行response

答案 1 :(得分:0)

尝试以下代码:

    File file = null;
    InputStream in = null;
    OutputStream outstream = null;
    try {
      response.reset();
      in = new FileInputStream(file);
      response.setContentType("application/vnd.ms-excel");
      response.addHeader("content-disposition", "attachment; filename=data.xls");
      outstream = response.getOutputStream();
      IOUtils.copyLarge(in, outstream);
     }
    catch (Exception e) {
        out.write("Unable to download file");
    }finally {
        IOUtils.closeQuietly(outstream);
        IOUtils.closeQuietly(in);
        IOUtils.closeQuietly(out);
        if (file != null)
            file.delete();
    }

不要忘记在依赖项中添加apache commons-io-2.4