jspreadsheet表格的用法

news/2024/7/19 16:39:07 标签: 前端, javascript, js

引入css及js
1.创建表格:

tips:类似excel,一般设置表格的样式、属性会用到A1 B1 C1、A2等来表示第几列

javascript">var tableData = [['', '', '']]//原始数据
var table = undefined
//定义列
var columns = [
    {
        type: 'dropdown',//下拉选择框
        title: '优先级',
        name: 'LEVEL',
        width: 90,
        source: [{id: '1', name: '高'},{id: '2', name: '低'}]
    },
    {
        type: 'calendar',
        title: '日期',
        name: 'BDATE',
        width: 120,
        options: { format: 'YYYY-MM-DD' }//日期格式
    },
    {
        type: 'text',
        title: '数量',
        width: 100,
        name: 'NUM',
        //readOnly: true,//只读框
    }
]

//创建table
table = jspreadsheet(document.getElementById('spreadsheet1'), {
	data: tableData,
	columns: columns,
	filters: true,//是否需要过滤器 过滤数据
	onbeforechange: function (instance, cell, x, y, value) {
	
	},
	//使用过滤器的回调函数
	onfilter: function (instance, filter, value) {
		//filter:选择过滤的名称;value:选择过滤的下标第几项
	    const fresult = value || []
	    const tdata = table.getData()//表格的所有数据行
	    var frow = []
	    if (fresult.length == 0) {
	        frow = tdata
	    } else {
	        tdata.forEach(function (e, i) {
	            if (fresult.indexOf(i) > -1) {
	                frow.push(e)
	            }
	        })
	    }
	},
	//值更改回调函数
	onchange: function (instance, cell, x, y, value) {
	//x列,y行,第x列y行的值是value
	    if (x == 2) {//数量列
	        if (value.trim() != '' && table.getValueFromCoords(2, y).trim() != '') {
	        //table.getValueFromCoords(2, y) 代表获取第2列第y行的值
	            
	        }
	    }
	
	    change(instance, cell, x, y, value, isSoToItem, isSoToNum)
	
	},
	columnSorting: true,
	oninsertrow: function (instance, x, y, arr) {
	    arr[0][0].style.textAlign = "left"
	    arr[0][1].style.textAlign = "left"
	    arr[0][2].style.textAlign = "left"
	},
	style: {
	    A1: 'text-align: left',
	    B1: 'text-align: left',
	    C1: 'text-align: left',
	},
	//鼠标右击事件
	contextMenu: function (obj, x, y, e) {
	    var items = [];
	    if (y != null) {
	        for (var i = 0; i < table.getConfig().columns.length; i++) {
	            if (table.getConfig().columns[i].name == 'NUM') {//名为NUM的列
	                if (i == x) {
	                    items.push({
	                        title: '选择XX',
	                        onclick: function () {
	                            //可通过第y行x列来更改别的值
	                            selectY = y
	                            table.setValueFromCoords(x, y, "val")//更改 第y行x列 的值为val
	                        }
	                    });
	                    items.push({ type: 'line' });//加一条分割线
	                }
	            }
	        }
			//默认表格允许新增行
	        if (obj.options.allowInsertRow == true) {
	            items.push({
	                title: '在上方插入行',
	                onclick: function () {
	                    obj.insertRow(1, parseInt(y), 1);
	                }
	            });
	
	            items.push({
	                title: '在下方插入行',
	                onclick: function () {
	                    obj.insertRow(1, parseInt(y));
	                }
	            });
	        }
	
	        if (obj.options.allowDeleteRow == true) {
	            items.push({
	                title: '删除行',
	                onclick: function () {
	                    obj.deleteRow(obj.getSelectedRows().length ? undefined : parseInt(y));
	                }
	            });
	        }
	
	        if (x) {
	            if (obj.options.allowComments == true) {
	                items.push({ type: 'line' });
	
	                var title = obj.records[y][x].getAttribute('title') || '';
	
	                items.push({
	                    title: title ? obj.options.text.editComments : obj.options.text.addComments,
	                    onclick: function () {
	                        obj.setComments([x, y], prompt(obj.options.text.comments, title));
	                    }
	                });
	
	                if (title) {
	                    items.push({
	                        title: obj.options.text.clearComments,
	                        onclick: function () {
	                            obj.setComments([x, y], '');
	                        }
	                    });
	                }
	            }
	        }
	    }
	
	
	    return items;
	}
});

