在 Angular2 中将 Blob 保存为 xlsx

2024-01-07

我在保存时遇到一些问题xlsx在我的 Angular2 应用程序中:

this._http.get('/api/file).subscribe(success=>{
                var blob = new Blob([success.json()], {
                    type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
                });
                var downloadUrl= window.URL.createObjectURL(blob);
                window.open(downloadUrl);

            }, error=>{

            });

我从后端收到的响应采用以下形式:

PK�q�H_rels/.rels���j�0��}
�{㴃1F�^Ơ�2��l%1I,c�[��3�l
l�����H��4��R�l��·����q}*�2�������;�*��
t"�^�l;1W)�N�iD)ejuD�cKz[׷:}g����@:�.... etc

我有什么想法做错了吗?


问题是不支持开箱即用的二进制响应内容。您需要“手动”设置底层 XHR 对象的响应类型

作为解决方法,您需要扩展BrowserXhr如下所述的 Angular2 类来设置responseType to blob在底层 xhr 对象上:

import {Injectable} from 'angular2/core';
import {BrowserXhr} from 'angular2/http';

@Injectable()
export class CustomBrowserXhr extends BrowserXhr {
  constructor() {}
  build(): any {
    let xhr = super.build();
    xhr.responseType = "blob";
    return <any>(xhr);
  }
}

在提供者中注册此类时要小心,因为它是全局的。您应该仅在执行请求的组件内设置它。在您的情况下,您会得到响应数据的字符串表示形式......

@Component({
  (...)
  providers: [
    provide(BrowserXhr, { useClass: CustomBrowserXhr })
  ]
})
export class ...

然后你需要从_body响应对象的属性。您应该正常使用,因为它是内部的,但现在没有其他方法:

this._http.get('/api/file).subscribe(success => {
  var blob = new Blob([success._body], {
               type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  });
  var downloadUrl= window.URL.createObjectURL(blob);
  window.open(downloadUrl);
}, error=>{
  (...)
});

请参阅此问题了解更多详细信息:

  • Angular 2从API下载PDF并在视图中显示 https://stackoverflow.com/questions/35368633/angular-2-download-pdf-from-api-and-display-it-in-view/35373887#35373887
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Angular2 中将 Blob 保存为 xlsx 的相关文章

随机推荐