layui复杂表头数据excel纯前端导出

layui复杂表头数据excel纯前端导出

前言:
	最近需要完成一个layui复杂表头的前端导出的功能,尝试过js-xlsx,但普通版不能设置表格样式,也尝试过各位大佬魔改版,但似乎都未能解决样式问题,遗憾放弃,最终在尝试数次后在从ayui-excel官方下找到了最终解决方法
准备

1.下载demo https://github.com/wangerzi/layui-excel
2.将demo放入项目中,在使用excel模块时引用即可

直接上代码
	function exportFile() {
        var bodys = $("div[class='layui-form layui-border-box layui-table-view'] .layui-table-box table").get(1); // 获取数据
        var btrs = Array.from(bodys.querySelectorAll("tr"))
        var btdslength = Array.from(btrs[0].querySelectorAll("td")).length;
        var headers = $("div[class='layui-form layui-border-box layui-table-view'] .layui-table-box table").get(0); // 获取表头
        var headerHead = $("div[class='layui-form layui-border-box layui-table-view'] .layui-table-box table thead").get(0); // 获取表头
        var htrs = Array.from(headers.querySelectorAll('tr'));

        var bodysArr = new Array();
        var point =new Array();  // 行,列
        for(var pi =0; pi<=htrs.length+1; pi++){
            point[pi] = new Array();
        }
        point[0][0] ="qd"; // 起点
        var mergeArr = [];
        for (var j = 0; j < htrs.length; j++) {    // 遍历tr
            var titles = [];
            var hths = Array.from(htrs[j].querySelectorAll("th"));
            var titleAll = {};
            var pointIndex = 0;
            var pindx = 0;  // 起点遍历位置
            for (var i = 0; i < hths.length; i++) {  // 遍历 th
                var clazz = hths[i].getAttributeNode('class');
                var colspan = hths[i].getAttributeNode('colspan'); // 表头占用列数
                var rowspan = hths[i].getAttributeNode('rowspan'); //,表头占用行数
                if(!colspan){
                    colspan = 1;
                }else{
                    colspan = parseInt(colspan.value);
                }
                if(!rowspan){
                    rowspan = 1;
                }else{
                    rowspan = parseInt(rowspan.value);
                }
                // 判断数据起始填写位置
                for(;pindx < btdslength; pindx ++){
                    if(j == 0 || point[j][pindx] == "qd"){
                        titles.push(hths[i].innerText);
                        for(var temp = 0; temp < colspan-1;temp++){
                            titles.push(null);
                        }
                        mergeArr.push({s:{r:j,c:pindx},e:{r:j+rowspan-1,c:pindx+colspan-1}}); // 添加合并数据参数  r的差R表示向下扩展R个单元格,c 的差C表示想右扩展C个单元格
                        for(var qdi = 0; qdi<colspan ;qdi ++){
                            point[j+rowspan][pindx+qdi] = "qd"; // 添加完数据 ,添加起点记录
                        }
                        pindx = pindx+colspan;
                        break;
                    }else{
                        titles.push(""); // 不能为null, 为null 会影响表格样式的设置
                    }
                }
            }
            bodysArr.push(titles);
        }
        var widthArr = []; //这里改宽
        for (var j = 0; j < btrs.length; j++) {
            var contents = [];
            var btds = Array.from(btrs[j].querySelectorAll("td"));
            for (var i = 0; i < btds.length; i++) {
                contents.push(btds[i].innerText);
                if(j == 0){  //只跑一圈
                    widthArr.push({wpx:btds[i].scrollWidth});
                }
            }
            bodysArr.push(contents)
        }
		
        
        //设置表格样式
        var styleStr = {
            alignment:{
                vertical:'center',
                horizontal:'center'
            },
            font:{
                sz:14,
                // bold:true
            },
            border:{
                top:{
                    style:'thin'
                },
                bottom:{
                    style:'thin'
                },
                left:{
                    style:'thin'
                },
                right:{
                    style:'thin'
                }
            }
        }
        var datas = [];
        for(var i = 0; i<bodysArr.length;i++){
            var map ={};
            var thisData = bodysArr[i];
            for(var n = 0;n<thisData.length;n++){
                var dataName = "data_"+n;
                var das = thisData[n];
                var styMap = {};
                styMap['s'] = styleStr;
                styMap['v'] = das;
                map[dataName] = styMap;
            }
            datas.push(map);
        }
       
        layui.config({
            base:'<%=path%>/resources/layui-excel/layui_exts/'  //从官方GitHub上下载的demo中excel模块地址
        }).extend({
            excel:'excel'
        }).use(['excel'], function () {
            var excel = layui.excel;
            var rowConf = excel.makeRowConfig({
                1: 40,
                3: 30
            }, 20)
            excel.exportExcel({
                sheet: datas
            }, '复杂表头导出.xlsx', 'xlsx', {
                extend: {
                    sheet: {
                        '!merges': mergeArr
                        , '!cols': widthArr
                        , '!rows': rowConf
                    }
                }
            })

        })

    }

最终导出表格样式
在这里插入图片描述

参考
1.拼接layui复杂表头的数据https://blog.csdn.net/qq_31816945/article/details/102857138
2.layui-excel官方demol http://excel.wj2015.com/

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值