Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 下载Excel文件,文件名按原样,格式为_Angular_Typescript - Fatal编程技术网

Angular 下载Excel文件,文件名按原样,格式为

Angular 下载Excel文件,文件名按原样,格式为,angular,typescript,Angular,Typescript,如何在我的Angular应用程序中下载带有服务返回的原样文件名的Excel文件?我正在使用文件保护程序库。这是我的密码: let blob = new Blob([response], {type: 'application/vnd.openxmlformat-officedocument.spreadsheetml.sheet;'}); saveAs(blob, 'hello.xlsx'); 这是角度服务的响应: return this.http.get(`${this.reportsUr

如何在我的
Angular
应用程序中下载带有服务返回的原样文件名的Excel文件?我正在使用
文件保护程序
库。这是我的密码:

let blob = new Blob([response],  {type: 'application/vnd.openxmlformat-officedocument.spreadsheetml.sheet;'});
saveAs(blob, 'hello.xlsx');
这是角度服务的响应:

return this.http.get(`${this.reportsUrl}`, { responseType: 'blob'});
我的后端服务(SpringMVC)的响应
excelCreatedResource
的类型为
org.springframework.core.io.Resource

return ResponseEntity.ok()
                .contentType(MediaType.parseMediaType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"))
                .header(HttpHeaders.CONTENT_DISPOSITION,
                "attachment; filename=\"" + excelCreateResource.getFilename() + "\"")
                .body(excelCreateResource);

我不想提供
hello.xlsx
。相反,我只想下载文件而不更改服务返回的文件名。如果我直接从浏览器访问URL,我可以下载Excel文件。

If
excelCreateResource.getFilename()返回文件名然后,您可以将文件名存储在局部变量中,并在
saveAs()
方法中传递此变量,如下所示:

var filename = excelCreateResource.getFilename();
saveAs(blob, filename );

也许它对你有用。

根据你的问题,我认为你需要观察完整的回答,并从中获取标题详细信息。在Angular中,您可以使用

let observable$ = this.http.get(`${this.reportsUrl}`, { observe: 'response'});
observable$.subscribe(response => {
  let blobObj = response.body; // this should be your blob object (body of response)
  let headers = response.Headers //This is a disctionary/HashMap were you'll find the content-desposition header

//.....

})  

可以保存文件构造函数而不指定文件名。文件本身已包含名称

let blob=new blob([response],{type:'application/vnd.openxmlformatofficedocument.spreadsheetml.sheet;'});
saveAs(blob)


或者,您必须从响应中获取标题,将文件名保存在variable中,并将变量传递给saveAs()函数。

使用库FileSaverJs

let wbout = <write output> // write table or json to excell
function s2ab(s) {
  var buf = new ArrayBuffer(s.length);
  var view = new Uint8Array(buf);
  for (var i = 0; i < s.length; i++) {
    view[i] = s.charCodeAt(i) & 0xFF;
  }
  return buf;
}
// Save it as test.xlsx
saveAs(new Blob([s2ab(wbout)], {type:"application/octet-stream"}), 'hello.xlsx');
let wbout=//将表或json写入excell
功能s2ab(s){
var buf=新阵列缓冲区(s.长度);
var视图=新的UINT8阵列(buf);
对于(变量i=0;i
您的服务的响应结构是什么?请添加响应片段,以便更好地理解您的问题。我想您可以从
中切分名称。reportsUrl
。另一个选项是请求在从该API获得的响应中发送文件名。
excelCreateResource
是Java对象,而不是JS。我收到了以下错误:
Type'object'不可分配给Type'BlobPart'。“对象”类型可分配给很少的其他类型。你的意思是用“any”类型吗?类型“Object”不能分配给类型“string”。
为此:
让filename=response.headers.get('filename');让body=response.body;var blob=new blob([body],{type:'application/vnd.openxmlformat of icedocument.spreadsheetml.sheet;'});saveAs(blob,文件名)如何判断它将消耗blob,因为它说:
错误:SyntaxError:“JSON.parse:JSON数据第1行第1列的意外字符”
无更多错误。但问题是我无法获取文件名。它返回
null
。谢谢。我严格遵守了你的代码,并添加了@Zarna Borda建议。你的两个答案都完成了解决方案。就像我说的,我不想在客户端提供文件名,比如
hello.xlsx
。你说的是你不想要的,但不是你想要的。真的吗?你没读这行吗<代码>我不想提供hello.xlsx。相反,我只想下载文件而不更改服务返回的文件名。如果我直接从浏览器访问URL,我就可以下载Excel文件。
此外,如果我真的没有说我想要什么,但显然我说了我不想要的。因此,你能做的最起码的事情就是不要提出我不想要的建议。如果您不理解我的帖子,您应该问一下。默认情况下,它将下载文件download.xlsx。在后端响应标头中添加“访问控制公开标头”:“内容处置”。从响应头获取文件名。并将该文件名传递给saveAs(),谢谢。我的问题终于解决了。我只是不知道我会接受哪个答案@脚踝的回答也很有帮助。我完全按照你的建议去做了。两个答案都完成了解决方案。