之前的项目一直使用的是nodejs的node-xlsx.js中间件,最近的项目部署时不能使用外网,而node-xlsx.js的路径太长不能U盘复制,现在改用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;