首页 > 其他分享 >基于exceljs的前端多级表头的导出

基于exceljs的前端多级表头的导出

时间:2024-05-16 18:09:45浏览次数:10  
标签:index const exceljs 多级 表头 prop header label data

磨了两天半磨出来的功能

exceljs官网

https://github.com/exceljs/exceljs/blob/HEAD/README_zh.md

贴个demo图

 

上代码:

引入:

import ExcelJS from 'ExcelJS';

 

数据:

 data() {
        return {
            tableColumn: [
                { prop: 'a', label: 'pos码' },
                { prop: 'b', label: '门店' },
                { prop: 'c', label: '日期' },
                {
                    prop: 'd', label: '类型', children: [
                        { prop: 'x', label: '类型1' },
                        { prop: 'x', label: '类型2' },
                    ]
                },
                { prop: 'e', label: '分类' },
                {
                    prop: 'f', label: '总金额', children: [
                        { prop: 'g', label: '支付宝' },
                        { prop: 'h', label: '微信' },
                        { prop: 'i', label: '银行卡' },
                        { prop: 'j', label: '挂账', },
                    ]
                },
            ],
            list: [
                { a: '233', b: '毁三代点点', c: '2024-02-02', d: '果蔬类', e: '大类', f: '500', g: 100, h: 200, i: 250, k: 230, l: 80 },
                { a: '233', b: '毁三代点点', c: '2024-02-02', d: '果蔬类', e: '大类', f: '500' },
            ],
            letterMap: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N'],
        }
    },

方法:

