lakshmi
lakshmi

Reputation: 21

Excel download by using apache poi

I want the excel file to download when user calls this method. File is downloading successfully but this is creating another excel file in the classPath of project. Can anyone please help me to avoid this classPath file creation. Thanks in advance.

@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();
    }

}

Upvotes: 2

Views: 9899

Answers (2)

Izruo
Izruo

Reputation: 2276

Use an absolute path for the file where you are writing your excel to:

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

A reasonable addition is to use a variable:

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

You can of course define a custom variable and use it, too.

Upvotes: 1

shreyansh jogi
shreyansh jogi

Reputation: 2102

Because you are creating file using below command

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

it will generate file in classpath

better to give path of file and same file path while you are downloading

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

Upvotes: 0

Related Questions