使用excel.js(layui-excel)进行layui多级表头导出,根据单元格内容设置背景颜色,并将导出函数添加到toolbar

news2024/12/28 18:45:27

本段是菜狗子的碎碎念,解决办法请直接从第二段开始看。layui多级表头的导出,弄了两天才搞定,中途一度想放弃,还好坚持下来了。一开始用的是layui的toolbar里自带的那个导出,但是多级表头没有正常导出,单元格背景颜色也没有。后来分别用了sheetjs和table2excel,导出的文件有大小,但是用wps打不开,或者打开空白,或者报错Uncaught TypeError: Cannot read property 'length' of undefined。最后用了excel.js,或者叫layui-excel,成功。导出样式如下:

excel.js下载地址:https://gitcode.com/gh_mirrors/la/layui-excel/overview?utm_source=csdn_github_accelerator&isLogin=1

1. 添加引用

excel.js在layui-excel-master\layui_exts\中,可以将文件夹layui_exts复制到工程代码的js\lay-module\中,然后在js\lay-config.js中添加layui自定义扩展excel,最后在html文件中引用。

window.rootPath = (function(src) {
	src = document.scripts[document.scripts.length - 1].src;
	return src.substring(0, src.lastIndexOf("/") + 1);
})();

layui.config({
	base: rootPath + "lay-module/",
	version: true
}).extend({
	excel: 'layui_exts/excel', //  后端接口封装
});
<script src="../../js/lay-config.js?v=2.0.0" charset="utf-8"></script>

2. 做表

layui.use(['form', 'table', 'myHttp','util', 'excel'], function () {
			var $ = layui.jquery,
				form = layui.form,
				table = layui.table,
				myHttp = layui.myHttp,
				util = layui.util,
				excel = layui.excel;

			cxUrl = myHttp.getDataList //此处获取表格展示的具体数据,要替换成你自己的数据接口
			table.render({
				elem: '#cxTable',
				url: cxUrl,
				toolbar: '#cxDTableToolbar',
				defaultToolbar: ['filter', 'exports', 'print'],
				cols: [
					[
						{
							field: 'id',
							title: '设备编号',
							width: 100,
							fixed: 'left',
							rowspan: 2,
							sort: true
						},
						{
							field: 'address',
							title: '设备地址',
							width: 240,
							rowspan: 2,
							sort: true
						},
						{
							width: 120,
							title: '1号传感器',
							align: 'center',
							colspan: 2
						},
						{
							width: 120,
							title: '2号传感器',
							align: 'center',
							colspan: 2
						}
					],
					[
						{
							field: 'device1value',
							width: 90,
							title: '数值'
						},
						{
							field: 'device1sts',
							width: 90,
							title: '状态',
							templet: function (d) {
                                //根据传感器的状态,设置背景颜色
								if (d.device1sts !== null && d.device1sts != '正常') {
									return '<div style="background-color: yellow;">' + d.device1sts + '</div>';
								} else {
									if (d.device1sts === null) {
										d.device1sts = '';
									}
									return d.device1sts;
								}
							}
						},
						{
							field: 'device2value',
							width: 90,
							title: '数值'
						},
						{
							field: 'device2sts',
							width: 90,
							title: '状态',
							templet: function (d) {
								if (d.device2sts !== null && d.device2sts != '正常') {
								    return '<div style="background-color: yellow;">' + d.device2sts + '</div>';
								} else {
									if (d.device2sts === null) {
										d.device2sts = '';
									}
									return d.device2sts;
								}
							}
						}
					]
				],
				limits: [10, 25, 50, 100],
				limit: 10,
				page: true,
				skin: 'line'
			});

		});

3.导出

参考了https://blog.csdn.net/qq_42455262/article/details/128049644中的function exportFile()部分,我根据自己的情况,在其中增加引用了excel.setExportCellStyle(),作用是用黄色背景突出显示状态异常的器件,如果不需要,可以删掉。

<!-- 添加导出按钮 -->
<button id="exportButton">导出表格</button>
// 点击导出按钮,导出表格数据
$('#exportButton').click(function () {
				exportFile();
			});

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);
				}
				
				var excel = layui.excel;
				// 开始填充单元格背景颜色
				// console.log(datas);
				excel.setExportCellStyle(
				    datas, 'D1:Q300',{
					s: {
						fill: { bgColor: { indexed: 64 }, fgColor: { rgb: "FFFF00" } },
						alignment: {
							horizontal: 'center',
							vertical: 'center'
						}
					}
				}, function (cell, newCell, row, config, currentRow, currentCol, fieldKey) {
					// 回调参数,cell:原有数据,newCell:根据批量设置规则自动生成的样式,row:所在行数据,config:传入的配置,currentRow:当前行索引,currentCol:当前列索引,fieldKey:当前字段索引
					// return ((currentRow + currentCol) % 2 === 0) ? newCell : cell;// 隔行隔列上色
					// console.log(cell['v']);
					if(cell['v'] == "疑似故障" || cell['v'] == "超上限值"){
						return newCell;
					}else{
						return cell;
					}
				})
				// console.log(data);
				// 结束填充单元格背景颜色

				var filename = "deviceSts.xlsx";

				// 第一行行高40,其余行默认20
				var rowConf = excel.makeRowConfig({
					1: 40
				}, 20)
				excel.exportExcel({
					sheet: datas
				}, filename, 'xlsx', {
					extend: {
						sheet: {
							'!merges': mergeArr
							, '!cols': widthArr
							, '!rows': rowConf
						}
					}
				})

			}

