基于layui,js-xlsx的前台数据复杂表头导出到excel文件中

  • 前言 :
  • layui table 加载
  • layui 表头样式
  • 4. 封装之后的sheet
    • !cols
    • !rows
    • ! merges
  • 5. 样式文档
  • 3.参考文献

前言 :

   前台表格数据导出到excel 依赖于 js-xlsx 的excel.js(Version: v1.4) , 本文实现了复杂多级表头的生成,包含 动态的实现'表格合并',以及 基础表格样式 (背景色、边框)。 如有不足之处还望指正,多谢!

layui table 加载

(版本2.2.45以前具体版本忘了)

  function initDataGrid(){dataList = [{type : 'numbers',width : 30,rowspan:2 /* 行号 */},{title:'增加时间', field:'createTimeStr',type:'string',minWidth:83,rowspan:2,align:'center',fixed:'left'},{title:'名称', field:'name',type:'string',minWidth:80,rowspan:2,align:'center',fixed:'left',render:function(row){return row.name;}},{title:'项目名称', field:'projectName',type:'string',minWidth:130,rowspan:2,align:'center',fixed:'left',render:function(row){return row.projectName;}},{title:'编号', field:'code',type:'string',minWidth:130,rowspan:2,align:'center',fixed:'left'},{title:'课题名称', field:'techName',type:'string',minWidth:140,rowspan:2,align:'center',fixed:'left'},{title:'课题类别', field:'techType',type:'string',minWidth:80,rowspan:2,align:'center'},{title:'时间',align:'center',colspan:2},{title:'预算',align:'center',minWidth:160,colspan:maxYear - minYear+2}];if(organizationWrite){  // 指定位置插入列dataList.splice(3,0,{title:'项目部名称', field:'organizationName',type:'string',minWidth:130,rowspan:2,align:'center',fixed:'left'})};var eachYear = [];for (var m = 0; m <= maxYear - minYear; m++) {  // 动态行数据添加var yeartitle = minYear + m;var yearAmount = m+1;eachYear.push({title : yeartitle + '年',field : 'budgetAmount',type : 'string',minWidth : 60,align : 'center',render: function(row) {var ret = "";if(!changeRow){changeRow = row.id;}else if(changeRow != row.id){// 一条数据遍历完, 对数据进行归零处理changeRow = row.id;fork = 0;fort = 0}var rowBudgets = row.budgets;if(!!rowBudgets){let f = fort;if(fort == yearAmount){f = 0;fort=0;}for (; f < yearAmount; f++) { // fort 列下标for (let fork = 0; fork < rowBudgets.length; fork++) { // fork 数据下标if (rowBudgets[fork].budgetTime == minYear + fort ) {var returnStr =  rowBudgets[fork].budgetAmount;ret = returnStr;break;}}}}fort ++;if(row.totalRow) return "<span style='color:red'>" +ret+"</span>"; // 合计行标红return ret;}})}dataList.push.apply(dataList,[{title:'名单', field:'techList',type:'string',minWidth:180,rowspan:2,align:'center'},{title:'证据',align:'center',colspan:6},{title:'已核算费用',colspan:2,align:'center'},{title:'核算费用比例(%)',    field:'costRatio',type:'string',width:153,rowspan:2,align:'center'},{title:'状态', field:'techStatus',hide:true,width:70,rowspan:2,align:'center'},{title:'审核状态', field:'auditStatus',type:'string',minWidth:110,rowspan:2,align:'center'},{title: '操作', fixed:'right',field:'hideExcel', minWidth: 190 ,align:"center", allowHide: false,render: function (row){return " 操作 删除、编辑、修改  等";}}]);dataListSec = [{title:'起始日期', field:'startTime',type:'string',minWidth:80,align:'center'},{title:'完成日期', field:'endTime',type:'string',minWidth:80,align:'center'},{title:'合计', field:'totalAmount',type:'string',minWidth:80,align:'center',render:function(row){return "计算出来的合计数";}}]dataListSec.push.apply(dataListSec,eachYear);dataListSec.push.apply(dataListSec,[{title:'数量'1, field:'zlCount',type:'int',width:70,align:'center'},{title:'数量2', field:'gfCount',type:'int',width:70,align:'center'},{title:'数量3', field:'cxCount',type:'int',width:70,align:'center'},{title:'数量4', field:'jdCount',type:'int',width:70,align:'center'},{title:'数量5', field:'lwCount',type:'int',width:70,align:'center'},{title:'其他', field:'qtCount',type:'int',width:50,align:'center'},{title:'核算日期(年月)', field:'accountionDate',type:'string',width:128,align:'center'},{title:'核算研发费用', field:'accountionExp',type:'string',width:100,align:'center'}]);var url = "www.baidu.com/后台请求数据url";grid1 = laytable.render({id:'maingrid1',elem:'#maingrid1',url: url,delayLoad : true,     //true:在初始化表格时不加载数据cols: [/*sort:false,fixed:false|'right',rowspan:1,colspan:1,render:function(row, rowindex, rows) */dataList,dataListSec],page : true,limit: 30,heightDiff : 0,even: false, //关闭隔行背景,trackSelectedRow:true,//选中行高亮显示 .layui-table-row-activeonLoadData : function(data){//当从后台加载到数据的时候触发},onRowClick : function(index, row){//当点击一行的时候触发//console.log(index+':'+JSON.stringify(row));},onRowDblClick : function(index, row){//当双击一行的时候触发//console.log(index+':'+JSON.stringify(row));},done : function(res, curr, count) {  // 数据加载完成后 执行}});
}

layui 表头样式

## 2. 复杂表头数据组装

// 复杂表头表格导出
function exportFile(id) {// 根据传入tableID获取table内容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;// 根据传入tableID获取表头var headers = $("div[class='layui-form layui-border-box layui-table-view'] .layui-table-box table").get(0); // 获取表头var htrs = Array.from(headers.querySelectorAll('tr'));var bodysArr = new Array();var point =new Array();  // 行,列for(var pi =0; pi<=htrs.length; 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
//          if(hths[i].textContent !="课题资料" && hths[i].textContent !="操作" ){  // 排除 不需要导出的列,数据td 需要同步 排除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.unshift(titles);// 将标题行置顶添加到数组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++) {//          if(btds[i].dataset.field !="attachment" && btds[i].dataset.field !="hideExcel" ){  // 排除 不需要导出的列,titles 需要同步 排除  ,也可通过控制 cols属性来隐藏、显示contents.push(btds[i].innerText);if(j == 0){  //只跑一圈widthArr.push({wpx:btds[i].scrollWidth});}
//          }}bodysArr.push(contents)}var styleCell = {font: {  // 定义样式 居中,背景色,字体大小,边框name:'宋体',sz: 14,bold: true,family:1},fill:{bgColor: {rgb: 'FFfd9a80'    // 没有效果,不知道哪里除了问题},fgColor: { // 背景颜色rgb:'94fba7'}},alignment: {vertical: 'center',horizontal: 'center'
//            ,wrapText: true},border:{top: {style: 'thin'},bottom: {style: 'thin'},left: {style: 'thin'},right: {style: 'thin'}}};var sheet = XLSX.utils.aoa_to_sheet(bodysArr);for(var item in sheet){  // 遍历sheet 对象,给需要的对象 添加样式let aa = sheet[item];let rindex =  item.replace(/[^0-9]/ig,"");  // excel 行下标
//      let cindex =  item.replace(/[^0-9]/ig,"");  // excel 列下标if(rindex <= htrs.length){  // 判断是不是 表头aa.s = styleCell;  // 样式设置}else{ // 数据内容 样式}}sheet['!merges'] = mergeArr;sheet['!rows'] = [{hpx:30},{hpx:28}]; // 设置行高sheet['!cols'] = widthArr;openDownloadDialog(sheet2blob(sheet), '高新课题历史数据导出'+new Date().toLocaleString()+'.xlsx');
}

4. 封装之后的sheet

!cols

!rows

! merges

5. 样式文档

参数 参数子参数
fill patternType “solid” or “none””
fgColor COLOR_SPEC --背景颜色
bgColor COLOR_SPEC ?
font name “Calibri” // default
sz “11” // font size in points
color COLOR_SPEC
bold true or false
underline true or false
italic true or false
strike true or false
outline true or false
shadow true or false
vertAlign true or false
numFmt “0” // integer index to built in formats, see StyleBuilder.SSF property
“0.00%” // string matching a built-in format, see StyleBuilder.SSF
“0.0%” // string specifying a custom format
“0.00%;(0.00%);-;@” // string specifying a custom format, escaping special characters
“m/dd/yy” // string a date format using Excel’s format notation
alignment vertical “bottom” or “center” or “top”
horizontal “bottom” or “center” or “top”
wrapText true or false
readingOrder 2 // for right-to-left
textRotation Number from 0 to 180 or 255 (default is 0)
90 is rotated up 90 degrees
45 is rotated up 45 degrees
135 is rotated down 45 degrees
180 is rotated down 180 degrees
255 is special, aligned vertically
border top { style: BORDER_STYLE, color: COLOR_SPEC }
bottom { style: BORDER_STYLE, color: COLOR_SPEC }
left { style: BORDER_STYLE, color: COLOR_SPEC }
right { style: BORDER_STYLE, color: COLOR_SPEC }
diagonal { style: BORDER_STYLE, color: COLOR_SPEC }
diagonalUp true or false
diagonalDown true or false

COLOR_SPEC: 填充、字体和边框的颜色对象:
       { auto: 1}指定自动值
       { rgb: “FF4dAA00” } 指定16进制的ARGB // rgb:“4dAA00” ,会自动添加FF变成 FF4dAA00
       { theme: “1”, tint: “-0.25”} 指定主题颜色和色调的整数索引(默认值为0)
       { indexed: 64} 默认值 fill.bgColor

BORDER_STYLE: 边框样式是一个字符串值,它可以是以下值之一:
       thin
       medium
       thick
       dotted
       hair
       dashed
       mediumDashed
       dashDot
       mediumDashDot
       dashDotDot
       mediumDashDotDot
       slantDashDot

3.参考文献

https://www.cnblogs.com/liuxianan/p/js-excel.html

基于layui 的数据表格复杂表头导出到excel文件中相关推荐

  1. ASP.NET 2.0中将 GridView 导出到 Excel 文件中

    下面代码实现将 GridView 导出到 Excel文件中. 值得注意的是VerifyRenderingInServerForm重载方法: MSDN上的 VerifyRenderingInServer ...

  2. ASP.NET 2.0中将 GridView 导出到 Excel 文件中 (转)

    下面代码实现将 GridView 导出到 Excel文件中. 值得注意的是VerifyRenderingInServerForm重载方法: MSDN上的 VerifyRenderingInServer ...

  3. Excel表格怎么批量导出图片将文件中的图片导出到文件夹中

    这几天一直没写博文,但是为了让大山的孩子,能够像京城的富二代一样,可以开开心心公公平平地享受学习excel的权利,因此决定今天继续写,今天主要来谈谈excel图片批量导出,关于excel表格怎么批量导 ...

  4. aspx页面中,DataTable中的数据导出到Excel文件中

    方法一:直接将DataTable中的数据通过GridView导出到Excel中,并显示下载界面 public void ExportToExcel(DataTable tab,string filen ...

  5. 将数据导入到已存在的excel文件中

    CRUD数据访问类基类 using System; using System.Collections; using System.Collections.Generic; using System.T ...

  6. 利用xpath爬取链家租房房源数据并利用pandas保存到Excel文件中

    我们的需求是利用xpath爬取链家租房房源数据,并将数据通过pandas保存到Excel文件当中 下面我们看一下链家官网的房源信息(以北京为例) 如图所示,我们通过筛选得到北京租房信息 那么我们需要将 ...

  7. html表格标题中副标题,excel数据表格制作副标题-如何在excel图表中添加标题?

    如何为Excel2010图表添加标题 为Excel 2010版本的图表添加标题,具体方法: 1.点击表格就会出现"图表工具",切换到图表的"布局",点击[图表标 ...

  8. 开发一个导出功能,将echarts图表导出到excel文件中

    首先,做这个功能开发时,首先有几点必须弄清楚:1.echarts图表导出时该怎样导出到excel中,2.有没有图表自带的导出功能可用.经过我上网查阅相关资料以及去echarts官网查看API后,发现图 ...

  9. html页面上的表格导出为excel文件,Web html table export to excel 网页上的表格数据导出到Excel文件中 使用心得...

    在网上搜索到几种方法,经测试得出二种比较简单而且可行方法, 第一种:使用JAVASCRIPT,不用重新从 Database 获得数据.直接把WEB上面的表格保存下来. A B function Aut ...

最新文章

  1. NLP顶级专家Dan Roth :自然语言处理领域近期的任务和主要应用
  2. Swift开发:仿Clear手势操作(拖拽、划动、捏合)UITableView
  3. Centos7.5源码编译安装nodejs
  4. JS-循环清空对象 判断数据类型的5种常用方法
  5. 经济师计算机考试取消,2019年经济师考试计算机机考答题要求及说明
  6. eclipse 导出jar 没有主清单属性的解决方法
  7. 机器学习霸占高薪榜、区块链偃旗息鼓?2020 年软件工程师状况解读!
  8. 学习测试环境部署,先从学会虚拟机安装系统开始
  9. 《强化学习》中的第10章:基于函数逼近的同轨策略控制
  10. 面向对象的两大迷思,再给你们解答一次
  11. ASM文件系统 数据如何写和读数据
  12. 从智能家居的发展看对讲企业的定位
  13. 使用 zsh 后HOME/END 键以及小键盘失效
  14. python bookmark_Python PyQT-网络浏览器|书签
  15. 【读书笔记】RevMiner:RevMiner: An Extractive Interface for Navigating Reviews on a Smartphone
  16. ubuntu20 下从linux 5.14.0-1045 源码编译 linux-5.15.56 内核
  17. 农民工如何拥有500多家加盟连锁店,看他是怎样做到的?
  18. 第7章 项目成本管理
  19. BigData之Hadoop:Hadoop框架(分布式系统基础架构)的简介(两大核心【HDFS存储和MapReduce计算】)、深入理解、下载、案例应用之详细攻略
  20. 【Java 面试合集】接口以及抽象类

热门文章

  1. linux命令--文件夹重命名
  2. Linux 中的TAB键妙用
  3. [DASCTF Apr.2023 X SU战队2023开局之战] crypto复现
  4. 智能硬件产品经理跟纯APP产品经理的主要区别在哪里?
  5. python输入输入:input、map
  6. METIS安装与使用
  7. networkx_to_metis
  8. 马达调速器,直流马达调速器,直流调速器
  9. 2017算法实习生应聘经验总结
  10. kernel: SLUB: Unable to allocate memory on node -1 (gfp=0x20)