【后端开发实习】用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)
    // width
    await doc.table(table, { 
      width: 300,
    });
    // or columnsSize
    await doc.table(table, { 
      columnsSize: [ 200, 100, 100 ],
    });
    // done!
    doc.end();
	return doc;
}

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 05:20:10       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 05:20:10       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 05:20:10       57 阅读
  4. Python语言-面向对象

    2024-07-16 05:20:10       68 阅读

热门阅读

  1. 习题1 回文数 python、C++ 不同解法

    2024-07-16 05:20:10       28 阅读
  2. js的多线程示例

    2024-07-16 05:20:10       26 阅读
  3. 记一次使用vue连接rabbitMq

    2024-07-16 05:20:10       28 阅读
  4. 蓝易云 - 美国云端服务器最低成本方案揭示!

    2024-07-16 05:20:10       24 阅读
  5. vue3 学习笔记10 -- 父子传参

    2024-07-16 05:20:10       26 阅读
  6. 《C++ 入门:第一个小程序》

    2024-07-16 05:20:10       24 阅读
  7. 实验五:图像傅里叶变换

    2024-07-16 05:20:10       21 阅读
  8. 【Rust练习】2.数值类型

    2024-07-16 05:20:10       25 阅读