点击导出按钮,即可下载表格。到这里,layui复杂表头的导出已经实现,关于excel.js的详细使用,可以参考https://excel.wj2015.com/_book/,里面提供了功能演示和导出函数的使用介绍。

4.把导出函数添加到toolbar

这一步是为了美观,把导出函数添加到表格的toolbar,可以不做。下方代码片段中的'exports'对应的是默认导出菜单,{title: '下载',layEvent: 'LAYTABLE_EXPORT2',icon: 'layui-icon-export'}是新增的自定义导出菜单。

defaultToolbar: ['filter', 'exports', 'print', // 此处的'exports'对应的是默认的导出方式
                {
					title: '下载',
					layEvent: 'LAYTABLE_EXPORT2',
					icon: 'layui-icon-export'
				}, // 自定义导出函数接入
                {
					title: '提示',
					layEvent: 'LAYTABLE_TIPS',
					icon: 'layui-icon-tips'
				}],
//   监听添加操作,自定义导出,cxTable需要替换成你自己的table id
table.on('toolbar(cxTable)', function(obj) {
				if (obj.event === 'LAYTABLE_EXPORT2') { 
					// console.log('导出');
					exportFile();
				};
			});

此时,表格的右上角变成了5个菜单。如下图所示,第2个是默认导出,第4个是自定义导出,可以分别导出,对比一下导出效果。没什么问题的话,可以删除第2个菜单,即'export',只保留自定义导出菜单即可。

关于layui的更多教程,可以参考 layui开始使用_layui开始使用文档_layer在线开始使用文档_layui教程官网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2216269.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FPGA学习(6)-基础语法参数化设计阻塞与非阻塞

目录 1.两种参数化不改变源文件&#xff0c;只改仿真文件的值 2.参数化设计实现模块的重用 2.1不用参数化方法 2.1.1源文件 2.1.2仿真文件 2.1.3仿真波形及实验 2.2 用参数方法 2.2.1调用之前写的led灯闪烁模块&#xff0c;在本源函数中&#xff0c;例化4次调用之前的模…

【pyspark学习从入门到精通7】DataFrames_2

目录 创建 DataFrames 生成我们自己的 JSON 数据 创建 DataFrame 创建临时表 简单的 DataFrame 查询 DataFrame API 查询 SQL 查询 创建 DataFrames 通常&#xff0c;您会通过使用 SparkSession&#xff08;或在 PySpark shell 中调用 spark&#xff09;导入数据来创建 …

SpinalHDL之错误集(一)

本文作为SpinalHDL学习笔记第七十六篇&#xff0c;作为错误集使用&#xff0c;类似高中生的错题集&#xff0c;记录使用SpinalHDL过程中遇到的问题&#xff0c;小到语法错误、版本兼容问题&#xff0c;大到SpinalHDL库函数错误等等&#xff0c;持续更新。 SpinalHDL学习笔记总…

记录 ruoyi-vue-plus在linux 部署遇到的问题

整理 linux 文件不要放在 /, 根目录下&#xff0c;要放在 home 文件夹下。docker 启动mysql 容器&#xff0c;映射的 my.cnf 文件不能设置太高权限&#xff0c;权限太高有安全问题&#xff0c;无法读取。 linux 使用注意事项 docker 文件夹 部署在home文件夹下 总结学习到的…

Asp.Net Core 发布 IIS、docker、Azure、文件夹、AAS、ASF、AWM等

发布 微软资料 微软资料 在 IIS 工作进程 (w3wp.exe) 内托管 ASP.NET Core 应用&#xff0c;称为进程内托管模型。 将 Web 请求转发到运行 Kestrel 服务器的后端 ASP.NET Core 应用&#xff0c;称为进程外托管模型。 发布到IIS 》》》Asp.net 之前 》》》 Asp.net Core …

JavaScript 网页设计案例:使用 Canvas 实现趣味打气球小游戏

JavaScript 网页设计案例&#xff1a;使用 Canvas 实现趣味打气球小游戏 在网页设计中&#xff0c;交互性和趣味性是吸引用户的重要因素。借助 JavaScript 和 HTML5 的 canvas 元素&#xff0c;我们可以轻松实现各种动画效果&#xff0c;今天将带你打造一个有趣的 打气球小游戏…

Vxe vue vxe-table 分享实现打印表格以及同时打印两张表

