Nodejs ·

nodejs实现导出excel报表

生成报表并下载是作为web应用的一个传统功能,在nodejs中,很多开发人员也提供了很多的依赖来实现这一功能。

  • js-xlsx : 目前 Github 上 star 数量最多的处理 Excel 的库,支持解析多种格式表格XLSX / XLSM / XLSB / XLS /CSV,解析采用纯js实现,写入需要依赖nodejs或者FileSaver.js实现生成写入Excel,可以生成子表Excel,功能强大,但上手难度稍大。不提供基础设置Excel表格api例单元格宽度,文档有些乱,不适合快速上手;https://github.com/SheetJS/js-xlsx
  • node-xlsx : 基于Node.js解析excel文件数据及生成excel文件,仅支持xlsx格式文件;https://github.com/mgcrea/node-xlsx
  • excel-parser : 基于Node.js解析excel文件数据,支持xls及xlsx格式文件,需要依赖python,太重不太实用;https://github.com/leftshifters/excel-parser
  • excel-export : 基于Node.js将数据生成导出excel文件,生成文件格式为xlsx,可以设置单元格宽度,API容易上手,无法生成worksheet字表,比较单一,基本功能可以基本满足;https://github.com/functionscope/Node-Excel-Export
  • node-xlrd : 基于node.js从excel文件中提取数据,仅支持xls格式文件,不支持xlsx,有点过时,常用的都是XLSX 格式。

这里我们主要介绍一下excel-export的应用。

安装

npm install excel-export

使用

nodejs使用的框架是express,koa框架也类似。

const express = require('express');
const router = express.Router();
router.get('/exportExcel/:id', function(req, res, next) {
    let conf ={};
    let fileName = "下载文件名";
    conf.name = "mysheet";//这里标识在excel底部的表名
    conf.cols = [{
        caption:'字符串',
        type:'string',
        beforeCellWrite:function(row, cellData){
            return cellData;//这里可对数据进行格式化处理,如无需处理可直接不写即可
        },
        width:28.7109375
    },{
        caption:'日期',
        type:'date',
        beforeCellWrite:function(){
            var originDate = new Date(Date.UTC(1899,11,30));
            return function(row, cellData, eOpt){
                if (eOpt.rowNum%2){
                    eOpt.styleIndex = 1;
                }
                else{
                    eOpt.styleIndex = 2;
                }
                if (cellData === null){
                    eOpt.cellType = 'string';
                    return 'N/A';
                } else
                    return (cellData - originDate) / (24 * 60 * 60 * 1000);
            }
        }()
    },{
        caption:'布尔值',
        type:'bool'
    },{
        caption:'数值',
        type:'number'
    }];
    conf.rows = [
        ['one', new Date(Date.UTC(2013, 4, 1)), true, 3.14],
        ["two", new Date(2012, 4, 1), false, 2.7182],
        ["oecom", new Date(Date.UTC(2013, 6, 9)), false, 1.61803],
        ["网站", null, true, 1.414]
    ];
    let result = nodeExcel.execute(conf);
    res.setHeader('Content-Type', 'application/vnd.openxmlformats;charset=utf-8');
    res.setHeader("Content-Disposition", "attachment; filename=" +  encodeURIComponent(fileName)+".xlsx");//中文名需要进行url转码
    res.setTimeout(30 * 60 * 1000)//防止网络原因造成超时。
    res.end(result, 'binary');
});

分析

excel-export 提供了4种类型的数据格式:数值类型,时间类型,bool,字符串(默认值)。
通过上面的代码我们可以看出,一个表格其实就是一个json值。cols属性定义列,填入了列名、类型、宽度,还提供了填入前对数据的处理函数。
rows为一个二位数组,直接按照行列方式填充excel的内容
name定义sheet的名字,可以自定义,如不填,最采用系统默认的。

有时我们一个excel表格内包含多个表,这时我们只需要对上述代码进行稍微的改变即可。

let conf1 ={};
let conf2 ={};
let conf3 ={};
let confs = [conf1,conf2,conf3];
let result = nodeExcel.execute(confs);

上面的代码示例我写了一个简易的代码,只是将每一个表格json对象存入数组,然后再通过nodeExcel.execute执行即可。

参与评论