vue-json-excel 导出Excel插件初体验

7,826 阅读6分钟

一个简单好用的vue前端导出excel的插件vue-json-excel

[github地址](GitHub - jecovier/vue-json-excel)

[npm地址](vue-json-excel - npm (npmjs.com))

一、基本使用方法

1、安装

npm install vue-json-excel

2、在main.js中引入JsonExcel
import Vue from "vue";
import JsonExcel from "vue-json-excel";
 
Vue.component("downloadExcel"JsonExcel);
3、templete 中使用
<download-excel :data="json_data">
  Download Data
  <img src="download_icon.png" />
</download-excel>

二、API参数列表

参数名参数类型描述默认值
dataArray需要导出的数据
fieldsObject要导出的JSON对象中的字段,如果没有提供,JSON中的所有属性将被导出
export-fields (exportFields)Object解决与其他组件的命名冲突问题,用于解决使用变量字段的其他组件(如 vee-validate)的问题。导出字段的工作原来与字段完全相同,
typestring文件类型 xls或者csvxls
namestring导出的文件名称data.xls
headerstring/Array表格的标题。可以是字符串(一个标题)或字符串数组(多个标题)。
title(已弃用)string/Array与header一样,为了向后兼容,我们也保留了title,但不建议使用它,因为它会与HTML5的title属性冲突。
footerstring/Array表格的页脚。可以是字符串(一个页脚)或字符串数组(多个页脚)
default-value (defaultValue)string如果某一行没有字段值时候起作用,当行没有字段值时用作回退''
worksheetstring工作表选项卡的名称'Sheet1'
fetchFunction在点击下载按钮后,开始下载之前执行的函数。回调以获取数据下载之前,如果它被设置设置了,它将在点击鼠标之后立即执行(这个过程是在开始下载之前的)。重要提示:只有在没有定义数据的情况下才有效。
before-generateFunction在生成/获取数据之前调用方法,例如:显示加载进度
before-finishFunction在下载框弹出之前调用方法的回调,例如:隐藏加载进度
stringifyLongNumBoolean字符串化长数字和小数(解决数字精度损失的问题),默认值:falsefalse
escapeCsvBoolean这将转义CSV值,以修复一些excel数字字段的问题。但这会用=" and "包装所有csv数据,以避免你不得不将这个道具设为假。默认值:truetrue

三、小案例-基本使用

template标签中
<download-excel
        types="xls"
        :data="dataArr"
        :fields="fields"
        :name="exportName"
        :worksheet="exportSheet"
        :header="exportHeader"
        :footer="exportFooter"
        :defaultValue="exportDefaultValue"
>
        <el-button type="success">导出</el-button>
</download-excel>
javaScript中
data() {
    return {
            dataArr: [
                {
                    name: '小明',
                    age: 15,
                    city: '北京市',
                    school: '北京第一中学',
                    tel: '888810001'
                },
                {
                    name: '小红',
                    age: 14,
                    city: '上海市',
                    school: '上海第一中学',
                    tel: '888810002'
                },
                {
                    name: '小强',
                    age: 13,
                    city: '深圳',
                    school: '深圳第一中学',
                    tel: '888810003'
                },
                {
                    name: '小丽',
                    age: 16,
                    city: '广州',
                    school: '广州第一中学',
                    tel: '888810004'
                }
            ],
            fields: {
                    姓名: 'name',
                    年龄: 'age',
                    城市: 'city',
                    学校: 'school',
                    电话: 'tel'
            },
            exportName: '这是文件的名称',
            exportSheet: '这是表格sheet的名称',
            exportHeader: '这是表格的标题',
            exportFooter: '这是表格的页脚',
            exportDefaultValue: '这是一个默认的数据'
    };
},

那我们看下导出的效果

1、浏览器下载的文件名

微信图片_20220530174325.png

2、表格的效果

微信图片_20220531092304.png

header和footer

header标题和footer页脚除了字符串,还可以是数组字符串,这样就可以实现多个标题和页脚 那我们改成数组试试

exportHeader: ['这是表格的标题1','这是表格的标题2'],
exportFooter: ['这是表格的页脚1','这是表格的页脚2'],

导出后的表格效果

微信图片_20220531092056.png

四、一些重要的API

fields

当我们想对数据进行稍微加工的话,可以在fields 中使用callback回调函数的形式,对字段进行格式化

如我要在电话前加上文本‘座机’修饰一下

fields: {
        姓名: 'name',
        年龄: 'age',
        城市: 'city',
        学校: 'school',
        电话: {
                field:'tel',
                callback:(value)=>{
                        return `座机:${value}`
                }
        }
},

导出后的效果为

微信图片_20220531091931.png

那导出项为数组形式的情况时呢,我们增加一项爱好hobby这个数组

