在vue+node环境下实现对数据以excel形式导出并下载

news/2024/7/21 3:52:29 标签: vue, js, node.js, excel, ajax

首先业务需求,就是在后台管理系统中可以查询当前数据表,现在要加一个功能,可以把当前查询到的数据以excel形式导出,并供管理员下载。

在这里插入图片描述

需求明确之后,我们就要进行功能的实现,这个需求主要内容在后端接口的编写,前端我们只需要展示一个按钮,绑定一个点击事件即可。

因为整个项目都是我自己写,所以后端我用的nodeexpress框架,很简洁。

将数据以excel形式导出,应该是有很多轮子可以用的,我使用的是node-xlsx,之前我写微信小程序也用云开发做过类似的需求,也是用的这个插件,还挺好用的。

npm install node-xlsx

下好之后,我们在node文件的头部引入一下。

const xlsx = require('node-xlsx');

然后我们写一下接口。

app.get('/exportExcel',async (req,res) => {

})

接口的格式大概就是这样,get请求,名字是exportExcel
然后我们写接口的内容。

app.get('/exportExcel',async (req,res) => {
    let data = [];
    let title = ['缴费名称','缴费类型','采集发票','备注','QQ','WeChat','手机号'];
    data.push(title);
    let result = await PayInfo.find();
    result.forEach(item => {
        let arrInner = [];
        arrInner.push(item.name);
        arrInner.push(item.type);
        arrInner.push(item.invoice);
        arrInner.push(item.remarks);
        arrInner.push(item.QQ);
        arrInner.push(item.WeChat);
        arrInner.push(item.phone);
        data.push(arrInner);
    });
    let buffer = xlsx.build([
        {
            name:'sheet1',
            data:data
        }
    ]);
    console.log(buffer);
    res.send(buffer);
    // fs.writeFileSync('./excel.xlsx',buffer,{'flag':'w'});

})

我给大家逐行解释一下。

首先声明了一个data数组,用来存数据的。
title数组是放excel表头的,就是第一行的数据,这个一般都是写死的,所以咱们可以根据自己的字段,写入这个title数组中。

let result = await PayInfo.find();

这个是我在请求mongodb的数据,我数据库用的mongodb,这段代码的执行结果就是,我把需要导出的数据放到了result变量中。

接下来对这个数据的一个循环,其实就是分别把每一项的每一个字段放进数组中,然后push到之前声明的data数组中。

然后我们声明了一个buffer,调用了xlsxbuild方法,build方法中传入的参数,name就是这个excel子表的名字,一般我们打开excel的时候,左下角都会显示这个子表的名字,然后data就是我们需要导出的数据,在上面我们通过循环已经处理好了。

这个build方法会把excel表转化为二进制传给buffer变量,因为我们在进行数据传输的时候,大部分都要使用二进制,尤其是这种图片音频视频文件。

然后我们给前端返回回去即可。

这里我写的比较粗糙,没有做异常处理,大家不要向我学习,还是规范一些比较好。

接下来就是前端的内容了。
我还是直接上代码,然后逐行解释。

async excel() {
  let result = await this.$http.get('http://localhost:8888/exportExcel',{
        responseType: 'arraybuffer'
 });
  let data = result.data;
  let url = window.URL.createObjectURL(new Blob([data],{
    type:"application/vnd.openxmlformats-officedocment.spreadsheetml.sheet"
  }))
  let link = document.createElement('a');
  link.style.display = 'none';
  link.href = url;
  link.setAttribute('download','excel.xlsx');
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
}

首先我们需要使用axios对后端接口进行请求。

然后result.data就是后端给我们的返回值。

下面我就是对二进制文件的下载,前端处理的方法有很多,我这里用的是Blob对象和a标签的download属性,这些具体的内容可以查一下MDN文档,都比较详细。

先通过Blobwindow对象生成了一个url地址,然后操作DOM,生成a标签,加css属性,加标签属性,触发点击事件,然后移除这个节点

基本上直接copy我这个格式就可以。

下面看一下效果:
在这里插入图片描述
点完按钮之后,就直接进行了excel文件的下载。
在这里插入图片描述
和预想的效果一摸一样。

有任何问题都可以加我联系方式交流。
QQ:505417246
微信:18331092918
微信公众号:Code程序人生


http://www.niftyadmin.cn/n/1576437.html

相关文章

关于事件冒泡和事件代理,看这一篇就够了!(上篇)

Hello,最近又准备面试了,通过前几次面试经历,有很深刻的感受,一定要注重基础,注重基础,注重基础! 不要觉得自己用了一些轮子写了一些看起来很不错的项目和功能,就一定能找到好工作。…

Java Type详解

2019独角兽企业重金招聘Python工程师标准>>> 错误可分为两种:编译时错误与运行时错误。编译时错误在编译时可以发现并排除,而运行时错误具有很大的不确定性,在程序运行时才能发现,造成的后果可能是灾难性的。 泛型的引…

关于事件冒泡和事件代理,看这一篇就够了!(下篇)

接着上篇的节奏走,上篇文章我们介绍了事件冒泡的过程及解决方法。 这期带来事件代理~~ 事件代理这个名词其实经常出现,在面试的时候,有一个高频问题,假如现在有需求,需要操作10000个DOM节点,你会怎么做&a…

learngitbranching.js过关记录

为什么80%的码农都做不了架构师?>>> http://learngitbranching.js.org/是个学习git的网站,以游戏的模式一步步教会新手如何使用git,本文是记录我在玩的过程中,复习和学习到的git命令。 --------分割线-------- 提交&a…

JS迭代器函数大全

有时,我们需要迭代数组中的元素。可以使用循环语句来处理,例如for语句。 JavaScript内置了很多数组可用的迭代方法。 我们先写一点基础代码: function isEven(x) {// 如果x是2的倍数,就返回trueconsole.log(x);return x % 2 0; } let nu…

一个CPO的心得分享:搭建风控系统道路上踩过的坑04-风险分析

风控系统和大部分的产品项目一样,最终需要对领导层汇报这个项目为公司带来了什么价值,这是评估项目成功与否的要素; 另外是哪里做的不够好,如果改善了能带来更多的价值,给出了预期才有后续资源的补充,整个项…

ES5和ES6新增的数组方法

let numbers [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]使用for…of循环迭代 你已经学过用for循环和forEach方法迭代数组。ES2015还引入了迭代数组值的for...of循环,下面来看看它的用法。 for(const n of numbers){console.log(n % 2 0 ? even : odd);使用iterato…

跟KingDZ学HTML5之四 继续探究Canvas之路径

哈哈,开始吧,这节课第一个内容是 路径。路径,顾名思义,就是俺拿着画笔,划线呗。 画图的几个步骤。 第一步:找个起点开始画图。----beginPath; 第二步 : 划线,画出自己想要的图像 。 第三步&…