2017-07-21 260 views
1

我想在用户调用这个方法时下载excel文件。文件正在下载成功,但这是在项目的classPath中创建另一个excel文件。任何人都可以帮助我避免这个classPath文件的创建。 在此先感谢。使用apache poi下载excel

@Override 
    public void downloadExcel(HttpServletRequest request,HttpServletResponse response) throws IOException { 

       File file = new File("Segmentdetail.xlsx"); 

       XSSFWorkbook workbook = new XSSFWorkbook(); 
       XSSFSheet spreadsheet = workbook.createSheet("SegmentLogs Info"); 
       spreadsheet.setDefaultColumnWidth(20); 
      .....Here is the logic for generating sheet which is quite big so iam skipping it. 

      }   
      FileOutputStream out = new FileOutputStream(file); 
      workbook.write(out); 
      downloadFile(file,response); 
      out.close(); 
      workbook.close(); 

    } 

    private void downloadFile(File file, HttpServletResponse response){ 

     try {   
      response.setContentType("application/vnd.ms-excel"); 
      response.addHeader("content-disposition", "attachment; filename=Segmentdetail.xlsx"); 
      response.setHeader("Pragma", "public"); 
      response.setHeader("Cache-Control", "no-store"); 
      response.addHeader("Cache-Control", "max-age=0"); 
      FileInputStream fin = null; 
      try { 
       fin = new FileInputStream(file); 
      } catch (final FileNotFoundException e) { 
       e.printStackTrace(); 
      } 
      final int size = 1024; 
      try { 
       response.setContentLength(fin.available()); 
       final byte[] buffer = new byte[size]; 
       ServletOutputStream outputStream = null; 

       outputStream = response.getOutputStream(); 
       int length = 0; 
       while ((length = fin.read(buffer)) != -1) { 
        outputStream.write(buffer, 0, length); 
       } 
       fin.close(); 
       outputStream.flush(); 
       outputStream.close(); 
      } catch (final IOException e) { 
       e.printStackTrace(); 
      } 
     }catch (final Exception ex){ 
      ex.printStackTrace(); 
    } 

} 

回答

0

由于您使用以下命令

File file = new File("Segmentdetail.xlsx"); 

它将在类路径中生成文件中创建文件

不如给文件相同的文件路径的路径,而你正在下载

File file = new File("c://Segmentdetail.xlsx"); 
+0

对不起,我试过了上面的一个,但文件没有找到异常结束。顺便说一句,我使用的是Ubuntu。 – lakshmi

+0

然后指定路径如下/ home/usr/Filename并给出相同的路径,而你正在下载文件名= –

+0

不,它不工作相同的异常。无论如何要保持excel表单在会话中并从那里下载? – lakshmi

1

使用您正在编写excel的文件的绝对路径:

File file = new File(  "C:\\Segmentdetail.xlsx"); // windows 
File file = new File("/home/usr/Segmentdetail.xlsx"); // unix  

合理的除了是使用一个变量:

File file = new File(System.getenv("user.home"), "Segmentdetail.xlsx"); 

你当然也可以自定义一个变量,并使用它了。

+0

我不想在我的本地机器上创建文件。它应该在会话中并从那里下载。 – lakshmi