uniapp开发小程序excel导出(亲测可用,前后端代码都有)
uniapp开发小程序excel导出(亲测可用,前后端代码都有)在微信开发者工具和小程序端都可以打开excel,需要前后端(node.js)一起配合完成。前端接受后端传回的二进制流格式文件,如下1.前端在button按钮的事件中写入请求1.1 notice:下面url的域名我用百度代替了,需要传入你自己的域名,这个域名需要在你自己的小程序中 左边找 开发---->开发管理----->服
·
uniapp开发小程序excel导出(亲测可用,前后端代码都有)
在微信开发者工具和小程序端都可以打开excel,需要前后端(node.js)一起配合完成。
前端接受后端传回的二进制流格式文件,如下
1.前端在button按钮的事件中写入请求
1.1 notice:下面url的域名我用百度代替了,需要传入你自己的域名,这个域名需要在你自己的小程序中 左边找 开发---->开发管理----->服务器域名配置,添加你要使用的服务器url。
1.2filepath为配置的xlsx表名,例如xx人xx项目 开始时间—结束时间.xlsx
wx.request({
url:`https://baidu.com:3006/api/pop_center/export_excel?start=${obj.start_time}&&end=${obj.end_time}
&&project_id=${obj.project_id}&&by_issue_id=${obj.by_issue_id}`,
method: "GET",
responseType: "arraybuffer", //此处是请求文件流,必须带入的属性
success: rest => {
console.log(rest)
if(rest.statusCode === 200){
const fs = wx.getFileSystemManager(); //获取全局唯一的文件管理器
fs.writeFile({ // 写文件
filePath: wx.env.USER_DATA_PATH + `/${item_only}-${person_only}${obj.start_time}——${obj.end_time}.xlsx`, // wx.env.USER_DATA_PATH 指定临时文件存入的路径,后面字符串自定义
data: rest.data,
encoding: "binary", //二进制流文件必须是 binary
success (res){
wx.openDocument({ // 新开页面打开文档
filePath: wx.env.USER_DATA_PATH + `/${obj.start_time}——${obj.end_time}.xlsx`, //拿上面存入的文件路径
success: function (res) {
setTimeout(()=>{wx.hideLoading()},500)
}
})
}
});
}
}
})
2.后端node.js编辑xlsx表内容格式
2.1 先下载依赖包,引入schema和增删改查的文件。
2.2 下面是用来计算持续时间的,在下方有示例。
2.3 在数据库表中查出数据以后在编辑成数组套数组的格式,然后用xlsx.build()即可生成二进制流文件形式的xlsx表。
const dayDif = (date1, date2) => Math.ceil(Math.abs(date1.getTime() - date2.getTime()) / 86400000)
var express = require('express');
var router = express.Router();
var xlsx = require('node-xlsx');
var fs = require('fs');
var Task_listSchema = require('../../../model/Task_listSchema');
var sql = require("../../../model/index")
stream = require('stream')
const dayDif = (date1, date2) => Math.ceil(Math.abs(date1.getTime() - date2.getTime()) / 86400000)
/* GET home page. */
router.get('/', function (req, res) {
//
console.log(req.query)
Task_listSchema.find({ project_id: req.query.project_id, by_issue_id: req.query.by_issue_id, "start": { "$gte": req.query.start, "$lte": req.query.end } }, function (err, docs) {
if (docs.length != 0) {
let array1 = [];
let newarr = [];
let itemarr = ["项目名称", "发起人", "接收人", "时长", "状态", "任务详情", "任务开始时间", "任务结束时间"]//状态,接收人by_issue_name,时长last_time,发起人issue_name
for (let j = 0; j < docs.length; j++) {
array1[0] = docs[j].project_name
array1[1] = docs[j].issue_name
array1[2] = docs[j].by_issue_name
// 计算2个日期之间相差多少天
if(dayDif(new Date(docs[j].start), new Date(docs[j].end)) == 0){
array1[3] = "1天"
}else{
array1[3] = dayDif(new Date(docs[j].start), new Date(docs[j].end))+"天"
}
if(docs[j].state == -1){
array1[4] = "未确认"
}else if(docs[j].state == 0){
array1[4] = "已确认"
}else if(docs[j].state == 1){
array1[4] = "已完成"
}else if(docs[j].state == 2){
array1[4] = "未完成"
}else if(docs[j].state == 3){
array1[4] = "已反馈"
}
// array1[4] = docs[j].state
array1[5] = docs[j].task_details
array1[6] = docs[j].start
array1[7] = docs[j].end
newarr.push(array1)
array1 = []
}
var list = [{
name: docs[0].project_name,
data: [
itemarr,
...newarr
]
}];
var buffer = xlsx.build(list);
res.set('Content-Type', 'application/octet-stream;charset=utf-8;');
res.set("Content-Disposition", `attachment;filename=${encodeURIComponent('结果呢')}.xlsx`);
let readStream = new stream.PassThrough();
readStream.end(buffer);
readStream.pipe(res);
return;
} else {
res.json({
data: [],
meta: {
msg: "目前没有任务。",
status: 417
}
})
}
});
// console.log("1221")
})
module.exports = router;
status: 417
}
})
}
});
// console.log("1221")
})
module.exports = router;
大概就这些了,若有什么不懂得可以交流。
更多推荐
已为社区贡献2条内容
所有评论(0)