公司在后台管理系统开发中用到了 vue+element-ui 组合的框架,但随着需求的越来越复杂,前端的工作难度也呈几何倍数递增,工作量随之增大。这不,在项目中增加一个将列表数据导出为excel的需求就紧跟着来了。

不光将数据导出,还得支持单笔导出或多笔批量导出。

前端:前端招谁惹谁了?

产品:入了前端门,生是前端人,死是前端鬼!

前端:

产品:

为了生活,我们已经殚精竭虑;为了工作,我们已经竭尽全力!

有需求,哭着也得实现啊。于是上网搜了一通,果然让我发现了解决之道:xlsx、file-saver和script-loader。

接下来就说说具体的实现方法:

上边提到了三个插件:xlsx、file-saver和script-loader,对,你没看错,就是三个插件,实现一个功能,需要三个插件,没办法啊。就像你的银行卡要用六位数的密码来保护两位数的余额一样,你有什么办法呢?谁让你败家呢?

一、 安装三个依赖项

npm install -S file-saver
npm install -S xlsx
npm install -D script-loader

二、在项目中新建一个文件夹(一般在src下新建,文件名自取,在这里命名为excel),在文件夹中放入Blob.js 和 export2Excel.js (这两个文件可在gitup上进行下载)

三、vue组件调用(由于项目中很多页面都会用到,所以我就封装成了公共的方法)

import html2Canvas from 'html2canvas'
import JsPDF from 'jspdf' /*
* 导出excel
* @param { Array } params.excelHeader 导出excel的表头
* @param { Array } params.excelFilterVal 导出数据所需的字段(multipleSelection或defaultList对象的属性)
* @param { Array } params.multipleSelection 导出勾选的单笔或多笔数据
* @param { Array } params.defaultList 默认导出列表所有数据
* @param { Array } params.fileName 导出excel的文件名
*/
export function export2Excel(params){
let excelHeader = params.excelHeader || ['类型', '合同号', '账户名', '币种', '金额']
let excelFilterVal = params.excelFilterVal || ['type', 'contractCode', 'accountName', 'currency', 'amount'] require.ensure([], () => {
let { export_json_to_excel } = require('@/excel/Export2Excel'); //默认为导出全部列表,也可以单笔导出或勾选多笔批量导出
let listArr = params.multipleSelection.length > 0 ? JSON.parse(JSON.stringify(params.multipleSelection)) : JSON.parse(JSON.stringify(params.defaultList));
let formatData = formatJson(excelFilterVal, listArr);
export_json_to_excel(excelHeader, formatData, params.fileName);
})
} function formatJson(excelFilterVal, listArr) {
return listArr.map(v => {
switch(v.type){
case '01':
v.type = '小贷';
break;
case '02':
v.type = '租赁';
break;
case '03':
v.type = '电商';
break;
} return excelFilterVal.map(j => v[j]);
})
}

说明:

1、以上代码在文件路径上用到了“@”符号,不懂的同学可自行查阅资料;

2、以上代码用到了JSON.stringifyJSON.parse,主要是因为对象的引用的问题。我们都知道,在将一个对象赋值给另一个对象时,如果其中一个对象的某个属性值被修改了也会影响到另一个对象的某个属性值的改变,这是因为他们在内存中实际上是指向了同一个引用地址,所以我就先用JSON.stringify将目标对象(这里是一个数组,数组也是Object对象,没毛病)转变成一个字符串,让其在内存中开辟一个新的地址,这样就切断了引用对象的指针联系,然后再用JSON.parse将字符串转变为一个数组,就解决了引用对象之间互相影响的问题。导出excel方法中调用的formatJson函数中的type字段映射的文字跟页面中映射的文字稍微不同(formatJson函数修改的是listArr数组,而listArr数组是通过页面展示的默认数组defaultList或用户选择的数据数组multipleSelection赋值得来的),就会出现一个对象对另一个对象的影响,因此不得不使用了JSON.stringifyJSON.parse

3、关于multipleSelection,这个是用了element-ui中el-table的多选功能。正是这个功能才是能实现单笔导出或多笔批量导出的关键,当选择了单笔或多笔时,multipleSelection存储的就是你选择的数据(详见element-ui的表格组件API),然后判断该数组是否为空,若为空,则默认导出列表的所有数据,若不为空,则导出选择的列表数据:

let listArr = params.multipleSelection.length > 0 ? JSON.parse(JSON.stringify(params.multipleSelection)) : JSON.parse(JSON.stringify(params.defaultList));

4、网上还有其他解决方案,详见vue2.0 + element UI 中 el-table 数据导出Excel等等,此类方案倒没有本文的解决方案那么麻烦,但有一个问题就是无法自行选择具体导出表格哪些列的数据,它是一股脑将表格的所有数据都导出了,包括对表格数据的一些按钮操作如修改按钮、删除按钮等,甚至将表格第一列的checkbox复选框也导出了,虽然插件xlsx 有一个参数display为true时可以将隐藏的行和单元格的数组不被解析(具体使用方法没有用过,不甚了解),但如果将表格的行或单元格设置为隐藏,那我们还在页面中展示数据干嘛?显然,这种解决方案虽然简单,但灵活度不够,适用于比较简单的只展示数据的表格的导出。

本文参考:

https://blog.csdn.net/xiaoshihoukediaole/article/details/81296327

