单元格的框选,列选择,行选择

  • 框选
  • 列选择
  • 行选择
  • 列的右键菜单
  • 行的右键菜单

当写完本系列后,我会把源代码分享出来给大家。本课程也会持续更新与矫正。欢迎留言指正!

框选

在Excel 表格中,一般我们会出一片区域来批量修改数据。现在要来实现这个过程。
如图所示:框选从 B2 开始,至 E8 结束。

实际上,框选会有4 种可能:

  1. 从B2开始,E8 结束
  2. 从B8开始,E2 结束
  3. 从 E2 开始,E8 结束
  4. 从 E8 开始,E2 结束
/**
* @property {Function} CharMinus 字母相减
* @param {String} CharA 输入字符
* @param {String} CharB 输入字符
* @returns {Number} 返回十进制编码
*/
CharMinus(CharA,CharB){ // 字母相减return this.CharToDecimal(CharA)-this.CharToDecimal(CharB)
}/**
* @property {Function} GetRectangle 计算出框选区域
* @param {String} from 行列串,例如:A1
* @param {String} to 行列串,例如:B2
* @returns {Array} 返回字符串数组,["A","1"]
*/
GetRectangle(from,to){var t = this.setRectanglecorner(from,to);var fromRC = t[0];var toRC = t[1];var distance = [this.CharMinus(toRC[0],fromRC[0]),toRC[1]-fromRC[1]]// console.log(fromRC);// console.log(toRC);// console.log(distance);var Rowcount = parseInt(fromRC[1])+distance[1]+1;var ColList = this.caculatemap.slice(this.CharToDecimal(fromRC[0]),this.CharToDecimal(fromRC[0])+distance[0]+1);var length = ColList.length;var Rectangle = [];for(var i = 0;i<length;i++){for(var j = fromRC[1];j<Rowcount;j++){Rectangle.push(ColList[i]+j);}}return {"Rowlength":Rowcount-parseInt(fromRC[1]),"Collength":length,"Rectangle":Rectangle};
}

列选择

/**
* @property {Function} colclick 点击列标头
* @param {Object} ev
* @returns {Boolean} 返回点击结果
*/
colclick(ev){var that = thisthat.emptyselectcells();var target = ev.target || ev.srcElement;console.log("选择"+target.getAttribute("id")+"列");var ii = that.searchcolInCells( target )// console.log(that.focus["sheets_size"][0],that.focus["sheets_size"][1])// console.log(ii)var cells__inputs = document.getElementsByClassName("cells__input");var length = cells__inputs.length;for(var row = 1;row<that.focus["sheets_size"][1]+1;row++){var i = ii+(row-1)*that.charcode.CharToDecimal(that.focus["sheets_size"][0])console.log(i)cells__inputs[i].style.backgroundColor = "#f3f2f1";that.focus["cells"].push(that.getThisTargetIndex(cells__inputs[i]));}that.focus["x"] = -1;that.focus["y"] = -1;console.log(that.focus["cells"]);return false;
}

行选择

/**
* @property {Function} rowclick 点击行标头
* @param {Object} ev
* @returns {Boolean} 返回点击结果
*/
rowclick(ev){var that = thisthat.emptyselectcells();var target = ev.target || ev.srcElement;console.log("选择"+target.getAttribute("id")+"行");var cells__inputs = document.getElementsByClassName("cells__input");var length = cells__inputs.length;for(var i = 0;i<length;i++){if(cells__inputs[i].getAttribute("data-y") == target.getAttribute("id")){cells__inputs[i].style.backgroundColor = "#f3f2f1";that.focus["cells"].push(cells__inputs[i].getAttribute("id"));}}that.focus["x"] = -1;that.focus["y"] = -1;console.log(that.focus["cells"]);return false;
}

列的右键菜单

