3

I want to create an Excel file from a method in Java and download it in a browser.

I have found an example on this post where you create the Excel file, but I want to create the .xls file and download it from a web browser.

How can I do that?

Community
  • 1
  • 1
CyborgNinja23
  • 290
  • 12
  • 33

3 Answers3

5

I finally found a solution for my problem...!!

This is working for me:

       @RequestMapping("/downloadFile")
       public void downloadFile(HttpServletRequest request, HttpServletResponse response) {             

       try {

            String fileName = "C:/excelFile.xls";
            HSSFWorkbook workbook = new HSSFWorkbook();
            HSSFSheet sheet = workbook.createSheet("firstSheet");

            HSSFRow rowhead = sheet.createRow((short) 0);
            rowhead.createCell(0).setCellValue("No.");
            rowhead.createCell(1).setCellValue("Name");
            rowhead.createCell(2).setCellValue("Address");
            rowhead.createCell(3).setCellValue("Email");

            HSSFRow row = sheet.createRow((short) 1);
            row.createCell(0).setCellValue("1");
            row.createCell(1).setCellValue("Carlos");
            row.createCell(2).setCellValue("Costa Rica");
            row.createCell(3).setCellValue("myNameh@gmail.com");

            FileOutputStream fileOut = new FileOutputStream(fileName);
            workbook.write(fileOut);
            fileOut.close();
            System.out.println("Your excel file has been generated!");

            //Code to download
            File fileToDownload = new File(fileName);
            InputStream in = new FileInputStream(fileToDownload);

            // Gets MIME type of the file
            String mimeType = new MimetypesFileTypeMap().getContentType(fileName);

            if (mimeType == null) {
                // Set to binary type if MIME mapping not found
                mimeType = "application/octet-stream";
            }
            System.out.println("MIME type: " + mimeType);

            // Modifies response
            response.setContentType(mimeType);
            response.setContentLength((int) fileToDownload.length());

            // Forces download
            String headerKey = "Content-Disposition";
            String headerValue = String.format("attachment; filename=\"%s\"", fileToDownload.getName());
            response.setHeader(headerKey, headerValue);

            // obtains response's output stream
            OutputStream outStream = response.getOutputStream();

            byte[] buffer = new byte[4096];
            int bytesRead = -1;

            while ((bytesRead = in.read(buffer)) != -1) {
                outStream.write(buffer, 0, bytesRead);
            }

            in.close();
            outStream.close();

            System.out.println("File downloaded at client successfully");


        } catch (Exception ex) {
            System.out.println(ex);
        }
    }
CyborgNinja23
  • 290
  • 12
  • 33
0

If you want to trigger a Java process from a Web Browser (HTTP request), then you need an application server (like Tomcat) to accept your HTTP request and execute some server-side code (Servlet). A main method like in the example cannot be launched by a HTTP request. Look here if you never wrote a Servlet before.

pmartin8
  • 1,545
  • 1
  • 20
  • 36
-1

This has nothing to do with Excel, but this post shows how to download a file from a Spring MVC controler.

    @RequestMapping(value = "/files/{file_name}", method = RequestMethod.GET)
    public void getFile(@PathVariable("file_name") String fileName, HttpServletResponse response) {
    try {
      // get your file as InputStream
      InputStream is = ...;
      // copy it to response's OutputStream
      org.apache.commons.io.IOUtils.copy(is, response.getOutputStream());
      response.flushBuffer();
    } catch (IOException ex) {
      log.info("Error writing file to output stream. Filename was '{}'", fileName, ex);
      throw new RuntimeException("IOError writing file to output stream");
    }
}
Community
  • 1
  • 1
pmartin8
  • 1,545
  • 1
  • 20
  • 36