https://www.jianshu.com/p/6edf74f65fc1

vue将指定区域的表格数据或element-ui中el-table的数据单笔或多笔批量导出excel的更多相关文章

  1. IOS开发数据存储篇—IOS中的几种数据存储方式

    IOS开发数据存储篇—IOS中的几种数据存储方式 发表于2016/4/5 21:02:09  421人阅读 分类: 数据存储 在项目开发当中,我们经常会对一些数据进行本地缓存处理.离线缓存的数据一般都 ...

  2. IFC构件位置数据与revit模型中对应构件位置数据对比

    IFC构件位置数据与revit模型中对应构件位置数据对比

  3. 在vue中关于element UI 中表格实现下载功能,表头添加按钮,和点击事件失效的解决办法。

    因为在element 中表格是使用el-table的形式通过数据来支撑结构,所以,表格的样式没有自己写的灵活,所以有了没法添加按钮的烦恼.下面是解决的方法. 准备工作: 一.下载npm安装包两个 1. ...

  4. vue实现多语言国际化(vue-i18n),结合element ui、vue-router、echarts以及joint等。

    老板说我们的项目要和国际接轨,于是乎,加上了多语言(vue-i18n).项目用到的UI框架是element ui ,后续echarts.joint等全都得加上多语言. 一.言归正传,i18n在vue项 ...

  5. vue+element ui中select组件选择失效问题原因与解决方法

    codejing 2020-07-10 09:13:31  652  收藏 分类专栏: Web Vue Element UI 版权 .当表单form赋完值后,如果后续又对form中某一属性值进行操作如 ...

  6. 【poi】用POI新建一个xlsx文件【或者说将数据存入到xlsx中】/【将数据从xlsx中获取到项目中】

    第一部分:写入xlsx中 使用POI创建一个xlsx文件: 项目结构如下: 具体使用的POI中的 XSSFWorkbook   xlsx对象 Sheet 工作簿对象 Row 行对象 Cell  单元格 ...

  7. Element Ui中table实现表格编辑效果

    主要以css实现 .tb-edit .el-input, .tb-edit .el-input-number, .tb-edit .el-select { display: none; width: ...

  8. element ui中循环出来的表格勾选问题

    需求是这样的,一个房主屋里面有多个电表,每一个表是一个账户,一次只能给一个账户缴费,在点击go按钮进行缴费,这个时候判断是否跨表勾选,跨表格勾选则弹窗提示,反之符合需求,走缴费逻辑 上代码 <! ...

  9. vue学习笔记(二): 添加 element ui 插件

    一.加载 ui element vue add element 加载过程及成功结果如下 > vue add element>

随机推荐

  1. [Kubernetes]浅谈容器网络

    Veth Pair 这部分内容主要介绍一个设备: Veth Pair . 作为一个容器,它可以声明直接使用宿主机的网络栈,即:不开启 Network Namespace .在这种情况下,这个容器启动后 ...

  2. java学习笔记05-运算符

    算数运算符 +:相加 -:相减 *:相乘 /:相除 %:取余 ++:自增 --:自减 public static void main(String[] args) { int i = 10; int ...

  3. express 实践

    截图: 这个项目的数据是根据之前瓜子网爬虫爬的北京区数据 express + mongodb + pug(jade) + flex.css: 项目地址: https://github.com/uust ...

  4. 【原创】大叔经验分享(48)oozie中通过shell执行impala

    oozie中通过shell执行impala,脚本如下: $ cat test_impala.sh #!/bin/sh /usr/bin/kinit -kt /tmp/impala.keytab imp ...

  5. [Linux]标准IO全缓冲和行缓冲

    概述 标准IO中,标准错误是不带缓冲的.若是指向终端设备的流才是行缓冲的,否则是全缓冲的. 行缓冲也可以分配缓冲区,当遇到超大行(超过缓冲区的行),缓冲区内容也会优先刷出. 示例 #include & ...

  6. Lesson 2-4(字典)

    2.7 字典 &.字典是许多值的集合,索引可以使用许多不同的数据类型,不只是整数,可以是数.字符串或元组. &.字典的索引被称为“键”,键及其关联的值称为“键-值”对,这种键-值对也称 ...

  7. Linux 常用命令介绍

    介绍常用命令,在忘记时便于即使查询 复制.移动.删除     cp.mv.rm.pwd 1. CP 介绍 用法:CP [-adfilprsu]  源文件  目标文件 参数:参数说明: -a:是指arc ...

  8. char和unsigned char--数据类型区别

    char和unsigned char --数据类型区别 除去布尔型和扩展的字符型之外,其它整型可以划分为带符号的(signed)和无符号的(unsigned)两种. 类型int.short.long和 ...

  9. 公司外网测试服务器 redis 被攻击复盘

    最近 公司外网的测试的 redis 服务器被攻击,最开始是用 docker 搭建的 直接裸奔在外网,任何域名都可以通过 ip+6379来访问,最开始想的是测试服务器也没有啥,后面直接就被人登陆进去改了 ...

  10. 利用MMdnn对比keras和mxnet

    关键字 MMdnn,keras,mxnet,resnet50 需求:想测试一下keras下model转到MXNet框架下对于同一张图片各中间层输出结果有什么差异. 一. 前期准备 1. 依赖库的选择 ...