Java 如何使用ajax启动web服务调用以导出Excel

Java 如何使用ajax启动web服务调用以导出Excel,java,ajax,excel,blob,Java,Ajax,Excel,Blob,更新问题: 在服务器端,我有一个如下的服务,如果我想使用ajax在客户端启动调用,我应该怎么做 在服务器中: Java/Spring @GET @Produces("application/vnd.ms-excel") @Path("permissions/all/{userList}") public Response allPermissionsExcel(@PathParam("userList") String userList) throws IOException { Byt

更新问题: 在服务器端,我有一个如下的服务,如果我想使用ajax在客户端启动调用,我应该怎么做

在服务器中: Java/Spring

@GET
@Produces("application/vnd.ms-excel")
@Path("permissions/all/{userList}")
public Response allPermissionsExcel(@PathParam("userList") String userList) throws IOException {    
ByteArrayOutputStream baos = new ByteArrayOutputStream();
HSSFWorkbook wb;
try {
        String[] groupList = userList.split(",");
        wb = this.excelPermissionsService.getPermissionsExcelWorkbook(groupList);
        wb.write(baos);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        baos.close();
    }
byte[] bytes = baos.toByteArray();
    ResponseBuilder response = Response.ok(bytes);
    response.header("Content-Disposition", "attachment; filename=export.xls");
    return response.build();
}
在客户端:

$scope.exportToExcel = function() {
  var promise = usersResource.getExcelPermissions($scope.userList);
  promise.$promise.then(function(data) {
//I tried to convert to blob then save it with FileSaver.js, but I got an issue in converting the object to blob.
  var blob = new Blob([data],
            var blob = new Blob([data],
            {type: "application/octet-stream"});
  saveAs(blob, "exportThis.xls");
  });
};
在客户端,如果我使用ajax(上面的代码)调用服务器,它会返回一个对象,但不会提示下载,除非我使用

window.location = "url here";
打电话。但这是一个重定向,在运行完所有javascript后会弹出下载窗口

由于我有一些由$watch应用的加载动画,所以我需要使用ajax来触发调用,而不是使用window.location

有人能帮我在客户端保存“数据”对象excel吗?
谢谢

您需要在不请求ajax的情况下使用window.open 它将打开一个新窗口,然后文件将开始下载,而不会影响当前页面

window.open("permissions/all/1"); // instead of window.location because it will move you to another page
您也可以通过这样的弹出窗口打开它

newwindow=window.open("permissions/all/1","Window name",'height=50,width=150); // this one is better because it will open a small window without hiding the current window 
       if (window.focus) {newwindow.focus()}
       return false;

谢谢你的回答!它可以工作,但angular$watch应用的加载动画不会显示。有没有办法处理promise中返回的“数据”并保存到excel以供下载?很高兴听到它帮助了您,接受这个答案以帮助其他面临相同问题的人,不幸的是,我以前从未使用过Angular。但是您不能同时检索两种类型的响应,因此如果是jsoin,则检索json如果是应用程序/vnd.ms-excel,则只检索excel,以防您确实需要这两种响应(下载、阅读内容)您需要执行两个请求,一个用于提取普通数据,另一个用于创建excel,在这种情况下,上述解决方案将无法工作。我认为,它将application/vnd.ms-excel作为字节数组返回。因为使用了$PROMITE,所以它期望返回,因此不会在底部浏览器上弹出任何内容。我想我的问题应该是如何使用ajax来启动调用。因为你的api是get,它将立即开始下载。我很好奇现在我看到了你在做什么。。。请尝试使用和xlsx文件执行此操作。我目前正在做一些类似的事情,但使用的是xlsx文件,但它不起作用。