node+express导出excel表

前言:

       node表格导出excel的方式有好几种,现在还在持续更新的只有node-xlsx excel-export:

       (1)js-xlsx : 入口

          目前 Github 上 star 数量最多的处理 Excel 的库,支持解析多种格式表格XLSX / XLSM / XLSB / XLS / CSV,解析    采用纯js实现,写入需要依赖nodejs或者FileSaver.js实现生成写入Excel,可以生成子表Excel,功能强大,但上手难度稍大。不提供基础设置Excel表格api例单元格宽度,文档有些乱,不适合快速上手


       (2)node-xlsx :入口

         基于Node.js解析excel文件数据及生成excel文件,仅支持xlsx格式文件;

      (3)excel-parser : 入口

         基于Node.js解析excel文件数据,支持xls及xlsx格式文件,需要依赖python,太重不太实用;

      (4)excel-export : 入口

基于Node.js将数据生成导出excel文件,生成文件格式为xlsx,可以设置单元格宽度,API容易上手,无法生成worksheet字表,比较单一,基本功能可以基本满足;

      (5)node-xlrd :

         基于node.js从excel文件中提取数据,仅支持xls格式文件,不支持xlsx,有点过时,常用的都是XLSX 格式。

具体使用-excel-export

步骤一:安装插件excel-export   

cnpm i -s excel-export

步骤二:在js文件中引入

var nodeExcel = require('excel-export');

步骤三:具体使用,方法一是写固定的,方法二是查表的

/**
 * 下载excel
 * */
router.get('/excel', function(req, res){
    var name = encodeURI('测试表');
    var conf ={};
    conf.name = "aaa";//表下面名字,默认不能为中文

    /**
     * 表头数据
     * */
      let colsArr = [
                    // {
                    //     caption:'姓名',
                    //     type:'string',
                    // },{
                    //     caption:'日期',
                    //     type:'date',
                    // },{
                    //     caption:'类型',
                    //     type:'bool'
                    // },{
                    //     caption:'手机号码',
                    //     type:'number'
                    // }
                        {
                            caption:'序号',
                            type:'number',
                        },
                        {
                            caption:'id',
                            type:'string',
                        },
                        {
                            caption:'name',
                            type:'string',
                        },
                    ];
    conf.cols = colsArr;

    /**
     * 表内容数据
     * */
    let data = [
        {
            id:'1',
            name:'zwh'
        },{
            id:'222',
            name:'dddd'
        },{
            id:'839',
            name:'23ddg'
        }
    ]
    let array =[];
    for(var i=0; i<data.length; i++){
        var temp = new Array();
        temp[0] = i+1;
        temp[1] = data[i].id;
        temp[2] = data[i].name;
        array.push(temp);
    }
    conf.rows = array
    var result = nodeExcel.execute(conf);

    res.setHeader('Content-Type', 'application/vnd.openxmlformats;charset=utf-8');
    // res.setHeader("Content-Disposition", "attachment; filename=" + "Report.xlsx");
    res.setHeader("Content-Disposition", "attachment; filename=" + name + ".xlsx");

    res.end(result, 'binary');
});



/**
 * 下载table表格
 * */
router.get('/tableDown', function(req, res){
    //模糊查询的sql  SELECT * FROM  bloginformation WHERE blogTitle LIKE ? OR blogContent LIKE ? OR blogLable LIKE ?
    var params = req.query || req.params;
    let sql = "SELECT * FROM `table`";   //查询列表所有的数据
    let content = [];
    let isMore = false;//是否有多个查询参数
    if(params.name){
        // 模糊查询两种方法直接在SQL语句后加 mysql.escape("%"+req.body.name+"%")
        // sql += " WHERE product_name LIKE "+mysql.escape("%"+req.body.name+"%")
        sql += " WHERE name LIKE ?";
        content.push( "%"+params.name+"%" );
        isMore = true;
    }
    if(params.age){
        if(isMore){//true代表有多个参数
            sql += "and age like ?";//and是两个条件都必须满足,or是或的关系
        }else{
            sql += " WHERE age LIKE ?";
        }
        content.push( "%"+params.age+"%" );
    }
    if(params.page || params.page_size){//开启分页
        let current = params.page;//当前页码
        let pageSize = params.page_size;//一页展示多少条数据
        sql += " limit ?,?";
        content.push((current-1)*pageSize,parseInt(pageSize));
    }

    db.query(sql, content,function(result,fields){
        var name = encodeURI('人员表');
        var conf ={};
        // conf.name = "aaa";//表下面名字,默认不能为中文

        /**
         * 表头数据-类型必须和数据库要对的上
         * */
        let colsArr = [
            {caption:'序号',type:'number'},
            {caption:'id',type:'number'},
            {caption:'name',type:'string'},
            {caption:'age',type:'number'},
            {caption:'phone',type:'string'},
        ];
        conf.cols = colsArr;

        /**
         * 表内容数据
         * */
        let array =[];
        result.forEach((item,index)=>{
            var temp = [];
                temp.push(index);
                temp.push(item.id);
                temp.push(item.name);
                temp.push(item.age);
                temp.push(item.phone);
            array.push(temp);
        })
        conf.rows = array;
        console.log(array);
        var result = nodeExcel.execute(conf);

        res.setHeader('Content-Type', 'application/vnd.openxmlformats;charset=utf-8');
        res.setHeader("Content-Disposition", "attachment; filename=" + name + ".xlsx");

        res.end(result, 'binary');


    });

});

注意:这里是我查表拿到的数据,这里的数据类型要和表头对应的数据类型对应起来,不然下载下来的数据会出现问题

此外:参考文献
入口1

入口2 

猜你喜欢

转载自blog.csdn.net/qq_41619796/article/details/106859043