doomi-helper
Version:
Doomisoft NodeJs Common Utilities
116 lines (114 loc) • 4.9 kB
JavaScript
var xlsx = require('node-xlsx');
var fs = require('fs');
var path = require('path');
var uuid = require('node-uuid');
var fileBase = require('./filesystem/file');
class ExcelUtility {
constructor() {
this.exportFolder = path.join(process.cwd(),'/public/excel/');
let configfile = path.join(process.cwd(), 'excelconfig.json');
if (fs.existsSync(configfile))
this.excelConfig = require(configfile);
else
this.excelConfig = {};
}
static getInstance(){
if (!ExcelUtility.instance) ExcelUtility.instance = new ExcelUtility();
return ExcelUtility.instance;
}
///读取Excel的内容
readExcel(fileName) {
//读取文件内容
var obj = xlsx.parse(fileName);//__dirname+'/test.xlsx');
var excelObj = obj[0].data;
console.log(excelObj);
return excelObj;
}
///写Excel文件
createExcelBuffer(data, fileName, workSheetName) {
var sheetName = 'sheet1';
if (workSheetName == null) sheetName = workSheetName;
var buffer = xlsx.build([{ name: 'sheet1', data: data }]);
res.set({
"Content-type": "application/octet-stream",
"Content-Disposition": "attachment;filename=" + encodeURI(fileName)
});
fReadStream = fs.createReadStream(buffer);
fReadStream.on("data", (chunk) => res.write(chunk, "binary"));
fReadStream.on("end", function () {
res.end();
});
}
///写Excel文件
async writeExcel(data, workSheetName) {
var sheetName = 'sheet1';
if (workSheetName == null) sheetName = workSheetName;
try {
var randomFile = uuid.v4() + '.xlsx';
var fileName = path.resolve(this.exportFolder, randomFile);
let _saveDir = path.dirname(fileName);
///创建本地文件夹
if (!fs.existsSync(_saveDir)) {
if (!fileBase.mkdirsSync(_saveDir)) {
return { success: false, errorcode: 1, errmessage: 'create folder failed!' };
}
};
const buffer = xlsx.build([{ name: workSheetName, data: data }]);
fs.writeFileSync(fileName, buffer, { 'flag': 'w' });
return { successed: true, fileName: randomFile };
}
catch (err) {
return { successed: false, errorcode: 1, errmessage: err };
}
}
///导出记录集到Excel,写入
///dataRow :记录集
///exportConfig : 导出的映射配置,如没有则将dataRow直接导出
///workSheetName : 导出的Excel 文件 WorkSheet名
async recordset2ExcelFile(dataRow, exportConfig, readyDataFunc) {
var _instance = this;
//var setting = exportConfig ? excelConfig[exportConfig] : null;
let setting = exportConfig?_instance.excelConfig[exportConfig] :null;
var dataBuffer = [];
var worksheetName = "sheet1";
var fieldKey = [];
var titleRow = [];
if (setting != null) {
worksheetName = setting.worksheet == null ? "sheet1" : setting.worksheet;
////第一行导出标题行
setting.columns.forEach((field) => {
var dataOption = { type: 'title', config: exportConfig, title: field.title, field: field.name };
if (readyDataFunc != null && typeof (readyDataFunc) == "function")
dataOption = readyDataFunc(dataOption)
titleRow.push(dataOption.title);
fieldKey.push(dataOption.field);
});
}
else if (dataRow.length > 0) {
var firstRow = dataRow[0];
Object.keys(firstRow).forEach(key => {
var dataOption = { type: 'title', config: null, title: key, field: key };
if (readyDataFunc != null && typeof (readyDataFunc) == "function")
dataOption = readyDataFunc(dataOption)
titleRow.push(dataOption.title);
fieldKey.push(dataOption.field);
});
}
if (titleRow.length > 0) {
dataBuffer.push(titleRow);
dataRow.forEach((rowItem) => {
var dataRow = [];
fieldKey.forEach((field) => {
var dataOption = { type: 'data', config: exportConfig, field: field, data: rowItem, value: rowItem[field] };
if (readyDataFunc != null && typeof (readyDataFunc) == "function")
dataOption = readyDataFunc(dataOption)
dataRow.push(dataOption.value);
});
dataBuffer.push(dataRow);
})
}
var result = await _instance.writeExcel(dataBuffer, worksheetName);
return result;
}
}
exports = module.exports = ExcelUtility;