6

即使我的控制器方法中没有错误,我也无法从浏览器下载 excel 文件。

 @RequestMapping(value = "/getExcelFile", method = RequestMethod.GET, produces="application/json")
public @ResponseBody HttpEntity<byte[]> getUserDetailsExcelFile(@RequestParam Long id) {
    try {
            byte[] wb =  ExcelReportView.buildExcelDocument(data);
            HttpHeaders header = new HttpHeaders();
            header.setContentType(new MediaType("application", "vnd.openxmlformats-officedocument.spreadsheetml.sheet"));
            header.set("Content-Disposition",
                           "attachment; filename=test.xls");
            header.setContentLength(wb.length);
            return new HttpEntity<byte[]>(wb, header);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
}

我收到了萤火虫的信息请求。

Request Method:GET Status Code:200 OK 
Request Headersview source
Accept:application/json, text/plain, */*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Connection:keep-alive
Cookie:org.cups.sid=ed8f7540d976ccc90b85954f21520861;         org.springframework.web.servlet.i18n.CookieLocaleResolver.LOCALE=fr; __ngDebug=true;   JSESSIONID=tqi3ofownl17
 Host:localhost:8888
  Referer:http://localhost:8888/
 User-Agent:Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko)   Chrome/27.0.1453.110 Safari/537.36
 X-Requested-With:XMLHttpRequest
 Query String Parametersview sourceview URL encoded
 id:1
 Response Headersview source
 Cache-Control:no-cache
 Content-Disposition:attachment; filename=test.xls
 Content-Length:1849
 Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

和回复内容

 ��A����\p                                                                                                       B�a=���=h\:�#8X@�"��1���Arial1���Arial1���Arial1���Arial"$"#,##0_);("$"#,##0)"$"#,##0_); [Red]("$"#,##0) "$"#,##0.00_);("$"#,##0.00)% "$"#,##0.00_);[Red]("$"#,##0.00),*'_(*  #,##0_);_(* (#,##0);_(* "-"_);_(@_)5)0_("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)4,/_(* #,##0.00_);_(* (#,##0.00);_(* "-"??_);_(@_)=+8_("$"* #,##0.00_);_("$"* (#,##0.00);_("$"* "-"??_);_(@_)��� � ��� �� ��� �� ��� �� ��� �� ��� �� ��� �� ��� �� ��� �� ��� �� ��� �� ��� �� ��� �� ��� �� ��� �� � � �+�� �� �)�� �� �,�� �� �*�� �� �    �� �� ������������������`��
Users Details���c
First Name   Last NameEmailPhone AddressLast AppointmentAppointment Status� K ��
d����MbP?_*+��%������"d,,�?�?U����     �  �� �v>�@e

所以我不知道该怎么办,我希望浏览器让我选择将文件保存在文件夹中。

谢谢你

4

2 回答 2

1

派对有点晚了,但是...

我猜错误在这一行:

header.set("Content-Disposition", "attachment; filename=test.xls");

尝试将“附件”更改为“内联”,如下所示:

header.set("Content-Disposition", "inline; filename=test.xls");
于 2013-08-15T22:37:29.543 回答
0

所以我不知道该怎么办,我希望浏览器让我选择将文件保存在文件夹中。

聚会很晚,但是...我遇到了同样的情况:服务器创建了excel,对浏览器的响应还可以,但是没有出现对话框。

问题是我正在做一个 Ajax 调用。如果我在新的浏览器窗口中调用 excel url,我可以通过“另存为”对话框下载它。

所以我<a>在 html 中创建了一个隐藏元素,带有下载html5 属性。然后,在 ajax 回调中我设置标签的href<a>属性 最后我调用click()函数来触发下载。

像这样的东西:

function openSaveAsDialog(){
    var aElement= document.getElementById("aElementId");
    aElement.href = "path/to/excel/documentId";
    aElement.click();
}

并在 html

<a id="aElementId" href="path_to_excel" download="filename_to_download" ng-show="false">Download file</a>

希望这可以帮助。

ps:这个肮脏的解决方案对我有用,但如果有人可以展示是否有更好的解决方案来触发没有隐藏 html 元素的“另存为”对话框,我会很高兴。

于 2019-10-09T08:39:27.273 回答