本來只是想寫個(gè)NodeJS爬蟲,中間涉及到一點(diǎn)Excel趴拧。找了找Excel模塊溅漾,xlsx模塊在npm官網(wǎng)上搜索排名很靠前,就選了它著榴,star數(shù)還比較可觀添履。仔細(xì)了解了xlsx模塊才發(fā)現(xiàn)這玩意生成Excel文件實(shí)在太麻煩,搜索網(wǎng)上的博客脑又,那些人都是互相抄襲缝龄,代碼也不夠優(yōu)雅。得了挂谍,還是我自己造輪子吧叔壤。
注釋很詳細(xì),直接上代碼:
const XLSX = require('xlsx');
class WorkBook {
/**
* @param {Object} data Excel表格源數(shù)據(jù)口叙,格式如下:
* {
* Sheet1: [
* ['姓名', '學(xué)號(hào)', '籍貫'],
* ['lxz', '10131911', 'hunan']
* ]
* }
*/
constructor(srcData) {
this.srcData = srcData;
this.workbook = {};
this.workbook.SheetNames = [];
this.workbook.Sheets = {};
for(let item in srcData) {
this.workbook.SheetNames.push(item);
this.addSheet(item, srcData[item]);
}
}
/**
* 往Excel文件添加一個(gè)表格
* @param {string} sheetName 表格名
* @param {object} sheet 表格數(shù)據(jù)
* @returns void
*/
addSheet(sheetName, sheet) {
this.workbook['Sheets'][sheetName] = {};
let row = sheet.length;
let col = sheet[0].length;
let to = '';
for(let i=0; i<row; i++) {
for(let j=0; j<col; j++) {
let key = this.ten2twentysix(j+1) + (i+1);
this.workbook['Sheets'][sheetName][key] = {'v': sheet[i][j]};
to = key;
}
}
this.workbook['Sheets'][sheetName]['!ref'] = 'A1:' + to;
}
/**
* 10進(jìn)制轉(zhuǎn)26進(jìn)制
* @param {number} num 正整數(shù)
* @returns string
*/
ten2twentysix(num) {
let str = '';
while(num) {
let rest = num % 26;
num = (num-rest) / 26;
str += String.fromCharCode(rest + 64);
}
let twentysixNumber = '';
let len = str.length;
for(let i=len-1; i>=0; i--) {
twentysixNumber += str[i];
}
return twentysixNumber;
}
/**
* 將數(shù)據(jù)寫入Excel
* @param {string} filename 文件路徑
*/
writeFile(filename) {
XLSX.writeFile(this.workbook, filename);
}
}
module.exports = WorkBook;