Nodejs导出大数据到Excel

2016年11月13日 · 121 字 · 1 分钟

在实际开发中,数据导出使用频率比数据导入高得多,而数据导出时来源一般是数据库,会有上万的数据导出,如果不做特殊处理的话,会导致NodeJs进程直接被killed。
今天要提到的npm包是 xlsx-writestream,话不多说,进入正题。

npm init -y
npm install xlsx-writestream --save

//编辑executor.js
import Writer from 'xlsx-writestream';
import fs from 'fs';
export default class ExcelWriteExecutor{
 /**
 * 构造方法
 * @param path 路径
 * @param options
 */
constructor(path, options = {}) {
  this.path = path;
  options.out = path;
  this.options = options;
  this.writer = new Writer(this.path, this.options);
  this.writer.getReadStream().pipe(fs.createWriteStream(this.path));
}

addRow(row) {
  this.writer.addRow(row);
}

addRows(rows) {
  this.writer.addRows(rows);
}

 /**
 * 输出
 */
execute() {
  return new Promise((resolve)=> {
    this.writer.finalize();
      setTimeout(resolve, 50);//延迟50毫秒是因为 finalize 调用结束之后,excel打开会报错,可能是没写入完成的原因,加了延迟之后正常,延迟值根据需要自己测试可以更改
    });
  }
}
//测试代码
async function test() {
  const executor = new ExcelWriteExecutor(`${__dirname}/test-write.xlsx`);
  executor.addRow({
  '姓名': 'fff',
  '电话': '15911111111',
  '公司': 'ddaaa',
  '职位': 'ddaaaxxxx',
  '生日': '',
  '邮箱': '',
  '选择城市': '',
  '单位/公司': '',
  '职务': '',
  '具体地址': '',
  '院系班级': '',
  '常住住址': ''
});
  await executor.execute();
}

在程序执行过程中,Excel会使用stream来操作,避免了NodeJs内存占用过大问题。