您的位置:首页 > 汽车 > 时评 > 【后端开发实习】用Node.js从mongodb中读取数据并转换为excel和pdf

【后端开发实习】用Node.js从mongodb中读取数据并转换为excel和pdf

2024/9/8 8:57:08 来源:https://blog.csdn.net/weixin_73074012/article/details/140329433  浏览:    关键词:【后端开发实习】用Node.js从mongodb中读取数据并转换为excel和pdf

提供excel转换接口

基本思路

  1. 从MongoDB中读取数据,此时的数据格式是JSON。
  2. 调用Node.js中封装好的库将JSON格式的数据转换成Excel格式的数据。
  3. 向前端提供excel文件流,前端使用axios接收并下载。

代码实现

//将从数据库中读取的json数据流转换为excel数据流
async function toexcel(){// const {FileName, data, keys} = req.body;//  let data = [{name:"杜指导",job:"司机"},{name:"甘教练",job:"篮球"},{name:"施爹爹",job:"歌王"},{name:"朱行长",job:"翻墙"}];//  let FileName = 'shoes_club';  //表名,文件名       ************参数传入//  let keys = ["name","job"]; //这里设置表头      ********参数传入let {client,db} = await connect()let collection = db.collection("goods");let json_blob = collection.find({},{_id:0, name:1, type:1, price:1, innum:0, indate:0, outnum:0, outdate:0});let data = await json_blob.toArray();//数据信息let FileName = 'goods'let keys = ["name","type","price","innum","indate","outnum","outdate"];let sheet = [];// console.log(data);if (!!data && data.length > 0) {if (!sheet[FileName]) {sheet[FileName] = {sheet: [], value: []};}sheet[FileName].sheet = keys;let values = []; //用来存储每一行json的数值,data.forEach( (item, index) => {values = [];keys.forEach( key => {values.push(item[key])});sheet[FileName].value[index] = values;});}sheet[FileName].value.unshift(sheet[FileName].sheet);let fileSheet = sheet[FileName].value;let obj = [{name: FileName, data: fileSheet}];let file = nodeXlsx.build(obj);  //这一步将符合要求的数据拼成buffer//   res.setHeader('Content-Type', 'application/vnd.openxmlformats'); //setHeader一定要写在生成buffer的下面//   res.setHeader("Content-Disposition", "attachment; filename=" + ` ${encodeURIComponent(FileName)}_${Date.now()}.xlsx`);  //不能使用中文//   res.writeHead(200);//   res.end(file);return file;// return data;
}

提供pdf转换接口

基本思路

  1. 将上一步实现的数据导入。
  2. 使用pdf-kit工具实现对pdf文档的操作。
  3. 将文档下载链接提供给用户。

有关于pdf-kit相关的内容可以参考Github官方文档
注!:如果想实现绘制一个表格,那么需要另外再安装一个叫做pdfkit-table的库。

npm install pdfkit-table

详细说明

代码实现

async function topdf(colname){//连接数据库let {db,client} = await connect();//定义集合和查询所有数据结果let collection = db.collection(colname);let result = collection.aggregate([{$project:{_id:1,name:1,type:1,price:1,nownum:{$subtract:["$innum","$outnum"]}}}]);result = await result.toArray();headers = result.keys();// table const table = {title: "Sale",subtitle: "Author:MarkZhang",headers:headers,rows:result,};// A4 595.28 x 841.89 (portrait) (about width sizes)// widthawait doc.table(table, { width: 300,});// or columnsSizeawait doc.table(table, { columnsSize: [ 200, 100, 100 ],});// done!doc.end();return doc;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com