背景

前端点击导出excel按钮后,请求完需要导出的数据后发送给主进程electron,由主进程保存到本地

dialog

显示用于打开和保存文件、警报等的本机系统对话框。

dialog 模块提供了api来展示原生的系统对话框,例如打开文件框,alert框,所以web应用可以给用户带来跟系统应用相同的体验.

let win = ...;  // BrowserWindow in which to show the dialog
const dialog = require('electron').dialog;
console.log(dialog.showOpenDialog({ properties: [ 'openFile', 'openDirectory', 'multiSelections' ]}));

前端代码(渲染进程)

// 引入ipcRenderer模块
const { ipcRenderer } = require('electron')
// 表格数据拟定为 data
let excelModel = new Blob([data], { type: "application/octet-stream" })

不知道 Blob 是什么的点击这里

// 创建一个FileReader的实例
let reader = new FileReader()
// 开始读取指定的Blob中的内容。一旦完成,result属性中将包含一个data: URL格式的Base64字符串以表示所读取文件的内容。
reader.readAsDataURL(excelModel)
// 处理 load 事件。该事件在读取操作完成时触发
reader.addEventListener("loadend", function() {
// reader.result 包含被转化为类型数组 typed array 的 blob
// 向主进程发送下载excel消息
ipcRenderer.send("saveDialog", {
baseCode: reader.result,
fileType: 'excel',
fileName: '封神榜'
})
// 接收主进程发送回来的下载成功回调
ipcRenderer.once('succeedDialog', event => {
// 成功回调
})
// 接收主进程发送回来的下载失败回调
ipcRenderer.once('defeatedDialog', event => {
// 失败回调
}) })

不知道 FileReader 是什么的点击这里

electron代码(主进程)

// 创建BrowserWindow实例
let win = new BrowserWindow(browser)
// 引入dialog、ipcMain、fs模块
const { dialog, ipcMain } = require('electron')
const fs = require('fs')
// 定义文件下载扩展名选择
const extensionType = {
// 图片
images: [
{ name: '.jpg', extensions: ['jpg'] },
{ name: '.png', extensions: ['png'] },
{ name: '.gif', extensions: ['gif'] },
],
// Excel
excel: [
{ name: '.xlsx', extensions: ['xlsx'] },
{ name: '.xls', extensions: ['xls'] },
]
}
//在主线程下,通过ipcMain对象监听渲染线程传过来的saveDialog事件
ipcMain.on('saveDialog', (event, arg) => {
// 打开弹窗
dialog.showSaveDialog(win, {
// 在 Windows 和 Linux 上, 打开对话框不能同时是文件选择器和目录选择器, 因此如果在这些平台上将 properties 设置为["openFile"、"openDirectory"], 则将显示为目录选择器。
properties: ['openFile', 'openDirectory'],
// 默认情况下使用的绝对目录路径、绝对文件路径、文件名
defaultPath: arg.fileName,
// 文件下载扩展名
filters: [
...extensionType[arg.fileType]
],
// 点击保存回调
}, filePath =>{
// filePath存在则为保存路径 否为undefined
// 去掉头部无用字段并将base64转码成buffer
let dataBuffer = Buffer.from(arg.baseCode.split('base64,')[1], 'base64')
// 检测文件扩展名是否正确
let typeFlag = extensionType[arg.fileType].some(item => {
if(filePath) {
return item.extensions[0] === filePath.substring(filePath.lastIndexOf('.') + 1)
} else {
return false
}
})
if(typeFlag){
fs.writeFile(filePath, dataBuffer, err => {
// 失败
if (err) {
// 向渲染进程发送消息通知失败
win.webContents.send('defeatedDialog')
}
})
// 成功 向渲染进程发送消息通知成功
win.webContents.send('succeedDialog')
// 判断是否存在保存路径
} else if(filePath !== undefined){
dialog.showMessageBox({
type: 'error',
title: '系统提示',
message: '系统检测出文件类型异常,请检查并重新选择或填写'
})
}
})
})

之所以在确定后再次对文件的扩展名进行判断,是因为传入excel的文件扩展名仍然可以保存其他扩展名,如.jpg,具体原因作者也不太清楚>﹏<,以后知道后会更新的。。。

以上仅供参考,如有问题欢迎指出,但我不一定改(~ ̄▽ ̄)~

文章原创 转载附带原创链接

参考

electron-dialog

electron中recorderJs导出blob对象,并使用node保存到本地

