前端代码:
var listQuery = {
page : 1,
total : 10000,
isAdvs : false
}
listQuery.pageNum = Math.ceil((parseInt(this.listQuery.totalCount) / parseInt(listQuery.total)));
if(listQuery.pageNum <= 0 ) {
this.$message({ message: '没有需要导出的数据', type: 'error' })
return false;
}
listQuery.searchData = this.searchData;
this.exportProgress = 1;
var xlsxName = '交互数据'+convertTime((new Date()).getTime(),'yyyyMMddhhmm');
const workbook = new ExcelJS.Workbook();
// 创建一个带有页眉和页脚可写的工作表
var worksheetWriter = workbook.addWorksheet(xlsxName);
worksheetWriter.columns = [
{header:'IP地址',key:'ip',width:32, style: {
border:{
top: {style:'thin',color: {argb:'a8abb2'}},
left: {style:'thin',color: {argb:'a8abb2'}},
bottom: {style:'thin',color: {argb:'a8abb2'}},
right: {style:'thin',color: {argb:'a8abb2'}}
}
},
},
{header:'归属地',key:'ip_address',width:32, style: {
border:{
top: {style:'thin',color: {argb:'a8abb2'}},
left: {style:'thin',color: {argb:'a8abb2'}},
bottom: {style:'thin',color: {argb:'a8abb2'}},
right: {style:'thin',color: {argb:'a8abb2'}}
}
},
},
{header:'时间',key:'create_time',width:32, style: {
border:{
top: {style:'thin',color: {argb:'a8abb2'}},
left: {style:'thin',color: {argb:'a8abb2'}},
bottom: {style:'thin',color: {argb:'a8abb2'}},
right: {style:'thin',color: {argb:'a8abb2'}}
}
},
}
];
for(var i=0; i<worksheetWriter.columns.length;i++) {
var cell = worksheetWriter.getRow(1).getCell(i+1)
cell.fill = {
type: 'pattern',
pattern: 'solid',
fgColor: {argb: 'E9E9EB'}
};
cell.font = {
family: 4,
size: 16,
bold: true,
vertAlign: 'middle',
};
cell.alignment={
vertical: 'middle',
horizontal: 'center',
wrapText: true
};
}
let data = await this.exportList(listQuery);
while(data.length > 0) {
for(var i in data) {
data[i].create_time = convertTime(data[i].create_time);
worksheetWriter.addRow(data[i])
}
data = await this.exportList(listQuery);
}
worksheetWriter.eachRow((row,inx) => {
if(inx > 1) {
row.height = 20;
}else {
//第一行设置高度32
row.height = 32;
}
})
workbook.xlsx.writeBuffer().then(buffer => {
saveAs(new Blob([buffer],{type:'application/octet-stream'}),xlsxName + '.xlsx')
})
},
async exportList(listQuery){
return new Promise((resolve) => {
setTimeout(async () => {
if(listQuery.pageNum <= listQuery.page) {
this.exportProgress = 0;
resolve([]);
return true;
}
let res = await this.commandHandleAjaxCloud(this.importObjectName,this.listApi,listQuery);
if(!res) {
resolve([]);
return true;
}
listQuery.page += 1;
this.exportProgress = Math.floor(((100/listQuery.pageNum) * (listQuery.page)));
this.exportProgress = (this.exportProgress >= 100) ? 0 : this.exportProgress;
resolve(res.data.list);
return true;
},100);
});
}```
后端代码:
``` ['cms/advs/interact']: async function(event){
Validator(event,'list',validata);
var map = {};
map = initSearchData(event.searchData,map);
if(map.ip_address) {
map.ip_address = new RegExp(`${map.ip_address}`);
}
var total = !event.total ? 10 : event.total;
var page = !event.page ? 1 : event.page;
// var offset = total * (page - 1);
var order = (!event.order || event.order.length === 0) ? ['create_time','desc'] :event.order;
var n = Math.ceil(total / 1000);
var i = 0;
let res = [];
do{
i++;
var p = parseInt(n * (page - 1)) + i;
var offset = Math.floor(total / n) * (p - 1);
console.log(n,i,p,page,offset)
res = await db.collection('advs_hit').where(map).orderBy(...order).skip(offset).limit(total).get();
}while(i < n)
let totalCount = await db.collection('advs_hit').where(map).count();
let advs = [];
if(event.isAdvs) {
advs = await db.collection('advs').where({status:1}).limit(1000).get();
}
return success({
list : res.data||[],
totalCount : totalCount.total,
advs : advs.data||[],
});
}```