从Spring返回Excel下载文件

所以我有一个Spring控制器,我想创build一个Excel文件并返回,以便它被浏览器下载。

我正在使用JEXcelApi。

这是我的控制器代码

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

我怎么做? 我怀疑有一些内容头可以设置。 我知道一种方法是使用Spring的抽象Excel视图类,但有一个更简单的方法吗?

您需要设置Content-Disposition标题。

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

并将您的字节直接写入到OutputStream响应中。

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

以上是比较旧的。 您现在可以使用FileSystemResource构buildResponseEntity 。 一个ResourceHttpMessageConverter然后将复制字节,如上所示,为你。 Spring MVC使你更简单,而不是让你与Servlet规范的接口交互。