UNPKG

doomi-helper

Version:

Doomisoft NodeJs Common Utilities

116 lines (114 loc) 4.9 kB
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;