dataArr: [
        {
                name: '小明',
                age: 15,
                city: '北京市',
                school: '北京第一中学',
                tel: '888810001',
                hobby:['足球','兵乓球']
        },
        {
                name: '小红',
                age: 14,
                city: '上海市',
                school: '上海第一中学',
                tel: '888810002',
                hobby:['唱歌','跳舞']
        },
        {
                name: '小强',
                age: 13,
                city: '深圳',
                school: '深圳第一中学',
                tel: '888810003',
                hobby:['画画','读书']
        },
        {
                name: '小丽',
                age: 16,
                city: '广州',
                school: '广州第一中学',
                tel: '888810004',
                hobby:['游戏','骑车']
        }
],

在fields中使用callback,把数组转成字符串导出

fields: {
        姓名: 'name',
        年龄: 'age',
        城市: 'city',
        学校: 'school',
        电话: {
                field:'tel',
                callback:(value)=>{
                        return `座机:${value}`
                }
        },
        爱好:{
                field:'hobby',
                callback:(value)=>{
                        return value.map(item=>item).join(",")
                }
        }
},

导出的效果为

微信图片_20220531091757.png

default-value

指的是如果某一行没有字段值时候起作用。当行没有字段值时用作回退。

我们试一下 新增一项数据为成绩score,但是没有给它赋值

dataArr: [
        {
                name: '小明',
                age: 15,
                city: '北京市',
                school: '北京第一中学',
                tel: '888810001',
                hobby:['足球','兵乓球'],
                score:null
        },
        {
                name: '小红',
                age: 14,
                city: '上海市',
                school: '上海第一中学',
                tel: '888810002',
                hobby:['唱歌','跳舞'],
                score:null
        },
        {
                name: '小强',
                age: 13,
                city: '深圳',
                school: '深圳第一中学',
                tel: '888810003',
                hobby:['画画','读书'],
                score:null
        },
        {
                name: '小丽',
                age: 16,
                city: '广州',
                school: '广州第一中学',
                tel: '888810004',
                hobby:['游戏','骑车'],
                score:null
        }
]

在fields中也把成绩字段导出

fields: {
        姓名: 'name',
        年龄: 'age',
        城市: 'city',
        学校: 'school',
        电话: {
                field:'tel',
                callback:(value)=>{
                        return `座机:${value}`
                }
        },
        爱好:{
                field:'hobby',
                callback:(value)=>{
                        return value.map(item=>item).join(",")
                }
        },
        成绩:'score'

}

此时注意我们的exportDefaultValue: '这是一个默认的数据'

官方说的是某一行没有该字段时起作用,所以把后三个score直接删掉,干脆就不给这个属性,有值的才会有值,没值得就用默认,导出效果也是一样的

导出试下效果

微信图片_20220531085901.png

fetch

点击下载按钮后立即执行,会在开始下载数据前执行。返回值为下载的数据。这里可以将函数定义为async函数,并在里面await暂停等待,请求数据,构造下载所需要的的数据

重要提示:只有在没有定义数据的情况下才有效

before-generate

在生成/获取数据之前调用方法,例如:显示加载进度

before-finish

在下载框弹出之前调用方法的回调,例如:隐藏加载进度

其实就是通过AJAX动态请求数据,然后在开始下载之前和开始下载之后加载loading,可以用来控制显示下载进度条。

那我们把这3个Function结合试一下

注意原有的 :data="dataArr"就可以不需要了

<download-excel
        types="xls"
        :fields="fields"
        :name="exportName"
        :worksheet="exportSheet"
        :header="exportHeader"
        :footer="exportFooter"
        :defaultValue="exportDefaultValue"
        :fetch='fetchData'
        :before-generate='beforeGenerate'
        :before-finish='beforeFinish'
>
        <el-button type="success">导出</el-button>
</download-excel>
methods: {
        fetchData() {
                return [
                        {
                            name: '小明',
                            age: 15,
                            city: '北京市',
                            school: '北京第一中学',
                            tel: '888810001',
                            hobby:['足球','兵乓球'],
                            score:null
                        },
                        {
                            name: '小红',
                            age: 14,
                            city: '上海市',
                            school: '上海第一中学',
                            tel: '888810002',
                            hobby:['唱歌','跳舞'],
                            score:null
                        },
                        {
                            name: '小强',
                            age: 13,
                            city: '深圳',
                            school: '深圳第一中学',
                            tel: '888810003',
                            hobby:['画画','读书'],
                            score:null
                        },
                        {
                            name: '小丽',
                            age: 16,
                            city: '广州',
                            school: '广州第一中学',
                            tel: '888810004',
                            hobby:['游戏','骑车'],
                            score:null
                        }
                ]
        },
        beforeGenerate() {
                console.log('开始获取数据0%');
        },
        beforeFinish() {
                console.log('数据获取完成100%,弹出下载框');
        }
}

点击导出按钮后,可以看到文件下载下来,且控制台输出了

微信图片_20220531094425.png

总结

vue-json-excel整体来说,满足我们基础的导出excel的需求,且够简单易上手!