//值更改函数
function change(instance, cell, x, y, value, isSoToItem1, isSoToNum1) {
	if(x == 2){
		//以下是将数量汇总
		const tdata = table.getData()
        const fresult = table.results || []
        var frow = []
        if (fresult.length == 0) {
            frow = tdata
        } else {
            tdata.forEach(function (e, i) {
                if (fresult.indexOf(i) > -1) {
                    frow.push(e)
                }
            })
        }
        var sum1 = 0

        frow.forEach(function (e) {
            if (typeof e[2] == 'string') {
                sum1 += parseFloat(e[2].trim() || 0)
            } else {
                sum1 += parseFloat(e[2])
            }
        })
        alert(sum1)
        
		//如果该框是只读的话 需要先取消只读,然后设置值,再设为只读
		table.setReadOnly('A' + (parseInt(y) + 1), false)
        table.setValueFromCoords(parseInt(x) + 1, y, "val")
        table.setReadOnly('A' + (parseInt(y) + 1), true)
	}
}

创建基本完成,如已存在表格,又需要重新将表格数据重置(触发后端有新数据)。如需要系统插入一行数据行:

javascript">var cutData2 = table.getData()
var obj={'1','2023-6-30',''}
cutData2.splice(1, 0, obj)//在第一行后插入数据obj

var lData = []
cutData2.forEach(function (e) {
    lData.push(e)
    
})

table.setData(lData)//重置数据
//设置样式  且有设置了只读的要先取消再设置
lData.forEach(function (e, i) {
    table.setReadOnly('A' + (i + 1), false)
    table.setStyle('A' + (i + 1), 'text-align', 'left')
    table.setStyle('B' + (i + 1), 'text-align', 'left')
    table.setStyle('C' + (i + 1), 'text-align', 'left')
    table.setReadOnly('A' + (i + 1), true)
})

http://www.niftyadmin.cn/n/1006193.html

相关文章

【Linux系统编程】Linux权限理解 及 权限管理

文章目录 前言1. Linux权限的概念2. Linux权限管理2.1 文件类型2.2 Linux用户分类及切换用户分类普通用户—>rootroot—>普通用户普通用户之间的切换单条指令的提权 2.3 用户角色划分/文件访问者的分类&#xff08;人&#xff09;2.4 文件类型和访问权限&#xff08;事物…

数据结构和算法-2023.06.29

斐波那契数列 初衷&#x1f481;&#x1f3fb; 说来也是惭愧&#xff0c;入行这么久了&#xff0c;一直没有仔细去思考为什么去做这个&#xff0c;之前一直游想法去好好学学数据结构和算法&#xff0c;一直苦于是重点学习Docker、K8S、JVM&#xff0c;多线程&#xff0c;或者是…

c++实现httpd服务器

文章目录 网络的初始化端口的分配协议的使用WSAStartup函数参数1&#xff1a;WORD wVersionRequested参数2&#xff1a;LPWSADATA lpWSAData返回值 int代码实现 创建套接字int af表示套接字的类型(网络套接字 文件套接字)int type数据流 数据报int protocol 通信协议 TCP &…

iptables -nvL查看linux系统的所有ip和端口情况

1、查看规则 对规则的查看需要使用如下命令&#xff1a; iptables -nvL各参数的含义为&#xff1a; -L 表示查看当前表的所有规则&#xff0c;默认查看的是 filter 表&#xff0c;如果要查看 nat 表&#xff0c;可以加上 -t nat 参数。 -n 表示不对 IP 地址进行反查&#xff…

split()方法详解

split&#xff08;&#xff09;方法详解 1.split()主要是用于对一个字符串进行分割成多个字符串数组。标准形式为String [] strings str.split(“”); 2.split()方法中括号中的参数可以为一个也可以为多个&#xff0c;每个参数之间用|隔开。并且每个参数之间要紧挨着|。 如&am…

消息中间件进阶学习

文章目录 1、RabbitMQ1.1、如何保证消息不丢失&#xff1f;小总结面试快速答法 1.2、消息的重复消费问题面试快速答法 1.3、死信交换机小总结面试快速答法 1.4、消息堆积怎么解决小总结面试快速答法 1.5、集群小总结面试快速答法 2、Kafka2.1、Kafka是如何保证消息不丢失小总结…

Linux系统安装QQ最新版 2023-06-30

腾讯在2023-05-30更新了linux版的qq&#xff0c;这次界面终于不再复古&#xff0c;好看多了。 安装步骤&#xff1a; 1.进入官网&#xff0c;寻找合适的安装包下载 https://im.qq.com/linuxqq/index.shtml 选择跟自己计算机匹配的版本&#xff0c;一般都是X86&#xff0c;如…

如何访问MFC创建的DLL中的资源ID

MFC创建的DLL,如果里面有资源,调用程序进程想访问DLL中的资源ID需要加下面的代码: 假定DLL中带对话框资源IDIDD_DIALOG_GEOM_CTL_PANE,应用程序中的调用方法如下: HINSTANCE hInstResourceClient = AfxGetResourceHandle();AfxSetResourceHandle(::GetModuleHandle(_T(&qu…