使用 Angular6 将 Excel Base 64 转换为 Excel

Convert Excel Base 64 to Excel with Angular6

我有一个 Springboot 服务,可以将 base64 格式的文件 (Excel) 发送到 Angular6。为了安全起见,我不能直接发送文件,所以,我首先将我的文件转换为 base64...

在我的 Angular 我可以接收到 base64 :

 {
  "file" : "UEsDBBQACAAIAJOOOU/kSK2vGAEAADMDAAATAAAAW0NvbnRlbnRfVHlwZXNdLnht" 
 }  

字符串文件比较长...

然而,当我尝试打开这个文件时,我在 LibreOffice 中遇到错误,"corrupt file"

this.data.getFile(endPoint).subscribe( 
          data => {          
                     const myfile= atob(data.file);
                     const blob = new Blob([myfile], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
                     saveAs(blob, 'myfile.xlsx'); 
                  } );

编辑:

这是 "myfile" =>

的值

拜托,我需要帮助..

Angular 在我执行 saveAs(blob, 'myfile.xlsx'); 时不会出错,但如果我尝试打开文件,我会出错。

atob() 输出 UTF8 字符串,而不是文件。您收到的 base64 字符串很可能是从一个字节数组的实际文件中编码而来的。我认为这个函数 () 对你有用:

public base64ToBlob(b64Data, sliceSize=512) {
let byteCharacters = atob(b64Data); //data.file there
let byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
    let slice = byteCharacters.slice(offset, offset + sliceSize);

    let byteNumbers = new Array(slice.length);
    for (var i = 0; i < slice.length; i++) {
        byteNumbers[i] = slice.charCodeAt(i);
    }
    let byteArray = new Uint8Array(byteNumbers);
    byteArrays.push(byteArray);
}
return new Blob(byteArrays, {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'});
}
public base64ToBlob(b64Data, sliceSize=512) {
let byteCharacters = atob(b64Data); //data.file there
let byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
    let slice = byteCharacters.slice(offset, offset + sliceSize);

    let byteNumbers = new Array(slice.length);
    for (var i = 0; i < slice.length; i++) {
        byteNumbers[i] = slice.charCodeAt(i);
    }
    let byteArray = new Uint8Array(byteNumbers);
    byteArrays.push(byteArray);
}
return new Blob(byteArrays, {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'});
}