electron——dialog(实现导出excel)的更多相关文章

  1. NPOI、MyXls、Aspose.Cells 导入导出Excel(转)

    Excel导入及导出问题产生: 从接触.net到现在一直在维护一个DataTable导s出到Excel的类,时不时还会维护一个导入类.以下是时不时就会出现的问题: 导出问题: 如果是asp.net,你 ...

  2. DataGridView如何快速导出Excel

    从DataGridView或DataTable导出Excel文件,为了按照数据类型设置单元格格式,导出Excel时速度都比较慢,一直找不到好的办法. 最后从外文网站上找到解决办法,使用ws.get_R ...

  3. asp.net mvc4 easyui datagrid 增删改查分页 导出 先上传后导入 NPOI批量导入 导出EXCEL

    效果图 数据库代码 create database CardManage use CardManage create table CardManage ( ID ,) primary key, use ...

  4. Java使用POI导出excel(下)——实例与小技巧

    [更新]:thinkgem的导出工具类: /** * Copyright © 2012-2016 <a href="https://github.com/thinkgem/jeesit ...

  5. 选择性导出excel表中内容

    package com.huawei.utils; import java.io.FileNotFoundException;import java.io.FileOutputStream;impor ...

  6. 网页表格导入导出Excel

    用JS实现网页表格数据导入导出excel. 首先是JS文件中的代码 (function($){ function getRows(target){ var state = $(target).data ...

  7. Java web项目 上传图片保存到数据库,并且查看图片,(从eclipse上移动到tomact服务器上,之路径更改,包括显示图片和导出excel)

    //项目做完之后,在本机电脑运行完全正常,上传图片,显示图片,导出excel,读取excel等功能,没有任何问题,但是,当打成war包放到服务器上时,这些功能全部不能正常使用. 最大的原因就是,本机测 ...

  8. C#使用Aspose.Cells导出Excel简单实现

    首先,需要添加引用Aspose.Cells.dll,官网下载地址:http://downloads.aspose.com/cells/net 将DataTable导出Xlsx格式的文件下载(网页输出) ...

  9. 利用poi导出Excel

    import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.r ...

随机推荐

  1. Arduino学习笔记② Arduino语言基础

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  2. ESP8266开发之旅 网络篇⑤ Scan WiFi——ESP8266WiFiScan库的使用

    1. 前言     现在,通常,为了让手机连上一个WiFi热点,基本上都是打开手机设置里面的WiFi设置功能,然后会看到里面有个WiFi热点列表,然后选择你要的连接上. 基本上你只要打开手机连接WiF ...

  3. <Machine Learning - 李宏毅> 学习笔记

    <Machine Learning - 李宏毅> 学习笔记 b站视频地址:李宏毅2019国语 第一章 机器学习介绍 Hand crafted rules Machine learning ...

  4. 在.Net Core 3.0中尝试新的System.Text.Json API

    .NET Core 3.0提供了一个名为System.Text.Json的全新命名空间,它支持reader/writer,文档对象模型(DOM)和序列化程序.在此博客文章中,我将介绍它如何工作以及如何 ...

  5. LaTeX常用篇(一)---公式输入

    目录 1. 序言 2. 命令介绍 3. 公式输入 3.1 无编号公式 3.2 有编号公式 更新时间:2019.10.02 1. 序言   当我们首次在文档中输入公式的时候,我们首先想到的是word,毕 ...

  6. 包+time+datetime+random+hashlibhmac+typing+requests+re模块(day17整理)

    目录 昨日内容 os模块 sys模块 json模块 pickle模块 logging模块 今日内容 包 相对导入 绝对导入 time模块 sleep 时间戳 time 格式化时间 strtime 结构 ...

  7. [apue] 如何处理 tcp 紧急数据(OOB)?

    在上大学的时候,我们可能就听说了OOB(Out Of Band 带外数据,又称紧急数据)这个概念. 当时老师给的解释就是在当前处理的数据流之外的数据,用于紧急的情况.然后就没有然后了…… 毕业这么多年 ...

  8. 服务器配置:ECS+Nginx+uWSGI+Flask——各部分详细介绍

    希望在阿里云ECS上搭建一个flask框架的web应用,经典的形式便是flask+uWSGI+nginx模式 服务器:CentOS 7.3 python版本:3.8.0 先贴一张全局图,这张图很清楚的 ...

  9. DB2中的MQT优化机制详解和实践

    MQT :物化查询表.是以一次查询的结果为基础  定义创建的表(实表),以量取胜(特别是在百万,千万级别的量,效果更显著),可以更快的查询到我们需要的结果.MQT有两种类型,一种是系统维护的MQT , ...

  10. 学习笔记04IIS

    IIS机制:1.能监听端口,获取socket的客户端对象2.获取请求报文,将请求报文变成对象.3.处理请求报文,通过HttpApplication.ProcessRequest方法来处理HttpCon ...