欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

在node中使用xlsx-style完成excel的导出和下载,以及设置样式

程序员文章站 2022-07-04 21:19:00
...
var express = require('express');
var router = express.Router();
//const xlsx = require('xlsx');//原生的xlsx,但不支持表格的样式设置
const _ = require('lodash');//引入lodash辅助工具
const fs = require('fs');//引入fs模块用于读取文件流
const moment = require('moment');//用于时间格式的设置
const xlsx = require('xlsx-style');//选择使用xlsx-style可以设置表格样式

/* GET users listing. */
router.get('/:id', function (req, res, next) {
  console.log('接受到的result风格参数  =  ', req.params.id);
  //excel的导出
  //先定义需要导出的字段

  let _headers = ['id', 'name', 'age', 'country', 'remark']
  let _data = [{
    id: '1',
    name: '无敌浩克',
    age: '17',
    country: 'China',
    remark: 'hello'
  },
  {
    id: '2',
    name: '钢铁侠',
    age: '18',
    country: 'America',
    remark: 'world'
  },
  {
    id: '3',
    name: '灭霸',
    age: '19',
    country: 'CSH',
    remark: 'CSDN'
  },
  {
    id: '4',
    name: '美国队长',
    age: '20',
    country: 'CSH',
    remark: 'CSDN'
  }
  ];

  let headersExport = _headers

    .map((v, i) => _.assign({}, { v: v, position: String.fromCharCode(65 + i) + 1 }))

    .reduce((prev, next) => _.assign({}, prev, {
      [next.position]: {
        v: next.v, s: {
          alignment: {
            horizontal: "center",
            vertical: "center"
          }
        }
      }
    }), {});

  let dataExport = _data

    .map((v, i) => _headers.map((k, j) => _.assign({}, { v: v[k], position: String.fromCharCode(65 + j) + (i + 2) })))

    .reduce((prev, next) => prev.concat(next))

    .reduce((prev, next) => _.assign({}, prev, {
      [next.position]: {
        v: next.v, s: {
          alignment: {
            horizontal: "center",
            vertical: "center"
          }
        }
      }
    }), {});

  // 合并 headersExport 和 dataExport
  const output = _.assign({}, headersExport, dataExport);
  console.log(output.A1);
  // 获取所有单元格的位置
  const outputPos = _.keys(output);
  // 计算出范围
  const ref = outputPos[0] + ':' + outputPos[outputPos.length - 1];

  // 构建 workbook 对象
  const wb = {
    SheetNames: ['Sheet'],
    Sheets: {
      'Sheet': _.assign({}, output, { '!ref': ref })
    }
  };

  const strs = 'output.xlsx';//设置默认的文件名称
  // 导出 Excel
  xlsx.writeFile(wb, strs);//导出文件
  const buffer = fs.readFileSync(strs);//使用fs模块得到流
  fs.unlinkSync(strs);//删除生成的文件
  //返回浏览器完成下载
  res.set('Content-Type', 'application/vnd.openxmlformats');
  res.set('Content-Disposition', 'attachment; filename="OKR-' + '(' + moment(Date.now()).format('YYYY-MM-DD HH:mm:ss') + ')' + '.xlsx"');
  res.end(buffer, 'binary');
});
router.post('/userPost', (req, res, next) => {
  res.download(wb);
});

module.exports = router;