想用nodejs的xlsx模板實現一個小功能,可以批量解析多個excel表,且能對其中的數據進行操作后,導出新表。
主要實現功能為將多個表,每個表多個sheet中的具體一列數據由加密變成解密,這里主要是base64解密,需要解析的表放在import文件夾下,需要導出的表導出到output文件夾下,實現如下:
const fs = require('fs');
const path = require('path');
const xlsx = require('xlsx');
function parseExcel(filename) {
const workbook = xlsx.readFile('./import/'+filename); // 讀取excel文件
const sheetNames = workbook.SheetNames; //獲取表名稱數組
let wb = {
SheetNames:[],
Sheets:{}
};
// 設置頭部,根據需要修改,必須加頭部,否則后面無法獲取准確結尾單元格值
let _headers = ['title1', 'title2','title3','title4']
let headers = _headers.map((v, i) => Object.assign({}, {v: v, position: String.fromCharCode(65+i) + 1 }))
.reduce((prev, next) => Object.assign({}, prev, {[next.position]: {v: next.v}}), {});
for (let i = 0; i < sheetNames.length; i++) {
let data =xlsx.utils.sheet_to_json(workbook.Sheets[sheetNames[i]]); //通過工具將表對象的數據讀出來並轉成json
data.map((item,index)=>{ // 這里根據具體業務來進行操作
if(item['title1']!== "xxx"){
item['title2'] = new Buffer(item['title1'],'base64').toString();
}else{
item['title2'] = "";
}
})
let exportData = xlsx.utils.json_to_sheet(data); //通過工具將json轉表對象
let output = Object.assign({}, headers, exportData);//獲取表對象,包含頭
let keys = Object.keys(output);// 獲取所有的單元格名稱數組
let ref = keys[0]+':'+keys[keys.length - 2]; //定義一個字符串 也就是表的范圍,左上角:右下角
wb['SheetNames'].push(sheetNames[i]);//插入sheet名稱
wb['Sheets'][sheetNames[i]] = Object.assign({},exportData,{'!ref':ref}) //表對象,上面的sheet名稱為key,對應表對象
}
// 給文件名稱加'解密'
filename = filename.split('.')[filename.split('.').length-2]+'解密'+'.'+filename.split('.').pop();
xlsx.writeFile(wb,path.resolve(__dirname,'output',filename)); //將數據導出為excel文件
}
//讀取某個路徑下所有文件名
var readDir = fs.readdirSync("./import");
readDir.forEach(function (filename) {
let fileExtension = filename.split('.').pop().toLowerCase();
if(fileExtension === 'xlsx' || fileExtension === 'xls' ){
// 批量解析文件
parseExcel(filename)
}
})