colcontextmenu(ev){var that = this/*弹出菜单*/var target = ev.target || ev.srcElement;var contextmenulist = [];contextmenulist.push({"icon": "","name": "插入列","event": function () {var mainid = target.getAttribute("id");console.log(this.name, that.focus);console.log(mainid);var cells = document.getElementById("cells"); // 获取父节点var index;var Celement;var tempCache = [];that.focus["ColumnsSize"].push("200px");that.makeColumnsSize(that.focus["ColumnsSize"]);for(var i in that.focus["cells"]){// 根据表的尺寸,计算出相应的坐标index = that.charcode.countelementToindex(that.focus["sheets_size"][0],that.focus["sheets_size"][1],that.focus["cells"][i]);// 将计算出的元素压入临时缓冲tempCache.push(document.getElementById("cells").childNodes[index]);}that.emptyselectcells();Celement = document.createElement('div');Celement = that.creatElement({"Tag" : "div","ID" : that.creatGlobalId(),"ClassName" : "cells__alphabet","Data" : [{ "k":"x", "v":"" },{ "k":"y", "v":"" }],"Action":{"click":that.colclick.bind(that),"change":function(){},"contextmenu":that.colcontextmenu.bind(that)}});cells.insertBefore(Celement, document.getElementById(mainid)); // 在列标头前插入新元素var cells__alphabets = document.getElementsByClassName("cells__alphabet");var cells__alphabetcount = cells__alphabets.length;console.log("列标头总数:"+cells__alphabetcount);var step = "A";for(var i = 0;i < cells__alphabetcount;i++){cells__alphabets[i].setAttribute("data-x",step);cells__alphabets[i].setAttribute("data-y","0");cells__alphabets[i].innerHTML = step;step = that.charcode.excel_Row_Increase(step,1);}that.focus["sheets_size"][0] = that.charcode.excel_Row_Increase(that.focus["sheets_size"][0],1);for(var i in tempCache){Celement = that.creatElement({"Tag" : "div","ID" : that.creatGlobalId(),"ClassName" : "cells__input","Data" : [{ "k":"x", "v":"" },{ "k":"y", "v":"" }],"Action":{"click":that.cellclick.bind(that),"dblclick":that.celldblclick.bind(that),"change":that.cellchange.bind(that),"mouseover":that.cellmouseover.bind(that),"mouseout":that.cellmouseout.bind(that),"mousedown":that.cellmousedown.bind(that),"mouseup":that.cellmouseup.bind(that),"contextmenu":that.cellcontextmenu.bind(that)}});cells.insertBefore(Celement, tempCache[i]); // 在列元素前插入新元素}}});that.updata_contextmenulist(contextmenulist,that.right__menu_list)console.log("列标头右击",target.getAttribute("data-x"),target.getAttribute("data-y"))var oDiv = document.getElementById(that.right__menu);oDiv.style.display = "block";oDiv.style.left = ev.clientX+"px";oDiv.style.top = ev.clientY+"px";/*整列标上底色*/that.colclick(ev)
}

行的右键菜单

rowcontextmenu(ev){var that = thisconsole.log("表格尺寸"+that.focus["sheets_size"]);/*弹出菜单*/console.log(this)var target = ev.target || ev.srcElement;var contextmenulist = [];contextmenulist.push({"icon": "","name": "插入行","event": function () {var mainid = target.getAttribute("id");console.log(this.name, that.focus);console.log(mainid);var cells = document.getElementById("cells"); // 获取父节点var index;var Celement;var tempCache = [];that.focus["RowsSize"].push("25px");that.makeRowsSize(that.focus["RowsSize"]);for(var i in that.focus["cells"]){// 根据表的尺寸,计算出相应的坐标index = that.charcode.countelementToindex(that.focus["sheets_size"][0],that.focus["sheets_size"][1],that.focus["cells"][i]);// 将计算出的元素压入临时缓冲tempCache.push(document.getElementById("cells").childNodes[index]);}// 根据表的尺寸,计算出相应的坐标index = that.charcode.countelementToindex(that.focus["sheets_size"][0],that.focus["sheets_size"][1],that.focus["cells"][0]);var icell = document.getElementById("cells").childNodes[index];that.emptyselectcells();Celement = document.createElement('div');Celement = that.creatElement({"Tag" : "div","ID" : that.creatGlobalId(),"ClassName" : "cells__number","Data" : [{ "k":"x", "v":"" },{ "k":"y", "v":"" }],"Action":{"click":that.rowclick.bind(that),"change":function(){},"contextmenu":that.rowcontextmenu.bind(that)}});cells.insertBefore(Celement, document.getElementById(mainid)); // 在列标头前插入新元素var cells__number = document.getElementsByClassName("cells__number");var cells__numbercount = cells__number.length;console.log("行标头总数:"+cells__numbercount);for(var i = 0;i < cells__numbercount;i++){cells__number[i].setAttribute("data-x","0");cells__number[i].setAttribute("data-y",""+(i+1));cells__number[i].innerHTML = ""+(i+1);}that.focus["sheets_size"][1] = that.focus["sheets_size"][1]+1;var stop = that.charcode.excel_Row_Increase(that.focus["sheets_size"][0],1);for(var i = "A"; i != stop; i = that.charcode.excel_Row_Increase(i,1)){Celement = that.creatElement({"Tag" : "div","ID" : that.creatGlobalId(),"ClassName" : "cells__input","Data" : [{ "k":"x", "v": i },{ "k":"y", "v":"" }],"Action":{"click":that.cellclick.bind(that),"dblclick":that.celldblclick.bind(that),"change":that.cellchange.bind(that),"mouseover":that.cellmouseover.bind(that),"mouseout":that.cellmouseout.bind(that),"mousedown":that.cellmousedown.bind(that),"mouseup":that.cellmouseup.bind(that),"contextmenu":that.cellcontextmenu.bind(that)}});cells.insertBefore(Celement, icell); // 在列元素前插入新元素}}});that.updata_contextmenulist(contextmenulist,that.right__menu_list)console.log("列标头右击",target.getAttribute("data-x"),target.getAttribute("data-y"))var oDiv = document.getElementById(that.right__menu);oDiv.style.display = "block";oDiv.style.left = ev.clientX+"px";oDiv.style.top = ev.clientY+"px";/*整行标上底色*/that.emptyselectcells();var target = ev.target || ev.srcElement;console.log("选择"+target.getAttribute("id")+"行");var cells__inputs = document.getElementsByClassName("cells__input");var length = cells__inputs.length;for(var i = 0;i<length;i++){if(cells__inputs[i].getAttribute("data-y") == target.getAttribute("id")){cells__inputs[i].style.backgroundColor = "#f3f2f1";that.focus["cells"].push(cells__inputs[i].getAttribute("id"));}}that.focus["x"] = -1;that.focus["y"] = -1;console.log(that.focus["cells"]);/*整行标上底色*/that.rowclick(ev)
}

【用JS自制表格软件玩数据】6. 单元格的多选相关推荐

  1. 【用JS自制表格软件玩数据】2.读取 xls 文件

    读写Excel Excel文档的包结构 Excel文档的组织形式 Content Types 主要内容(worksheet) 关联(Relationships) 第三方库 SheetJS 工作原理介绍 ...

  2. 【用JS自制表格软件玩数据】9. 自制三维 K线图 蜡烛图

    画三维 K线图 蜡烛图 概述 效果图 正面 正面近景 鸟瞰 侧面 近观俯视 构建一个类 初始化环境 设置环境背景 初始化摄像机 设置相机的位置 设置相机镜头的位置 初始化场景 创建坐标系 蜡烛图的特点 ...

  3. JS合并表格中内容一样的单元格

    1.页面效果 2.js代码 function mergeCells() {var colNumber = tablecontent.rows.item(0).cells.length; //获取表格列 ...

  4. Excel技巧【标记多行数据连续一样的行】【第一个单元格公式适用于所有本列所有行】【按照逗号分列】【快速统计出各个项出现的次数】【冻结窗口】[表格分段选择数据][根据单元格内容引索其他单元格数据指针]

    标记多行数据一样的行 我这里有一列数据,现在想识别出多行数据连续一样的目的行,数据如下左图所示: 这里可以对F1单元格使用这样的公式:=IF(AND(E1=E2,E2=E3,E3=E4,E4=E5,E ...

  5. poi设置自动换行后显示不全_WPS表格:如何让数据超过单元格就自动换行并完全显示?...

    在日常做表格的过程中,经常会碰到数据超过单元格溢出的情况.此时将单元格加宽来完全显示数据,是不现实的,只能让表格自动换行,让表格加长才能很好的解决这个问题. 我们在WPS2019中以下表为例,来演示一 ...

  6. 单元格内多个姓名拆分成一列_excel将一列数据拆为多个表格-excel:如何将一个单元格拆分成多行或多列?...

    如何将一个Excel工作表的数据按一列的关键字拆分成... 工具/材料:Microsoft Office Excel2016版,Excel文档. 1.首先选中Excel文档,双击打开. 2.然后在该界 ...

  7. HTML表格的单元格凹凸效果,JS+CSS实现可以凹陷显示选中单元格的方法

    本文实例讲述了JS+CSS实现可以凹陷显示选中单元格的方法.分享给大家供大家参考.具体实现方法如下: JS+CSS实现可以凹陷显示选中的单元格 td{cursor:hand;font-size:12p ...

  8. wps交叉表_WPS表格中如何锁定单个单元格?,这几步你要了解

    如同加密文件一样,WPS表格中可以对单个单元格进行锁定.起到保护里面数据的作用,其具体操作步骤如下: 工具/材料 WPS办公软件 操作方法 01 在桌面上双击WPS表格的快捷图标,打开WPS表格这款软 ...

  9. Spread Studio for .NET 7: 使用现有数据填充单元格

    2019独角兽企业重金招聘Python工程师标准>>> 使用 Spread Studio 表格控件你可以复制范围单元格并且填充到其他单元格中,复制数据和单元格格式.例如:如果目前有 ...

最新文章

  1. 【MongoDB】MongoDB备份方法
  2. Android8.0适配那点事(二)
  3. Nest Secure智能保全系统内建麦克风 引发用户反弹
  4. 使用正则表达式解析http请求url中的参数和参数值
  5. 如何在backoffice里创建Hybris image container以及分配给product
  6. 物联网第一台设备是烤面包机?
  7. MVDR波束形成MATLAB实现
  8. 论文阅读9-Fine-tuning Pre-Trained Transformer Language Models to(远程监督关系抽取,ACL2019,GPT,长尾关系,DISTRE)
  9. php_self include,PHP_SELF返回/index.php/index.php
  10. Linux 期中架构 inotify
  11. Centos 7 安装 java、搭建 Jenkins
  12. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_10 打印流_1_打印流_概述和使用...
  13. MySQL中的join以及on条件的用法
  14. 《初级会计电算化应用教程(金蝶KIS专业版)》——导读
  15. 表格票据识别-助力各行业单据录入
  16. Win10秘笈:两种方式修改网卡物理地址(MAC)
  17. 万豪国际扩大北京奢华酒店布局,JW万豪将落户东城区
  18. 玩转“抖音”的10种内容策划套路!
  19. LTDC-DMA2D显示屏显示-编码标准(三)
  20. 详细代码注释1148: 组合三位数之一

热门文章

  1. vue 富文本存储_VUE 富文本(vue2-editor)
  2. php 小数点后6位,PHP保留小数点后几位的三种方法
  3. matlab图片存为视频,matlab视频保存为图片
  4. java 斗地主_java实现斗地主游戏
  5. 光场1.0——非聚焦型光场相机
  6. 计算机基础电子表格有计算,(精选)2018计算机应用基础Excel电子表格题目
  7. 2021年中国工业机器人供需分析:产量36.6万台[图]
  8. C语言学习19:操作符详解
  9. 奇安信 渗透测试(攻防类)一面复盘
  10. matlab中linprog函数不能用,matlab中用linprog函数提示Optimization terminated怎么解?