![](/img/trans.png)
[英]How to insert a value from a list in excel sheet using nodeJs and excelJs
[英]Total data is not getting filled in exceljs excel sheet in nodejs
我有一个报告任务,其中所有数据都应该填写一个 excel 文件,并且应该从后端通过邮件发送给客户。 我已经使用 excel.js 编写了一个 excel 文件,它在数据较少的情况下运行良好。 如果数据比 obj 更像 2000 或更多,那么所有数据都不会填充到 excel 文件中。 以下是我尝试过的示例。
下面是其中的API。
router.get('/:type/:fromDate/:toDate',userAuth,(req,res)=>{
if(!req.query.ids) return res.send({'message':'Please send ID as query',statusCode:2});
let ids = req.query.ids.split(',');
var workbook = new Excel.Workbook();
let type = req.params.type
workbook.creator = ' 32';
workbook.lastModifiedBy = '321';
workbook.created = new Date();
workbook.modified = new Date();
workbook.views = [{
x: 0, y: 0, width: 10000, height: 20000,
firstSheet: 0, activeTab: 1, visibility: 'visible'
}]
var reportWorkSheet = workbook.addWorksheet( req.params.type +' Report', {
pageSetup: { paperSize: 9, orientation: 'landscape' }
});
if(type === 'customers'){
userCustomerReport(req,res ,ids , reportWorkSheet ,workbook );
} else if(type === 'interactions'){
userInteractionReport(req ,res, ids , reportWorkSheet ,workbook , req.params.fromDate , req.params.toDate);
} else if(type === 'allocations'){
userAllocationReport(req ,res,ids , reportWorkSheet ,workbook);
} else return res.send({'message':'Please check the request type',statusCode:2});
})
commonColomns = () => ([
{ header: 'Customer Name', key: 'cName', width: 25, style: { font: { size: 12 } } },
{ header: 'Customer Phone', key: 'cPhone', width: 35, style: { font: { size: 12 } } },
{ header: 'Customer Email', key: 'cEmail', width: 35, style: { font: { size: 12 } } },
{ header: 'Customer Company Name', key: 'cCompName', width: 18, style: { font: { size: 12 } } },
{ header: 'Assigned to name', key: 'assignedTName', width: 18, style: { font: { size: 12 } } },
{ header: 'Assigned from name ', key: 'assignedFName', width: 20, style: { font: { size: 12 } } }
]);
// here i am generation all JSON data .
function userInteractionReport(req ,res , ids ,reportWorkSheet , workbook , fromDate , toDate) {
let idString = req.query.ids.split(',');
let id =[];
idString.forEach(element => {id.push(new ObjectID(element));});
Interaction.aggregate([
{ $match:{$or: [{"assigned.toId":{$in:id}},{"assigned.fromId":{$in:id}}] ,createdTimeStamp : {$gte:Number(fromDate),$lt:Number(toDate)}} },
{ "$project": {
"assigned": 1,
"type": 1,
"priority": 1,
"customer": 1,
"customFields": 1,
"dateTime": 1,
"notes":1,
"length": { "$size": "$customFields" }
}},
{ "$sort": { "length": -1 } },
])
.then((interactions)=>{
if(!interactions[0]){
return res.send({'message':'No data found',statusCode:1 , "data":0})
}
let columns = commonColomns();
columns.push({ header: 'type', key: 'type', width: 25, style: { font: { size: 12 } } });
columns.push({ header: 'priority', key: 'priority', width: 25, style: { font: { size: 12 } } });
columns.push({ header: 'Company Address', key: 'cAddress', width: 25, style: { font: { size: 12 } } });
columns.push({ header: 'Key Decision Maker Name', key: 'kdm', width: 25, style: { font: { size: 12 } } });
columns.push({ header: 'Key Decision Maker Phone', key: 'kdmPhone', width: 25, style: { font: { size: 12 } } });
columns.push({ header: 'Date', key: 'dateTime', width: 25, style: { font: { size: 12 } } });
columns.push({ header: 'Notes', key: 'notes', width: 25, style: { font: { size: 12 } } });
for (let i = 0; i < interactions[0].customFields.length; i++) {
columns.push({ header: interactions[0].customFields[i].dName , key: interactions[0].customFields[i].dName, width: 25, style: { font: { size: 12 } } });
}
reportWorkSheet.columns = columns;
interactions.forEach(interaction => {
let assignedTo = interaction.assigned.toName ? interaction.assigned.toName : '';
let assignedFrom = interaction.assigned.fromName ? interaction.assigned.fromName : '';
let companyName = interaction.customer.company ? interaction.customer.company.name : '';
let cAddress ;
let kdm,kdmPhone ;
if(interaction.customer.company.address){
let companyAddress = interaction.customer.company.address ;
cAddress = companyAddress.street ? companyAddress.street+' ,' : '' ;
cAddress = cAddress + (companyAddress.city ? companyAddress.city + ' ,' :'' );
cAddress = cAddress + (companyAddress.state ? companyAddress.state +' ,' :'') ;
cAddress = cAddress+ (companyAddress.country ? companyAddress.country+' ,':'') ;
cAddress = cAddress + (companyAddress.pincode ? companyAddress.pincode +' ,' :'');
}
if(interaction.customer.company.kdm){
kdm = interaction.customer.company.kdm.fName;
kdmPhone = interaction.customer.company.kdm.phone;
}
let row = {
cName:interaction.customer.fName || '' + ' '+interaction.customer.lName || '',
cPhone : interaction.customer.phone.join(','),
assignedTName : assignedTo,
assignedFName : assignedFrom,
cEmail : interaction.email || ' ',
source : interaction.source || '',
type : interaction.type || '',
dateTime : interaction.dateTime ? new Date(interaction.dateTime) : '',
notes : interaction.notes || '',
priority : interaction.priority === 1 ? "High" : interaction.priority === 2 ? "Medium" : interaction.priority === 3 ? "Low" : " " ,
status : interaction.status||'',
cCompName : companyName,
cAddress : cAddress,
kdm :kdm,
kdmPhone:kdmPhone
}
for (let i = 0; i < interaction.customFields.length; i++) {
row[interaction.customFields[i].dName] = interaction.customFields[i].type === "dateTime" ? moment(interaction.customFields[i].value).format('l, h:mm:ss a') : interaction.customFields[i].value || " ";
}
reportWorkSheet.addRow(row);
});
return interactions;
}).then((interactions)=>{
writeWorkbook(workbook , req);
res.send({"messgae":"report send sucessfully" , "statusCode":0 ,"data":""})
}).catch((e)=>{
console.log(e);
})
}
function writeWorkbook(workbook , req) {
workbook.xlsx.writeFile('templates/excel/Report.xlsx')
.then(function () {
sendMail(req);
console.log("report send successfully ");
});
}
写入excel文件后,将其附加到邮件并发送。
尝试流媒体:
// pipe from stream
const workbook = new Excel.Workbook()
workbook.useSharedStrings = false
stream.pipe(workbook.xlsx.createInputStream())
但是,内存管理似乎是该库的一个持续问题(截至本回答之时)。 请参阅此 github 问题以供参考:
https://github.com/exceljs/exceljs/issues/709以及这些相关问题
你可能想使用另一个库来处理大量的 excel 文件(比如这个: Node-libxl 。顺便说一下,这个扩展是付费扩展)。
如果你会用 Python,你也可以试试OpenPyxl
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.