【后端开发实习】用Node.js从mongodb中读取数据并转换为excel和pdf
提供excel转换接口
基本思路
- 从MongoDB中读取数据,此时的数据格式是JSON。
- 调用Node.js中封装好的库将JSON格式的数据转换成Excel格式的数据。
- 向前端提供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转换接口
基本思路
- 将上一步实现的数据导入。
- 使用pdf-kit工具实现对pdf文档的操作。
- 将文档下载链接提供给用户。
有关于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) // width await doc.table(table, { width: 300, }); // or columnsSize await doc.table(table, { columnsSize: [ 200, 100, 100 ], }); // done! doc.end(); return doc; }
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。