methods: {
        async exportExcel() {
            /* eslint-disable */
            const workbook = new ExcelJS.Workbook();
            const sheet = workbook.addWorksheet("sheet1");  // 新建工作表
            let deepLength = 0;
            const columnsList: Array<{ header: string, key: string, width?: number }> = [];
            const header = [];
            const checkedLength = (data) => {
                if (data.children) {
                    deepLength += 1;
                    header.push([]);
                    data.children.map((x) => {
                        checkedLength(x);
                    });
                } else {
                    columnsList.push({ header: data.label, key: data.prop });
                }
            }
            this.tableColumn.map((x) => {
                checkedLength(x);
            });
            this.sheet.columns = columnsList; // 设置表头

            const setHeader = (data, deepNumber) => {
                if (data.children) {
                    deepNumber++;
                    data.children.map((x) => {
                        setHeader(x, deepNumber);
                    });
                    const titleLength = header[deepNumber - 1].length - JSON.parse(JSON.stringify(header[deepNumber - 1])).reverse().findIndex((x) => x);
                    header[deepNumber - 1][titleLength] = data.label;
                } else {
                    for (let i in header) {
                        if (i == deepNumber) {
                            header[i].push(data.label);
                        } else {
                            header[i].push('');
                        }
                    }
                }
            };
            this.tableColumn.map((x) => {
                let deepNumber = 0;
                setHeader(x, deepNumber);
            });
            header.map((x, index) => {
                sheet.getRow(index + 1).values = x;
            })
            header.map((x, index) => {  // 合并表头
                x.map((y, indexY) => {
                    if (y) {
                        // 横向合并
                        let endNumber = index;
                        for (let i = index; i < deepLength; i++) {
                            if (header[i + 1] && header[i + 1][indexY]) break;
                            endNumber = i + 1;
                        }
                        if ((endNumber - index) >= 1) {
                            try {
                                sheet.mergeCells(`${this.letterMap[indexY]}${index + 1}:${this.letterMap[indexY]}${endNumber + 1}`);
                                sheet.getCell(`${this.letterMap[indexY]}${index + 1}`).alignment = { vertical: 'middle' };
                            } catch (error) {
                                // console.log(error);
                            }
                        }
                        // 纵向合并
                        let rightNumber = indexY;
                        for (let i = rightNumber + 1; i < x.length; i++) {
                            if (x[i]) break;
                            rightNumber = i;
                        }
                        if ((rightNumber - indexY) >= 1) {
                            try {
                                sheet.mergeCells(`${this.letterMap[indexY]}${index + 1}:${this.letterMap[rightNumber]}${index + 1}`);
                                sheet.getCell(`${this.letterMap[indexY]}${index + 1}`).alignment = { vertical: 'middle' };
                            } catch (error) {
                                // console.log(error);
                            }
                        }
                    }
                });
            })
            this.list.map((x) => {
                sheet.addRow(x);  // 写入数据
            });
            await workbook.xlsx.writeBuffer().then((data) => {
                const blob = new Blob([data], { type: 'application/vnd.ms-excel' });
                const link = document.createElement("a"); // a标签下载
                link.href = window.URL.createObjectURL(blob); // href属性指定下载链接
                link.download = "导出.xlsx"; // dowload属性指定文件名
                link.click(); // click()事件触发下载
                window.URL.revokeObjectURL(link.href); // 释放内存
            });
        }

 

demo就这样子,正式版加了些功能,按需添加

 

参考博客

https://www.cnblogs.com/yeminglong/p/18079930

 

标签:index,const,exceljs,多级,表头,prop,header,label,data
From: https://www.cnblogs.com/lopb/p/18196428

相关文章

  • 使用同事封装好的table(使用el-table),修改表头背景色怎么实现
    花了一下午时间基本功还是比较差参考博客1首先,要修改表头颜色,需要el-table的属性:header-cell-style可以这样写:header-cell-style="{background:'#409EFF',color:'#409EFF'}"而我有两个点需要考虑1)只有部分表头需要修改颜色2)同事封装的组件,对背景颜色使用了!important解决......
  • easyExcel多行表头设定不同样式和特定单元格设定样式的实现
    前言有个需求,需要设置Excel导出的样式,样式如下图所示,有三个表头行,第一个表头行需要加粗和灰色背景,另外两个表头行使用另外的样式,并且当测试结果单元格出现x或者未通过的时候,设置其为红色字体。实现步骤写入ExcelSheet的部分代码for(Map.Entry<String,List<ExcelDTO>>entr......
  • 力扣-430. 扁平化多级双向链表
    1.题目题目地址(430.扁平化多级双向链表-力扣(LeetCode))https://leetcode.cn/problems/flatten-a-multilevel-doubly-linked-list/题目描述你会得到一个双链表,其中包含的节点有一个下一个指针、一个前一个指针和一个额外的子指针。这个子指针可能指向一个单独的双向链表,也......
  • vxe-table,设置某列不显示时,表头表体对应错乱,添加一行,定位到当前行
    key值原先绑定的是索引,应该绑strfield refreshTable(){this.tableKey= Math.random()}//添加一行<vxe-table     ref="table"     :key="tableKey">methods:{//滚动到左侧this.tableKey=+newDate()setTimeout(()=>{     ......
  • C++ 多级继承与多重继承:代码组织与灵活性的平衡
    C++多级继承多级继承是一种面向对象编程(OOP)特性,允许一个类从多个基类继承属性和方法。它使代码更易于组织和维护,并促进代码重用。多级继承的语法在C++中,使用:符号来指定继承关系。多级继承的语法如下:classDerivedClass:publicBaseClass1,publicBaseClass2,...{......
  • table固定表头和列 css实现表格固定表头
    Hello,大家好,我是站长鹏仔,本次鹏仔开发的项目中,实现出功能如图所示,固定表格的头部和左侧,在超出时滚动条滚动悬浮,之前给大家写过一次表格表头固定,是用占位的方式(https://www.sharedbk.com/post/178.html),太麻烦了,本次给大家分享一个更简单的方法。本次主要用到的css属性是粘性定位......
  • redis自学(40)什么是多级缓存
    传统缓存的问题传统的缓存策略一般是请求到达Tomcat后,先查询redis,如果未命中则查询数据库,存在下面的问题:l 请求要经过tomcat处理,tomcat的性能成为整个系统的瓶颈l Redis缓存失效时,会对数据库产生冲击  多级缓存方案多级缓存就是充分利用请求处理的每个环节,分别添加缓......
  • FineReport11 报表技巧02- 实现类Excel表头筛选功能
    背景:在报表开发中,有的需求方用习惯Excel的表头筛选时,就不太习惯帆软的特意点击报表控件进行筛选,希望报表筛选方式可以类似Excel那种直接在表头进行筛选的功能最终效果如下:实现步骤:1.1、数据集准备产品信息表:SELECT客户,产品,数量,cast(下单时间asdate)as下单时间,下单......
  • WPF多表头表格实现
    前言多表头表格是一个常见的业务需求,然而WPF中却没有默认实现这个功能,得益于WPF强大的控件模板设计,我们可以通过修改控件模板的方式自己实现它。一、需求分析  下图为一个典型的统计表格,统计1-12月的数据。   此时我们有一个需求,需要将月份按季度划分,以便能够直观地......
  • Python Flask+Pandas读取excel显示到html网页: CSS控制表格样式、表头文字居中
    前言全局说明CSS控制表格样式一、安装flask模块二、引用模块三、启动服务模块安装、引用模块、启动Web服务方法,参考下面链接文章:https://www.cnblogs.com/wutou/p/17963563Pandas安装https://www.cnblogs.com/wutou/p/17811839.htmlPandas官方API说明https://pand......