需求场景:
有一个统计数据列表,需要按照每十项一个表格,展示成如下图多个复杂表头的表格。每达到十个,就在表格下方生成一个新的表格。使用layui的多级表格生成表格。最终需要将全部表格做合并导出,并且要体现多级表头。直接使用layui表格的导出有两个问题 1、不支持合并导出 2、导出的多级表头无法展示 直接使用table2excel 无法直接导出layui格式的表格,只能导出普通的table
解决方案:
采用将layui-table转换为普通table后,将其合并,再使用table2Excel的方式进行导出
一、表格结构 在表格下方增加一个用来存放合并导出表格的div
<!-- 统计表格 --> <div class="inline fields" id="tableDiv" style="display:block"> <table> <tr><td colspan="5">暂无数据</td></tr> </table> </div> <div id="exportTableDiv" style="display:none"> <table id="exportTable"> <tbody> </tbody> </table> <table id="exportChartTable"> <tbody> </tbody> </table> </div>
二、动态渲染表格数据 有多少个table数据,就渲染多少个table 在done回调函数中,将对应表格处理成普通的table
// 获取到的表格数据 var tableDataList=data.tableDataList; // 动态生成表格html var tableHtml=""; // 记录表格数量 tableDataSize=tableDataList.length; // 先清空html $("#tableDiv").html(""); for(var i in tableDataList){ tableHtml+="<table id='table"+i+"'></table>"; } if(!tableHtml){ tableHtml="<table class='layui-table' style='height: 400px;'><tr><td style='text-align: center'>暂无数据</td></tr></table>" } // 填充html $("#tableDiv").html(tableHtml); // 1、循环渲染表格数据 for(var i in tableDataList){ // 获取表格数据 var tableData=tableDataList[i]; // 获取表头 var cols=tableData.cols; // 获取表格数据 var dataList=tableData.dataList; layui.use('table', function () { var table = layui.table; table.render({ elem: '#table'+i, cols: [ cols[0], cols[1] ], data: dataList, // 表格渲染完后的回调 done: function () { let header_tr = $("#table"+i).next().find(".layui-table-header").find("tr"); let body_tr = $("#table"+i).next().find(".layui-table-body").find("tr"); let header_html = ""; let body_html = ""; // 获取表头html,包括单元格的合并 $.each(header_tr,function (i,tr) { let header_th = $(tr).find("th"); header_html += "<tr>"; $.each(header_th,function (j,th) { let rowspan_num = $(th).attr("rowspan");// 行合并数 let colspan_num = $(th).attr("colspan");// 列合并数 if (rowspan_num && !colspan_num){// 只有行合并时 header_html += '<th rowspan= "'+ rowspan_num +'">'; } else if (colspan_num && !rowspan_num){// 只有列合并时 header_html += '<th colspan= "'+ colspan_num +'">'; } else if (rowspan_num && colspan_num){// 行列合并均有时 header_html += '<th rowspan= "'+ rowspan_num +'" colspan="'+ colspan_num +'">'; } else {// 没有发生单元格合并 header_html += '<th>'; } header_html += $(th).children().children().text() + '</th>';// 获取表头名称并拼接th标签 }) header_html += '</tr>'; }) // 获取表格body数据 $.each(body_tr,function (i,tr) { let body_td = $(tr).find("td"); body_html += '<tr>'; $.each(body_td,function (j,td) { body_html += '<td>' + $(td).children().text() + '</td>'; }) body_html += '</tr>'; }) $("#table"+i+" tr").remove();// 清除之前的doom结构 $("#table"+i).append(header_html).append(body_html); $("#table"+i).hide(); } }); }); }
三、在导出方法中,将普通table的内容合并到导出table中,再调用table2excel插件导出表格
function exportTable(){ layer.confirm('确认导出统计表格吗?', {icon: 3, title:'提示',shadeClose:false,shade: [0],offset:'150px'}, function(){ var deptName = $("#deptId").parent().dropdown('get text'); var startTime =$("#startTime").val(); var endTime =$("#endTime").val(); var title=startTime+"至"+endTime+deptName+"护理质量督查统计表"; // 先清空数据 $("#exportTable tbody").html(""); // 合计表格数据 for(var i=0;i<tableDataSize;i++){ // 获取当前下标表格数据 var curTbodyHtml=$("#table"+i).find("tbody").html(); // 添加到导出表格中 $("#exportTable tbody").append(curTbodyHtml); } $("#exportTable").table2excel({ //表格ID exclude: ".noExl", name: "Excel Document Name", filename: title, //名称 exclude_img: true, exclude_links: true, exclude_inputs: true, cols:$("#exportTable tr th").length //列名 }); layer.closeAll(); }); }
四、导出结果
还没有评论,来说两句吧...