Return Excel download file from Spring

So, I have a Spring controller, and I would like to create an Excel file and return it so that it is loaded by the browser.

I am using JEXcelApi.

This is my controller code

@RequestMapping(value="/excel/cols/{colString}/rows/{rowString}/", method = RequestMethod.GET) @ResponseBody public ResponseEntity<String> exportExcel(HttpServletResponse response, @PathVariable List<String> colString, @PathVariable List<String> rowString) throws JSONException, IOException, WriteException { WritableWorkbook workbook = Workbook.createWorkbook(new File("exported.xls")); WritableSheet sheet = workbook.createSheet("Exported",0); String[] cols = colString.get(0).split(","); String[] rows = rowString.get(0).split(","); for(int i = 0; i < cols.length;i++){ Label label = new Label(i,0, cols[i]); sheet.addCell(label); } int excelCol = 0; int excelRow = 1; for(int i = 0; i < rows.length;i++){ Label label = new Label(excelCol,excelRow, rows[i]); sheet.addCell(label); excelCol++; if((i+1) % cols.length == 0){ excelCol = 0; excelRow++; } } workbook.write(); workbook.close(); return null; } 

How can I do it? I suspect there is some content header that I can set. I know that one method is to use the Spring Abstract Excel view class, but is there a simpler method?

+6
source share
1 answer

You need to set the Content-Disposition header.

 response.setHeader("Content-disposition","attachment; filename=" + yourFileName); 

and write your bytes directly to the OutputStream response.

 File xls = new File("exported.xls"); // or whatever your file is FileInputStream in = new FileInputStream(xls); OutputStream out = response.getOutputStream(); byte[] buffer= new byte[8192]; // use bigger if you want int length = 0; while ((length = in.read(buffer)) > 0){ out.write(buffer, 0, length); } in.close(); out.close(); 

The above is relatively outdated. Now you can build a ResponseEntity with a FileSystemResource . A ResourceHttpMessageConverter will then copy the bytes, as I suggested above, for you. Spring MVC makes it easier to work with you, and does not interact with interfaces from the Servlet specification.

+8
source

Source: https://habr.com/ru/post/953288/


All Articles