李雯雯还没有猫呢

导航

vue多sheet表格导出

工作的时候碰到的需求,需要使用vue实现多sheet表格导出,自己写了个小工具sheet-export.js,分享给大家~
 
 
1、vue安装插件
 
npm install --save file-saver
npm install xlsx --save
//如果报错请下载最新版本
//比如
npm install xlsx@0.14.5 --save
或者更高

2、把sheet-export.js放入项目中

 

//sheet-export.js

import XLSX from 'xlsx';
import FileSaver from 'file-saver'
import moment from "moment";
/*
*   field:表头字段名称
*   label:表头字段名称映射值
*   list: 表格数据和sheet表名
*   list_name: 列表名
*   数据格式例子:
*       field = [ 'nick_name','user_id','created_time','day','source_name']
*       label = { nick_name: '用户名', user_id: '用户ID', created_time: '注册日期', day: '在网时长', source_name: '注册渠道' }
*       list:[
*           {
*               data:[
*                   {created_time: '2022年08月08月', day: '8天', nick_name: "测试", source_name: "测试渠道", user_id: "1111"},
*               ],
*               sheet_name:'表1',
*           }
*       ]
*       list_name:'测试列表名称'
 */


export function sheetExport(field,label,list,list_name){
    let wb = XLSX.utils.book_new();
    list.forEach(ele=>{
        const ws = XLSX.utils.json_to_sheet(
            ele.data || [],
            {
                header: field //通过设置field可以把这个field排在前头,后续截取表格的时候,把尾部不需要的剔除
            }
        )
        // 找出 这个表格的 单元格 范围
        const range = XLSX.utils.decode_range(ws['!ref'])
        // 找到worksheet中 A1,B1,C1...等设置表头的字段,替换为上方label对应的数据
        for (let c = range.s.c; c <= range.e.c; c++) {
            const header = XLSX.utils.encode_col(c) + '1'
            ws[header].v = label[ws[header].v]
        }
        XLSX.utils.book_append_sheet(wb, ws, ele.sheet_name);
    })
    const workbookBlob = workbook2blob(wb)
    FileSaver(workbookBlob, list_name + '.xlsx')
}
function workbook2blob(workbook) {
    // 生成excel的配置项
    var wopts = {
        // 要生成的文件类型
        bookType: "xlsx",
        // // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
        bookSST: false,
        type: "binary"
    };
    var wbout = XLSX.write(workbook, wopts);
    // 将字符串转ArrayBuffer
    function s2ab(s) {
        var buf = new ArrayBuffer(s.length);
        var view = new Uint8Array(buf);
        for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xff;
        return buf;
    }
    var blob = new Blob([s2ab(wbout)], {
        type: "application/octet-stream"
    });
    return blob;
}


export default
{
    sheetExport,
}

 

3、在页面中引用

 

在页面中引用
例子:index.vue中

//页面中引用
import {sheetExport} from "@/utils/sheet-export";
//接口请求数据
getListContrast(params).then(res=>{
    if(res.status == 0){
        let countList = []
        res.data.list.forEach(ele=>{
            countList.push(ele.count)
        })
     //设置表格对应的表头
        let field = ['nick_name','user_id','created_time','day','source_name']
      //表头映射关系
        let label = {
            nick_name: '用户名',
            user_id: '用户ID',
            created_time: '注册日期',
            day: '在网时长',
            source_name: '注册渠道'
        }
      //处理数据
        res.data.list = res.data.list.map(ele=>{
            ele.sheet_name = ele.time_contrast
            ele.data.forEach(item=>{
                delete item.source
                delete item.mobile
                item.created_time = moment(item.created_time * 1000).format('YYYY-MM-DD')
                item.day = item.day + '天'
            })
            return ele
        })
     //调用方法
        sheetExport(field, label, res.data.list, '注册数据列表')
    }
})

  

(如需转载,请注明出处)

 

posted on 2022-08-25 11:18  李雯雯还没有猫呢  阅读(234)  评论(0编辑  收藏  举报