最近遇到一个bug,后端返回base64字符串,需要前端转为xlsx格式的excel。但是使用FileSaver.saveAs导出的excel在office中提示‘文件格式或文件内容不正确’。
这是之前使用的方法:
import FileSaver from 'file-saver';
export function fileSaverExport(data, fileName, fileType = 'xls') {
let bytes = window.atob(data);
let length = bytes.length;
let u8arr = new Uint8Array(length);
while (length--) {
u8arr[length] = bytes.charCodeAt(length);
}
try {
FileSaver.saveAs(
new Blob([u8arr], { type: 'application/octet-stream' }),
fileName + '.' + fileType
);
} catch (e) {
if (typeof console !== 'undefined') {
console.log(e, data);
}
}
}
以下是正确方法:
//字符串转字符流
function string2ArrayBuffer(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;
}
import * as XLSX from 'xlsx';
import FileSaver from 'file-saver';
// 导出方法
export function fileSaverExport(data, fileName) {
const workbook = XLSX.read(data, { type: 'base64' });
var excelData = XLSX.write(workbook, { bookType: 'xlsx', bookSST: false, type: 'binary' });
var blob = new Blob([string2ArrayBuffer(excelData)], { type: '' });
FileSaver.saveAs(blob, fileName + '.xlsx');
}
fileSaverExport(base64字符串,'导出文件名')