Spring下载Excel文件

3
我有以下控制器来下载Excel文件。文件已经下载,但是当我打开它时,会出现“文件损坏,无法打开。”。在我的控制器中做错了什么?
@ApiOperation(value = "export ontology")
@RequestMapping(value = "/export/{ontologyId}", method = RequestMethod.GET)
public ResponseEntity<InputStreamResource> exportExcel(@PathVariable Long ontologyId) throws FileNotFoundException {

    HttpHeaders headers = new HttpHeaders();
    headers.add("Content-Description", "File Transfer");
    headers.add("Content-Disposition", "attachment; filename=pfizer_polish_ontology.xlsx");
    headers.add("Content-Transfer-Encoding", "binary");
    headers.add("Connection", "Keep-Alive");
    headers.setContentType(
            MediaType.parseMediaType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"));

    File file = new File("C:\\ttt\\pfizer_polish_ontology.xlsx");

    InputStreamResource isr = new InputStreamResource(new FileInputStream(file));
    return ResponseEntity.ok().contentLength(file.length()).headers(headers).body(isr);
}

我想补充一个重要的细节 我正在使用Swagger接口来访问REST API。

使用POSTMAN(保存和下载)可以下载文件,一切正常。所以问题似乎只出现在使用Swagger接口时。


一个简单而可能愚蠢的观察...文件C:\ttt\pfizer_polish_ontology.xlsx没问题吗?这个文件有可能已经损坏,因此下载的文件也是损坏的吗? - Angelo Immediata
这个文件完好无损,我刚从主目录打开它,没有任何问题。 - Dumitru Gutu
刚试了一下你的代码,一切都如预期般正常,在Firefox(54.0.1)和Chrome(60.0.3112.113)中都可以运行。希望你的问题已经解决了。 - lzagkaretos
是的,代码运行正常。这是一个Swagger的问题。使用Postman,API也能正常工作。 - Dumitru Gutu
你解决了这个问题吗? - Shehan Ekanayake
2个回答

2

这是我用于 xlsx 文档的代码:

application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

我刚刚在我的初始帖子中更新了您提出的contentType的代码 - 但它不起作用。 - Dumitru Gutu
我们的做法是通过从HttpServletResponse获取OutputStream并将其写入此输出流来实现。请参见修改后的代码。 - Prashant
我在哪里可以看到“修改后的代码”?你已经发布了吗? - Dumitru Gutu

1
我猜你的内容类型与Excel格式不匹配。以下应该足够:
contentType("application/csv")

无论如何,我建议您查看简要描述MIME类型的网页。就我所看到的,格式xsl(x)最能匹配所有这些内容。
application/excel
application/vnd.ms-excel
application/x-excel
application/x-msexcel

具体是什么出了问题?您必须指明您的问题并描述错误。 - Nikolas Charalambidis
当我尝试打开下载的文件时,出现了相同的错误:“文件已损坏,无法打开。”该文件已经被下载,但是它是损坏的。 - Dumitru Gutu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接