arrays - 角转换excel损坏
问题描述
我的项目使用 angular,现在调用 api 来获取 excel 文件的字节 []。但是当我通过 blob 将 byte[] 转换为文件时,该文件已损坏。有人可以帮我吗
我的 Angular 是第 9 版
服务.ts:
downloadFile(req?: any): any {
const options = createRequestOption(req);
return this.http.get(`${this.resourceUrl}/print`, {
params: options,
responseType:'blob' })
.toPromise();
}
组件.ts:
import {saveAs} from 'file-saver';
export():void{
this.exportService.downloadFile({}) .then((blob:any)=> {
saveAs(blob, 'test.xlsx');
});
}
}
解决方案
不要一个人,tks。我不确定什么是最好的答案,但这项工作
testByte(filename = ''): Observable<HttpResponse<string>>{
return this.http.get(`${this.resourceUrl}/testByte`, {
responseType: 'text',
observe: 'response'
}).pipe(map((res: HttpResponse<string>) => this.byteToFile(res,filename)));
}
private byteToFile(res: HttpResponse<string>,filename:string): HttpResponse<string> {
if(res.body){
const fileName = filename;
const a = document.createElement('a');
document.body.appendChild(a);
const sliceSize = 512;
const byteCharacters = res.body;
const byteArrays = [];
for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
const slice = byteCharacters.slice(offset, offset + sliceSize);
const byteNumbers = new Array(slice.length);
for (let i = 0; i < slice.length; i++) {
byteNumbers[i] = slice.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
const blob = new Blob(byteArrays, {type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'});
const fileURL = window.URL.createObjectURL(blob);
a.href = fileURL;
a.download = fileName;
a.click();
}
return res.clone();
}
推荐阅读
- scala - 由于函数导致循环变量替换
- c# - 使用 datakeynames 中的多个值更新 gridview
- javascript - 将三元运算符转换为 if / else 语句
- c# - 在 Xamarin 中将值绑定到视图的扩展
- angular - 库的 stylePreprocessorOptions,我应该在 angular.json 中的哪个位置?
- bash - 如何通过变量 bash 过滤行
- python-3.x - 如何仅从列表列表中过滤必要的数据?
- selenium-webdriver - IE WebDriver 在 Azure DevOps 上无法始终如一地工作
- python - 使用内置列表函数将两个列表转换为字典?
- routes - Content-Type 标头未在 Apache Camel 中设置