【问题标题】:Unable to download Excel spreadsheet with outputstream data from backend无法从后端下载带有输出流数据的 Excel 电子表格
【发布时间】:2017-02-03 00:53:09
【问题描述】:

返回 outputStream 数据以下载 Excel 电子表格的 REST 方法:

@RequestMapping(value = "/downloadxls", method = RequestMethod.GET)
public @ResponseBody void getRecordsAndExportExcel(@RequestParam("search_param") String students, HttpServletResponse response) {
    response.setContentType("application/vnd.ms-excel");

 Workbook hssfWorkbook = exportExcelService.getExcelStudents(students);
        try {
            OutputStream out = response.getOutputStream();
            hssfWorkbook.write(out);
            out.flush();
            out.close();

        } catch (IOException e) {
           logger.error("Error exporting to excel:" + e); 
        }
}

我以字节形式获取数据,但在 Angular 中我试图将其呈现为 Excel 电子表格;但它不会下载。我这样做是为了转换:

var blob = new Blob([result.data],  {type : 'application/vnd.openxmlformats-officedocument.presentationml.presentation;charset=UTF-8'});
         FileSaver.saveAs(blob, "MyData.xls");

请求和响应标头:

Access-Control-Allow-Headers:x-requested-with, content-type
Access-Control-Allow-Methods:GET OPTIONS
Access-Control-Allow-Origin:*
Access-Control-Max-Age:3600
Content-Type:application/vnd.ms-excel;charset=UTF-8
Server:Apache-Coyote/1.1
Transfer-Encoding:chunked
X-Application-Context:application:8080

请求标头

Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,ms;q=0.6
Connection:keep-alive
Host:localhost:8080
Origin:http://localhost:9000
Referer:http://localhost:9000/

我正在使用 Angular 从前端进行 GET 调用并调用后端以将数据下载为 Excel 电子表格,但它无法将输出流转换为 blob/excel。如何以下载形式呈现 Excel 电子表格?

【问题讨论】:

  • 你能详细说明一下“它不会下载”吗?您是否在控制台中收到任何错误? window.open() 通话后会发生什么?
  • 我没有在 html 中获得任何 window.open。我正在接收从后端到 ui 的字节(如果我尝试在后端编写 excel 也可以)并且在 UI 中我有一个模型窗口单击下载选项(),我正在调用我的 JS 进行下载。我在控制台中没有收到任何错误,但如果尝试显示数据,它会在控制台中显示为字节。请建议我是否需要在 HTML 和 JS 中添加任何更改才能获取文件。
  • 我已经尝试使用 FileSaver 它正在下载但字节正在写入 excel,请指出为什么数据没有从字节转换。

标签: angularjs spring-restcontroller


【解决方案1】:

我将在我的应用程序中显示 excel 工作表的方式是返回要显示的 excel 工作表的路径+文件名,然后在新选项卡中使用 angular 打开链接。

在服务类中

ExportExcel response = new ExportExcel();
response.setPath(excelPath);
return response;

控制器类

Response response = excelService.generateExcel();
return new ResponseEntity<>(response, HttpStatus.OK);

在您的角度控制器中:

if(response.status === 200){
var excelPath = response.data.path;
var win = window.open(excelPath, '_blank');
if (win) {
        //Browser has allowed it to be opened
        win.focus();
} else {
        //Browser has blocked it
        swal(   
            "Error!",   
           'Please allow popups for this website',   
           "error"
        );
    }                        
}

试试看是否可行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-23
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    相关资源
    最近更新 更多