nodejs使用js-xlsx生成excel

先安装包

npm i -S xlsx
const XLSX = require('xlsx');

const _headers = [
    { key: 'id', title: 'ID' },
    { key: 'name', title: '姓名' },
    { key: 'age', title: '年龄' },
    { key: 'country', title: '国家' },
    { key: 'remark', title: '备注' }
];

const _data = [{
    id: '1',
    name: 'test1',
    age: '30',
    country: 'China',
    remark: 'hello'
}, {
    id: '2',
    name: 'test2',
    age: '20',
    country: 'America',
    remark: 'world'
}, {
    id: '3',
    name: 'test3',
    age: '18',
    country: 'Unkonw',
    remark: '???'
}];

const headers = _headers.map(({ title }) => title)
    // 为 _headers 添加对应的单元格位置
    // [ { v: 'id', position: 'A1' },
    //   { v: 'name', position: 'B1' },
    //   { v: 'age', position: 'C1' },
    //   { v: 'country', position: 'D1' },
    //   { v: 'remark', position: 'E1' } ]
    .map((v, i) => Object.assign({}, { v: v, position: String.fromCharCode(65 + i) + 1 }))
    // 转换成 worksheet 需要的结构
    // { A1: { v: 'id' },
    //   B1: { v: 'name' },
    //   C1: { v: 'age' },
    //   D1: { v: 'country' },
    //   E1: { v: 'remark' } }
    .reduce((prev, next) => Object.assign({}, prev, { [next.position]: { v: next.v } }), {});

const data = _data
    // 匹配 headers 的位置,生成对应的单元格数据
    // [ [ { v: '1', position: 'A2' },
    //     { v: 'test1', position: 'B2' },
    //     { v: '30', position: 'C2' },
    //     { v: 'China', position: 'D2' },
    //     { v: 'hello', position: 'E2' } ],
    //   [ { v: '2', position: 'A3' },
    //     { v: 'test2', position: 'B3' },
    //     { v: '20', position: 'C3' },
    //     { v: 'America', position: 'D3' },
    //     { v: 'world', position: 'E3' } ],
    //   [ { v: '3', position: 'A4' },
    //     { v: 'test3', position: 'B4' },
    //     { v: '18', position: 'C4' },
    //     { v: 'Unkonw', position: 'D4' },
    //     { v: '???', position: 'E4' } ] ]
    .map((v, i) => _headers.map(({ key }, j) => Object.assign({}, { v: v[key], position: String.fromCharCode(65 + j) + (i + 2) })))
    // 对刚才的结果进行降维处理(二维数组变成一维数组)
    // [ { v: '1', position: 'A2' },
    //   { v: 'test1', position: 'B2' },
    //   { v: '30', position: 'C2' },
    //   { v: 'China', position: 'D2' },
    //   { v: 'hello', position: 'E2' },
    //   { v: '2', position: 'A3' },
    //   { v: 'test2', position: 'B3' },
    //   { v: '20', position: 'C3' },
    //   { v: 'America', position: 'D3' },
    //   { v: 'world', position: 'E3' },
    //   { v: '3', position: 'A4' },
    //   { v: 'test3', position: 'B4' },
    //   { v: '18', position: 'C4' },
    //   { v: 'Unkonw', position: 'D4' },
    //   { v: '???', position: 'E4' } ]
    .reduce((prev, next) => prev.concat(next))
    // 转换成 worksheet 需要的结构
    //   { A2: { v: '1' },
    //     B2: { v: 'test1' },
    //     C2: { v: '30' },
    //     D2: { v: 'China' },
    //     E2: { v: 'hello' },
    //     A3: { v: '2' },
    //     B3: { v: 'test2' },
    //     C3: { v: '20' },
    //     D3: { v: 'America' },
    //     E3: { v: 'world' },
    //     A4: { v: '3' },
    //     B4: { v: 'test3' },
    //     C4: { v: '18' },
    //     D4: { v: 'Unkonw' },
    //     E4: { v: '???' } }
    .reduce((prev, next) => Object.assign({}, prev, { [next.position]: { v: next.v } }), {});

// 合并 headers 和 data
const output = Object.assign({}, headers, data);

// 获取所有单元格的位置
const outputPos = Object.keys(output);

// 计算出范围
const ref = outputPos[0] + ':' + outputPos[outputPos.length - 1];

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

// 导出 Excel
XLSX.writeFile(wb, 'output.xlsx');

参考:
Node读写Excel文件探究实践

你可能感兴趣的:(nodejs使用js-xlsx生成excel)