File electron sheetjs从JSON下载生成的文件
我有一个带有VueJS的Electron应用程序,我尝试下载一个带有sheetjs的生成XLS,但解决方法在我的情况下不起作用。以下是我一直在尝试的:File electron sheetjs从JSON下载生成的文件,file,vue.js,download,electron,sheetjs,File,Vue.js,Download,Electron,Sheetjs,我有一个带有VueJS的Electron应用程序,我尝试下载一个带有sheetjs的生成XLS,但解决方法在我的情况下不起作用。以下是我一直在尝试的: exportData(id, type) { // eslint-disable-next-line no-console console.log(type); (async () => { const data = await ProjectController.getProject
exportData(id, type) {
// eslint-disable-next-line no-console
console.log(type);
(async () => {
const data = await ProjectController.getProject(id);
const ws = XLSX.utils.json_to_sheet(JSON.parse(data.excel));
// eslint-disable-next-line no-console
let wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, "test");
let o = dialog.showSaveDialog();
// eslint-disable-next-line no-console
console.log(o);
XLSX.writeFile(wb, o);
// eslint-disable-next-line no-console
//console.log(file);
})();
}
在控制台中,我得到以下错误Uncaught(In promise)TypeError:o.file.lastIndexOf不是一个函数
如果我使用以下代码
(async () => {
const data = await ProjectController.getProject(id);
const ws = (XLSX.WorkSheet = XLSX.utils.json_to_sheet(
JSON.parse(data.excel)
));
let wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, "test");
const file = XLSX.write(wb, {
bookType: "xlsx",
type: "buffer",
compression: true
});
let savePath = dialog.showSaveDialog({});
XLSX.writeFile(file, savePath);
fs.writeFileSync("test1.xlsx", file);
})();
然后,文件将下载到项目文件夹的根目录中,之前没有弹出窗口。但我想能够下载这个文件在一个选定的文件夹由用户
这是我的package.json
{
"name": "movie-translation-tool",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint",
"electron:build": "vue-cli-service electron:build",
"electron:serve": "vue-cli-service electron:serve",
"i18n:report": "vue-cli-service i18n:report --src './src/**/*.?(js|vue)' --locales './src/locales/**/*.json'",
"postinstall": "electron-builder install-app-deps",
"postuninstall": "electron-builder install-app-deps"
},
"main": "background.js",
"dependencies": {
"awesome-phonenumber": "^2.24.0",
"core-js": "^3.4.3",
"dropbox": "^4.0.30",
"knex": "^0.20.3",
"mssql": "^6.0.1",
"objection": "^2.0.3",
"pdf2json": "^1.2.0",
"sqlite3": "^4.1.1",
"vee-validate": "^3.1.3",
"vue": "^2.6.10",
"vue-i18n": "^8.0.0",
"vue-router": "^3.1.3",
"vue-video-player": "^5.0.2",
"vuetify": "^2.1.0",
"vuetify-image-input": "^19.1.0",
"vuex": "^3.1.2",
"xlsx": "^0.15.3"
},
"devDependencies": {
"@mdi/font": "^4.6.95",
"@mdi/js": "^4.6.95",
"@vue/cli-plugin-babel": "^4.1.0",
"@vue/cli-plugin-eslint": "^4.1.0",
"@vue/cli-plugin-router": "^4.1.1",
"@vue/cli-plugin-vuex": "^4.1.1",
"@vue/cli-service": "^4.1.0",
"babel-eslint": "^10.0.3",
"electron": "^6.0.0",
"eslint": "^5.16.0",
"eslint-plugin-vue": "^5.0.0",
"material-design-icons-iconfont": "^5.0.1",
"sass": "^1.19.0",
"sass-loader": "^10.0.0",
"vue-cli-plugin-electron-builder": "^1.4.3",
"vue-cli-plugin-i18n": "^0.6.1",
"vue-cli-plugin-vuetify": "^2.0.2",
"vue-template-compiler": "^2.6.10",
"vuetify-loader": "^1.3.0"
},
"eslintConfig": {
"root": true,
"env": {
"node": true
},
"extends": [
"plugin:vue/essential",
"eslint:recommended"
],
"rules": {},
"parserOptions": {
"parser": "babel-eslint"
}
},
"browserslist": [
"> 1%",
"last 2 versions"
]
}
如何将文件正确附加到windows?对话框方法返回解析为对象的承诺,但不返回字符串:
返回Promise
-使用包含
以下:
Boolean—对话框是否已取消cancelled
String(可选)-如果取消该对话框,则该对话框将filePath
未定义
String(可选)bookmark
mas-Base64编码字符串,其中包含已保存文件的安全范围书签数据。 必须启用securityScopedBookmarks,才能显示此功能。(用于 返回值,请参见此处的表。)macOS
exportData
,还可以将exportData
设置为异步,而不是创建内部异步函数
试着像这样重构代码:
异步导出数据(id,类型){
const data=await ProjectController.getProject(id);
const ws=XLSX.utils.json_到_表(json.parse(data.excel));
const wb=XLSX.utils.book_new();
XLSX.utils.book_-append_表(wb,ws,“测试”);
让{filePath,cancelled}=wait dialog.showsavedilog();
如果(!取消){
XLSX.writeFile(wb,filePath);
}
}
是否会弹出“保存”对话框?在主进程或渲染器进程中,在何处使用此函数?另外,请使用您的package.json
内容进行更新。第一个示例中,我有弹出窗口,但没有保存任何内容;第二个代码段中,我没有弹出窗口,文件保存在我的项目根目录中。实际上,exportData
是一种VUE方法,点击按钮即可触发。请检查我的答案,并让我知道它是否适用于您。非常感谢!在重构方面做得很好。是否可以将给定的文件名推送到弹出窗口?是的,您可以使用defaultPath
选项属性设置建议的文件名,甚至设置对话框的路径(例如wait dialog.showsavedilog(null,{defaultPath:“Project data.xls”})
)<代码>默认路径字符串(可选)-默认使用的绝对目录路径、绝对文件路径或文件名。