文件流导出excel且显示中文文件名
发布于 7 年前 作者 dmodaii 4847 次浏览 来自 分享
  • 文件流导出excel

重点:Content-Disposition 文件名要中文显示 参考https://blog.csdn.net/liuyaqi1993/article/details/78275396

const nodeExcel = require('node-xlsx');
const urlencode = require('urlencode');

function exportList(ctx, config, listData, excelName) {
    let excelConfig = [];
    excelConfig.push(config.map(item => {
      return item.title
    }))

    listData.forEach(list => {
      excelConfig.push(config.map(item => {
        const value = list[item.name];
        // 不一定要有value, 因为可能是自由组合的value
        return item.format && item.format(value, list) || value;
      }))
    })

    let buffer = nodeExcel.build([{name: excelName, data: excelConfig}]);
    ctx.set('Content-Type', 'application/octet-stream');
     // ctx.request.headers['user-agent']
    let name = urlencode(excelName + '_' + (+new Date()) + '.xlsx', "utf-8");
    ctx.set("Content-Disposition", "attachment; filename* = UTF-8''"+name);    
    // ctx.set("Content-Disposition", "attachment; filename="+ (+new Date()) + '.xlsx');
    ctx.body = buffer;
}

module.exports = {
  exportList: exportList
}
// config 格式
const config = [{
      name: 'userid',
      title: '用户ID',
    },{
      name: 'up_time',
      title: '状态时间',
      format: function(value) {
        return value.replace(/\.\d+/, '');
      }
    },{
      name: 'appl_status_byhand',
      // name: 'appl_status_byhand_desc',
      title: '人审状态',
      format: function(value) {
        return value && manualStatus[value] &&  manualStatus[value].text || '-'
      }
    },{
      name: 'available_quota/credit_quota',
      title: '剩余额度/授信额度',
      format: function(value, item) {
        return `¥${item.available_quota/100 || 0}/¥${item.credit_quota/100 || 0}`
      }
    },{
      name: 'user_type_desc',
      title: '名单类型',
      format: function(value, item) {
        if(item.user_type) {
          item.user_type.forEach(user => {
            userTypeText.push(user_type_define[user] || '-');
          });
          return userTypeText.join('|');
        } else {
          return '';
        }
      }
    }]
5 回复

导出复杂的Excel建议用Excel模板引擎ejsExcel

@151263 已经star, 不过对于如何使用高级的功能, readme并不清楚啊, 例如合并列, 合并表头等高级用法(虽然test/test.xlsx 为完整示例 demo, 但这是嘛吗。。。) 建议有个可以直接运行的demo啊, 用excel描述代码总是怪怪的

我们开源了一个 API 更友好的 Excel 库:https://github.com/d-band/better-xlsx

@dmodaii 直接用Excel和并列, 合并表头就可以, 可以使用VBA, 原生Excel的功能模板里面直接可以用, 只读, 隐藏工作表等等

@dmodaii 用代码画很复杂的Excel的时候, 会吐血, 随便画一下就几千行代码, 才有这种 模板引擎

回到顶部