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;




大概就这些了,若有什么不懂得可以交流。
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