json数据通过XLSX插件转成excel数据再转成blob,使用electron的dialog方法调出保存弹框,监听保存结果
electron调dialog保存
saveAsElectron(blob, fileName) {
const electron = window.require("electron");
readFileAsArrayBuffer(blob).then((res) => {
var data = new Uint8Array(res);
var remote = electron.remote;
var dialog = remote.dialog;
var dlgConfig = {defaultPath: fileName};
let type = fileName.split(".")[1];
let filters = [{name: "*", extensions: [type]}];
dlgConfig["filters"] = filters;
var path = dialog.showSaveDialogSync(dlgConfig);
if (path) {
const fs = window.require("fs");
fs.writeFileSync(path, data, (err) => {
toastr.error("保存失败");
return;
});
toastr.success("保存成功");
}
});
/**
* 读取文件
* @param {Blob} file
* @returns {Promise<ArrayBuffer>}
*/
function readFileAsArrayBuffer(file) {
return new Promise(function (resolve, reject) {
var reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = function (e) {
resolve(e.target.result);
};
reader.onerror = reject;
});
}
},
// 创建工作簿和工作表,jsonRoot为生成的excel数据
var wb = XLSX.utils.book_new(), // 工作簿,即一个Excel文件
sheet = XLSX.utils.aoa_to_sheet(jsonRoot.dataJson); // 工作表,即Excel内部的工作表
sheet["!merges"] = jsonRoot.sheetMerge;
// "SheetJS" 为工作表名称,即Excel文件中工作表
XLSX.utils.book_append_sheet(wb, sheet, "SheetJS");
// 写出Excel工作簿
const wbout = XLSX.write(wb, {bookType: "xlsx", type: "binary"});
function dfefs(s) {
const buf = new ArrayBuffer(s.length);
const view = new Uint8Array(buf);
for (let i = 0; i !== s.length; ++i) view[i] = s.charCodeAt(i) & 0xff;
return buf;
}
const blob = new Blob([dfefs(wbout)], {type: "application/octet-stream"});
if (hdapi.is_electron) { //判断是electron环境
hdapi.saveAsElectron(blob, filename);
} else {
XLSX.writeFile(wb, filename);
}
jsonRoot