File electron sheetjs从JSON下载生成的文件

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

我有一个带有VueJS的Electron应用程序,我尝试下载一个带有sheetjs的生成XLS,但解决方法在我的情况下不起作用。以下是我一直在尝试的:

 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
-使用包含 以下:

  • cancelled
    Boolean—对话框是否已取消
  • filePath
    String(可选)-如果取消该对话框,则该对话框将
    未定义
  • bookmark
    String(可选)
    macOS
    mas-Base64编码字符串,其中包含已保存文件的安全范围书签数据。 必须启用securityScopedBookmarks,才能显示此功能。(用于 返回值,请参见此处的表。)
您必须等待或使用
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”})
)<代码>默认路径字符串(可选)-默认使用的绝对目录路径、绝对文件路径或文件名。