nodejs中间件xlsx.js导出excel文件使用方法封装,原创

  之前的项目一直使用的是nodejs的node-xlsx.js中间件,现在改用xlsx.js中间件。

  现在把自己封装的使用方法分享出来,和大家一起学习。

  代码很简单,轻喷。

/**
 * Created by Administrator on 2016/11/17.
 * 使用xlsx中间件,传入表头[数组],表内数据[对象数组],文件名[string]
 //var header=["姓名",'年龄','性别'];
 * var excel=[
 {name:'z3',age:16,sex:'男'},
 {name:'l4',age:20,sex:'女'},
 {name:'w5',age:24,sex:'男'},
 {name:'z6',age:23,sex:'女'},
 {name:'ss',age:10,sex:'不男不女'}
 ];
 var path='../web/xxx.xlsx';
 */
var fs=require('fs');
var os=require('os');
var xlsx=require('xlsx');
var errors=require('../libs/errors');
var underscore = require('underscore');

function createExcel(headArr,excel,filePath,callback){
    if( !headArr instanceof Array || !excel instanceof Array || typeof filePath != 'string'){
        //console.log(headArr instanceof Array ,excel instanceof Array,typeof filePath);
        return callback("创建文件方法所需参数传递错误",null);
    }else{
        var arrlen=headArr.length;
        var headObj={},//生成表头
            indexObj={};//生成表内数据
        for(var i=0;i<arrlen;i++){
            var str=String.fromCharCode(65+i)+1;
            if(i>26){
                str=String.fromCharCode(65)+String.fromCharCode(65+i-26)+1;
            }
            if(i>52){
                return callback('表头太多,请做适当删减',null);
            }
            headObj[str]={v:headArr[i]};
        }

        var indexArr=[];
        for(var e=0;e<excel.length;e++){
            for(var j=0;j<headArr.length;j++){
                var index=String.fromCharCode(65+j)+(e+2);
                indexArr.push(index);
            }
        }
        //console.log(indexObj);
        //console.log("indexArr:",indexArr);
        var excelArr=[];
        for(var r=0;r<excel.length;r++){
            var rec=excel[r];
            for(var ii in rec){
                excelArr.push(rec[ii]);
            }
        }
        //console.log('excelArr:',excelArr);
        for(var i=0; i< indexArr.length;i++){
            indexObj[indexArr[i]]={v:""};
        }
        for(var ind=0; ind< indexArr.length;ind++){
            var j=0;
            for(jj in indexObj){
                if(indexArr[ind]==jj){
                    //console.log(jj,excelArr[i]);
                    indexObj[jj].v=excelArr[j];
                    break;
                }
                j++;
            }
        }
        var refS='A1',
            refE=String.fromCharCode(65+arrlen-1)+(excel.length+1);//表中数据范围 A1:F4
        var renge={
            '!ref':refS+':'+refE
        };
        var _data=underscore.extend(headObj,indexObj,renge);
        var wb={
            SheetNames:['mySheet'],
            Sheets:{
                'mySheet':_data
            }
        };
        //console.log(wb);
        xlsx.writeFile(wb,filePath);
        callback(null,true);
    }
}
exports.createExcel = createExcel;

/*
 生成excel文件在30分钟内未被下载即从服务端删除
 setTimeout当服务器在3分钟内中止服务再恢复后要重新记录时间
 @filename excel文件名
 @callback 回调结果
 */
function deleteFile(fullPath, callback) {
    //console.log("传递的路径为:", fullPath);
    return setTimeout((function () {
        return fs.exists(fullPath, function (exists) {
            if (exists) {
                return fs.unlink(fullPath, function (err) {
                    if (err) {
                        return callback(err, null);
                    } else {
                        return callback(null, true);
                    }
                });
            } else {
                return callback(errors.NoFileExist);
            }
        });
    }), 3 * 60 * 1000);
}
exports.deleteFile = deleteFile;