如何在 Spring RestController 中下载 excel 文件

Posted

技术标签:

【中文标题】如何在 Spring RestController 中下载 excel 文件【英文标题】:How to download an excel file in Spring RestController 【发布时间】:2018-08-04 10:10:03 【问题描述】:

我正在使用 Apache POI 生成 .xlsx 文件。

我想从 Spring 控制器返回该文件。这是我到目前为止所做的:

控制器:

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

是否可以从 rest 控制器返回实际的 excel 文件,以便用户可以将其下载到他的计算机上?至于现在控制器返回 byte[] 但我想返回实际文件。我怎样才能做到这一点?

【问题讨论】:

您可以使用标准的 apache commons utils 来下载文件。 Similar question. 是的,我已经读过了。我试图从创建 excel 的服务返回 InpurtStream 然后使用 IOUtils.copy(targetStream, response.getOutputStream());在控制器中,但它仅以不可读的字符“打印”响应。我想实际从控制器下载文件。到目前为止没有运气 that 怎么样?这个问题也和你很接近。 看看***.com/a/35683261/4516887 【参考方案1】:

您可以使用ByteArrayResource 作为文件下载。下面是你修改后的代码sn-p

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

如果您尝试使用apache poi生成excel,请在下面找到代码sn-p

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

【讨论】:

感谢 Excel / POI 示例,很棒的解决方案 imo,因为它非常适合 Spring 的做事方式。仅供参考,对于任何使用它的人,通过“与 Spring 配合”我的意思是它返回 Spring 的 ResponseEntity,并且下载 wok 的类来自 org.springframework.core.io 和 org.springframework.http 包。 什么是 XSSFWorkbook workbook = createWorkBook();??【参考方案2】:

感谢@JAR.JAR.beans。这是链接:Downloading a file from spring controllers

@RequestMapping(value = "/files/file_name", method = RequestMethod.GET)
@ResponseBody 
public FileSystemResource getFile(@PathVariable("file_name") String fileName) 
    return new FileSystemResource(myService.getFileFor(fileName)); 

【讨论】:

嗯,我的服务是什么?【参考方案3】:

这是我用来下载 txt 文件的工作代码。 excel文件也应该这样做。

@GetMapping("model")
public void getDownload(HttpServletResponse response) throws IOException 


    InputStream myStream = your logic....

    // Set the content type and attachment header.  for txt file
    response.addHeader("Content-disposition", "inline;filename=sample.txt");
    response.setContentType("txt/plain");

    // xls file
    response.addHeader("Content-disposition", "attachment;filename=sample.xls");
    response.setContentType("application/octet-stream");

    // Copy the stream to the response's output stream.
    IOUtils.copy(myStream, response.getOutputStream());
    response.flushBuffer();

【讨论】:

以上是关于如何在 Spring RestController 中下载 excel 文件的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot RestController 在没有 SpringBootApplication 的情况下如何工作?

Spring RestController 如何同时接受 JSON 和 XML?

如何从 Validated Spring RestController 获取多个缺失请求参数的详细信息?

spring mvc中,RestController如何自定义返回的HTTP状态

如何在 Spring Boot 的 @RestController 注释用于创建请求处理程序的方法中使用带有参数的构造函数

使用 @RestController 在 Spring Boot 中发布数据时出错