I am using Apache POI to generate .xlsx file.
I would like to return that file from Spring controller. Here’s what I’ve done so far:
Controller:
@RequestMapping(method = RequestMethod.GET) public HttpEntity<byte[]> createExcelWithTaskConfigurations(HttpServletResponse response) throws IOException { byte[] excelContent = excelService.createExcel(); HttpHeaders header = new HttpHeaders(); header.setContentType(new MediaType("application", "vnd.openxmlformats-officedocument.spreadsheetml.sheet")); header.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=my_file.xls"); header.setContentLength(excelContent.length); return new HttpEntity<>(excelContent, header); }
Is it possible to return actual excel file from rest controller so user can download it to his computer ? As for now controller returning byte[] but I would like to return it actual file. How can I achieve that ?
Advertisement
Answer
You can use ByteArrayResource
to download as a file. Below is the modified code snippet of yours
@GetMapping(value="/downloadTemplate") public HttpEntity<ByteArrayResource> createExcelWithTaskConfigurations() throws IOException { byte[] excelContent = excelService.createExcel(); HttpHeaders header = new HttpHeaders(); header.setContentType(new MediaType("application", "force-download")); header.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=my_file.xlsx"); return new HttpEntity<>(new ByteArrayResource(excelContent), header); }
If you are trying to generate excel using apache poi, please find the code snippet below
@GetMapping(value="/downloadTemplate") public ResponseEntity<ByteArrayResource> downloadTemplate() throws Exception { try { ByteArrayOutputStream stream = new ByteArrayOutputStream(); XSSFWorkbook workbook = createWorkBook(); // creates the workbook HttpHeaders header = new HttpHeaders(); header.setContentType(new MediaType("application", "force-download")); header.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=ProductTemplate.xlsx"); workbook.write(stream); workbook.close(); return new ResponseEntity<>(new ByteArrayResource(stream.toByteArray()), header, HttpStatus.CREATED); } catch (Exception e) { log.error(e.getMessage()); return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } }