前言
在使用electron-vue框架时,常会碰到输出Excel数据表,那么我们就要考虑问题了,在提供的模块中,有xlsx模块,也有better-xlsx等模块,这些模块都是能用来生成xlsx文件,xlsx是比较常用的输出Excel文件模块,better-xlsx是在xlsx模块上衍生出来的,他可以对xlsx模块原有的sheet和cell进行颜色、长度等美观化操作,两个输出Excel文件的模块都有各自的优缺点,xlsx输出Excel文件更小,better-xlsx输出Excel文件更大,但比较美观。
具体这两种生成Excel文件的模块的用处,就不用重复一遍用法了,在百度、谷歌有很多例子,可以使用,下面我主要说说我在使用者两个模块中遇到的问题。如果要做持续的大数据输出,时间比较长的需求,那么使用这两个模块输出生成Excel文件就有弊端,他们的操作都会读取文件再写数据,随着输出数据的增大,导致输出Excel文件增大,此时,在写入数据就会变得困难,而且占用CPU内存会飞快上升,导致最后软件卡死。
那么有啥办法可以输出大数据的Excel文件,同时使得CPU内存不上升,软件不卡顿呢,那么可以使用输出csv文件。 csv文件也是可以使用Excel软件打开的一种文件格式,它相当于输出单页的xlsx,没有sheet,直观上可以理解是.txt文件上划上格子。
正文:输出csv文件操作过程:
- 设计输出csv文件输出类
LogUtils.js文件
const remote = require('electron').remote;
const fs = remote.require('fs');
import store from '../store'
export class LogUtils {
constructor(path, jsonPath, objsArr) {
this.objsArray = objsArr // 存储数据数组
this.decoderLogPath = path // .csv路径
this.jsonPath = jsonPath // json数据
this._InitDecoderLogFeild(this.objsArray, this.jsonPath); //初始化方法
}
WriteDecoderLog(dateTime) {
let array = new Array();
// 时间
array.push(dateTime);
// 遍历存储数据数组所有对象
this.objsArray.forEach(element => {
for (let item in element) {
array.push(element[item]);
//console.log(item, element[item]);
}
});
//关键一句,否则不会换行
array.push("\r\n");
//写入Buffer
this._WriteDecoderBuffer(array.join(','))
}
_WriteDecoderBuffer(str) {
fs.appendFile(this.decoderLogPath, str, function () {
//console.log('追加内容完成');
});
}
_InitDecoderLogFeild(objsArr, jsonPath) {
let array = new Array();
let jsonObj = null
//第一个字段为时间
array.push("时间");
// 通过json文件,获取变量所对应头名称
jsonObj = JSON.parse(fs.readFileSync(jsonPath, 'utf8').toString()); //读取的值
// 遍历头名称数组对象
objsArr.forEach(element => {
for (let item in element) {
array.push(jsonObj[item]);
}
});
array.push("\r\n");
this._WriteDecoderBuffer(array.join(','))
}
- 使用方法
let jsonPath = "./Map.json" //表头名称的json数据,注意:Map.json数据的名称要和写入csv数据变量名称一致才能写如无误
let csvHead = [this.MyData1, this.MyData2] //写入csv的数据
this.logHandle = new LogUtils(this.fileName, jsonPath, csvHead); //this.fileName是保存.csv文件名称
- 想要增加头列表,Map.json文件要与csv写入数据变量一致,比如
//MyData1里有变量:data1, data2
//MyData2里有变量:data3, data4
{
"data1": "data1数据列",
"data2": "data2数据列",
"data3": "data3数据列",
"data4": "data4数据列",
}