Vxe vue vxe-table 分享实现打印表格以及同时打印两张表 vxe-table 默认情况下支持单表打印。 在有些情况下&#xff0c;页面上同时有几张表&#xff0c;这时需要一次性打印出来。可以利用 Vxe 自带的分页打印功能&#xff0c;实现多张表同时打印。 效果 点击打印后自动调起预…

Redis --- 第四讲 --- 常用数据结构 --- set、zset

一、set类型的基本介绍 谈到一个术语&#xff0c;这个术语很可能有多种含义。Set一个含义是集合&#xff0c;一个含义是设置。 集合就是把一些有关联数据放到一起。 1、集合中的元素是无序的&#xff01; 2、集合中的元素是不能重复的。 和list类似&#xff0c;集合中的每…

数据治理为何如此简单?

欢迎来文末免费获取数据治理相关PPT和文档 引言 随着大数据技术的迅速发展&#xff0c;企业积累的数据量呈现爆炸式增长。有效的数据管理已经成为企业提高决策效率、增强竞争优势的重要手段。在这样的背景下&#xff0c;数据治理逐渐成为企业数据管理中不可或缺的一环。它不仅…

15分钟学Go 第1天:Go语言简介与特点

Go语言简介与特点 1. Go语言概述 Go语言&#xff08;又称Golang&#xff09;是由谷歌于2007年开发并在2009年正式发布的一种开源编程语言。它旨在简单、高效地进行软件开发&#xff0c;尤其适合于网络编程和分布式系统。 1.1 发展背景 多核处理器&#xff1a;随着计算机硬件…

MFC扩展库BCGControlBar Pro v35.1新版亮点:改进网格控件性能

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v35.1已全新发布了&#xff0c;这个版本改进网格控件的性能、增强工具栏编辑器功能等。 …

hadoop集群搭建-克隆虚拟机,安装jdk,hadoop

2.2 hadoop运行环境的搭建 2.2.1 环境准备 1&#xff09;安装模板虚拟机&#xff0c;IP地址 192.168.10.100&#xff0c;主机名hadoop100&#xff0c;内存41GB&#xff0c;硬盘50GB 2&#xff09;虚拟机配置 首先测试虚拟机是否可以正常上网&#xff0c;测试方法ping www.b…

HarmonyOS Next模拟器异常问题及解决方法

1、问题1&#xff1a;Failed to get the device apiVersion. 解决方法&#xff1a;关闭模拟器清除用户数据重启

centos7.9调整磁盘分区大小

在安装centos7.9时我们一般采用默认分区设置&#xff0c;使用LVM来管理磁盘空间&#xff0c;根分区只有50GB&#xff0c;其余的所有可用空间都分配在/home分区下。可是centos7中大多数的应用软件都是安装在根分区的&#xff0c;在使用过程中经常会出现明明系统还有很大的磁盘空…

CSS 选择器简单回顾

引言 当我们探讨网页设计和开发时, CSS(层叠样式表) 无疑是一个不可或缺的技术, 它使我们能够精确控制网页的外观和布局, 为用户创造出独特的视觉体验、以及良好的交互体验!! 而一个完整的 CSS 规则则是由两个主要部分组成: 选择器和声明块 那么今天我们就来盘点下常见的几种选…

jmeter使用csv数据

背景 使用jmeter对系统进行压测。测试数据存储在了csv中&#xff0c;多线程压测的时候&#xff0c;csv中的一条数据不能多个线程同时使用&#xff0c;数据全部使用过后&#xff0c;需要终止压测。 功能点 从csv读取数据后&#xff0c;完成接口数据拼接。多线程依次从csv文件…

蓝牙HCI的log分析方法

一 前言: Bluetooth HCI log 的最主要功能是用于分析蓝牙设备之间的交互行为是否符合预期,以及是否符合 蓝牙规范之规定。 基本上,在手机应用平台上,除了蓝牙功能无法打开以及蓝牙引起的 system crash 问题之外,蓝牙相 关的问题,均可以通过分析 HCI log 来定位问题。 具…

MacOS Sublime Text 解决中乱码

1. 安装Package Control 官方安装指南 手动安装 通过以此点击菜单 Sublime Text > Preferences > Browse Packages 打开Packages目录找到Packages的同级目录Installed Packages下载PackageControl.sublime-package并保存到Installed Packages中在菜单 Sublime Text &g…

[含文档+PPT+源码等]精品基于springboot实现的原生微信小程序小型电子拍卖系统

基于Spring Boot实现的原生微信小程序小型电子拍卖系统的背景&#xff0c;可以从以下几个方面进行详细阐述&#xff1a; 一、技术背景 Spring Boot框架&#xff1a; Spring Boot是一个开源的Java应用框架&#xff0c;它基于Spring框架&#xff0c;旨在简化Spring应用的开发、配…

SpringBoot基于微信小程序的上门幼儿照护服务系统(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…