网页版模仿Excel

2023-05-16

网页版模仿Excel

最近公司闲的dan疼,非要模仿Excel做一个网页版的Excel,刚开始听说要做这么一个东西的时候瞬间觉得公司领导高(sang)瞻(xin)远(bing)瞩(kuang),只能头铁的接下了,那就开始干。其实主要目的是为了能连上自己的数据库,方便操作表格,后来发现实现成本太高,做了一个前端DEMO就果断放弃了,但是这个DEMO还是有点意思,发开DEMO过程中有些心得与收获。

github地址

https://github.com/zhuqitao/E...

实现功能

  • 字体、字号、颜色、背景色、加粗、斜体等字体样式基本操作功能
  • 鼠标拖拽多选单元格
  • 左右居中布局
  • 合并、拆分单元格
  • 插入函数(没有计算功能的函数,只是静态添加函数名)
  • 本地打开excel(.xls)文件

截图

先看看目前的效果图:

clipboard.png

滚动问题

领导说先做一个demo看看效果,那就亮出咱家的看家本领吧html+css+js三剑客,不就是表格吗,html填上table,修修样式,页面效果就ok了。

第一个碰到的问题就是滚动问题,看上面的截图就知道其实这是一种表格表头固定,表格第一列固定,其他部分滚动的效果,但是其实没有那么简单,还有一个问题是垂直滚动的时候第一行(表头)不动,但是第一列得跟着动啊,水平滚动亦是如此,这可怎么办啊,这种情况没遇到过啊,但是得解决啊。

不知道的网友们可以考虑考虑怎么做? 知道怎么处理这种情况的也别喷博主菜。

最后的解决方法就是写了三个table,一个放表头(第一行),一个放第一列,一个放表格主要内容,看下图:

clipboard.png

table1放置表头(A,B,C),table2放置第一列,table3放置中间操作区域,把table1、2设置为overflow:hidden,只有table3可以滚动,监听table3的滚动事件,获取table3的scrollLeft和scrollTop然后分别给table1、table2的scrollLeft和scrollTop赋值。

鼠标按下拖拽多选单元格

这个是本DEMO唯一的亮点了(个人认为)。

表格目前定下的是30*30的表格。一开始的想法是监听鼠标按下(mousedown)事件获取鼠标按下时的位置,然后再监听鼠标移动事件(mousemove),获取鼠标当前的位置,然后根据当前位置和按下时位置画一个矩形,循环遍历所有的单元格元素,判断单元格是否在矩形内,然后给选中的单元格添加active类。

这样做的结果是页面非常卡,因为鼠标移动过程会多次触发鼠标移动事件(mousemove),会多次进行单元格元素循环遍历。 后来就不在鼠标移动事件里面进行单元格遍历操作,在鼠标松开事件里面遍历所有的单元格元素。

这样确实快了一些,但是还有一个问题上面两种方法都没解决的问题,就是如果选择了很多元素(比如100个),在遍历单元格元素的时候需要对着100个元素操作添加active类,其实js操作操作DOM是比较耗时的,这里也没有想到什么好的DOM操作缓存的方法。

就在一筹莫展的时候想到了目前流行的虚拟dom框架(react、vue等),果断使用了vue。在vue实例里创建两个对象数组,分别作为行数据和列数据,页面上分别对<tr>和<td>标签使用v-for循环渲染,这样就能生成一张表格。每个单元格都给加上行数和列树标志。

在鼠标按下获取鼠标按下时所在单元格的行数和列数,鼠标松开时获取松开时所在单元格的行数和列数,然后先循环行数据的数组,所有在选中的行数的数据对象添加选中标志,然后再循环列数据的数组,所有在选中的列数的数据对象添加选中标志,在页面对<tr>和<td>标签使用v-for循环渲染时动态绑定class类,只有行和列同时被选中,单元格才设置为选中状态,这样其实只循环了30+30=60次,瞬间把复杂度有原来的O(n^2)降低到O(2n)。

其实背后是通过vue的diff算法快速的计算出需要改变的dom元素,然后利用虚拟dom快速渲染到页面上,速度大大提升。这也让我真实的感受到这些框架的威力(怪不得这么火)。

我的语言表达能力不是很强,上面说的大家不知道有没有听明白,没明白的可以看看源代码(^︹^)。 

意外收获

  • 打开本地xls文件

有一款jquery插件js-xlsx可以帮助在线打开本地xls文件,并把xls文件转成json。

  • 本地保存xls文件

利用xml的createElementNS创建带有指定命名空间的元素节点,再利用js自带Blob数据类型保存xls文件:

    var urlObject = window.URL || window.webkitURL || window;
    
    var export_blob = new Blob(['test']);
    
    var save_link = document.createElementNS("http://www.w3.org/1999/xhtml", "a")
    
    var ev = document.createEvent("MouseEvents");
    ev.initMouseEvent(
    "click", true, false, window, 0, 0, 0, 0, 0
    , false, false, false, false, 0, null
    );
        
    save_link.href = urlObject.createObjectURL(export_blob);
    save_link.download = 'test.xls';
    save_link.dispatchEvent(ev);
  • execCommand

当一个HTML文档切换到设计模式 designMode时,文档对象暴露 execCommand 方法,该方法允许运行命令来操纵可编辑区域的内容。详情查看MDN地址:https://developer.mozilla.org...

AbsolutePosition 设定元素的 position 属性为“absolute”(绝对)。
BackColor 设置或获取当前选中区的背景颜色。
BlockDirLTR 目前尚未支持。
BlockDirRTL 目前尚未支持。
Bold 切换当前选中区的粗体显示与否。
BrowseMode 目前尚未支持。
Copy 将当前选中区复制到剪贴板。
Paste 用剪贴板内容覆盖当前选中区(目前尚未支持)。
...

// 例子
document.execCommand("copy")
document.execCommand("cut")
document.execCommand('paste')
  • window.getSelection()

获取鼠标选中的文本

  • clipboarddata.setData()

手动设置剪切板,一般用于用户复制内容时添加版权信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网页版模仿Excel 的相关文章

随机推荐

  • nginx

    Nginx xff1a engine X c10k 主要功能 xff1a 1 web服务器 xff1a http https协议的应用 xff1b 2 反向代理服务器 xff1a http reverse server smtp pop3
  • 解决Ubuntu 14.04 开机提示 “Unlock Login Keyring Dialog ”

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 有些帖子是删除 xff5e amp times amp times amp times amp times 下的两个文件的 xff08 忘记了 xff09 xff0c 但是
  • Android Design Support Library使用详解

    Android Design Support Library使用详解 Google在2015的IO大会上 xff0c 给我们带来了更加详细的Material Design设计规范 xff0c 同时 xff0c 也给我们带来了全新的Andro
  • 烂泥:学习ubuntu远程桌面(一):配置远程桌面

    本文由 秀依林枫 提供友情赞助 xff0c 首发于 烂泥行天下 公司服务器目前安装的都是ubuntu 14 04系统 xff0c 而且由于业务需要 xff0c 需要使用到ubuntu的远程桌面功能 所以本篇文章都是围绕ubuntu的远程桌面
  • 【Android开发】线程与消息处理-实现多线程

    在现实生活中 xff0c 很多事情是同时进行的 xff0c 例如 xff0c 我们可以一边看书 xff0c 一边喝咖啡 xff1b 而计算机则可以一边放音乐 xff0c 一边打印文档 对于这种可以同时进行的任务 xff0c 可以用线程来表示
  • MX

    A mail exchanger record MX record is a type of resource record in the Domain Name System that specifies a mail server re
  • mllib逻辑回归 spark_Spark MLlib学习——分类和回归

    本章节介绍了分类和回归的算法 它还包括讨论特定类别的算法部分 xff0c 如 xff1a 线性方法 xff0c 树和集成 下面是整个API Doc中的内容框架 xff0c 这里不会每个都详细介绍 xff0c 主要会把用到的介绍出来 xff0
  • java:一个生产者消费者模式的简单实现

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 先啰嗦一点 xff1a 由于最近工作中 xff0c 涉及到生产者消费者设计模式 xff0c 对此有一些体会 xff0c 所以总结一下 xff0c 与大家分享 1 什么是生产
  • Ubuntu 配置VNC以及使用VNC连接时,无法显示系统菜单栏,解决方法

    系统 xff1a Ubuntu12 10 server x86 64bit版 VNC xff1a 官方最新5 03 下载地址 xff1a http www realvnc com download 问题 xff1a 系统安装默认是没有桌面的
  • 数据包结构分析

    通过wireshark抓取在不同链路上的数据包 xff0c 分析数据在网上传输过程 首先要有下面基础知识 1 网络数据封装过程 xff0c 数据包发送的时候从上往下封装的 xff0c 解封装反过来 从下往上看 最下面是以太网帧 xff0c
  • 怎么不说糟糕的javaer?java开发者的水平都很高?国内真正懂java的不超过10个

    怎么不说糟糕的javaer java开发者的水平都很高 xff1f 国内真正懂java的不超过10个 转载于 https my oschina net victorlovecode blog 664338
  • VMware使用

    sn XLWPN W476D 68NDF 5PTX3 想试Linux xff0c 不用重新分区 xff0c 就像安装Office软件一样 xff0c 让你直接在Windows中尝鲜 可以反复练习Fdisk PQmagic等危险软件的使用方法
  • 腾讯MSDK支付接入记录

    腾讯开放平台联调工具集签名SDK下载支付API接口的联调sig 说明Android常见错误码包下载地址 登入问题 游戏进行手Q登录授权的是提示 该应用非官方正版应用 xff0c 请去应用宝下载后进行QQ登录 xff08 错误码100044
  • iOS 字符属性NSAttributedString描述

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 字符属性 字符属性可以应用于 attributed string 的文本中 NSString const NSFontAttributeName 字体 NSString c
  • BIND配置文件详解(三)

    本文档摘录自 BIND9管理员手册 xff0c 如果有不对或者不清楚的地方 xff0c 请大家告诉我 xff0c 谢谢 xff01 BIND配置文件详解 xff08 三 xff09 7 server语句 服务器 xff08 server x
  • 《DNS与BIND(第5版)》——10.2 DNS动态更新

    本节书摘来自异步社区 DNS与BIND xff08 第5版 xff09 一书中的第10章 xff0c 第10 2节 作者 xff1a 美 Joseph Davies 更多章节内容可以访问云栖社区 异步社区 公众号查看 10 2 DNS动态更
  • 考研南邮和杨大计算机,江苏省这4所“非211”低调有实力,从不争名次,毕业生颇受欢迎...

    从上世纪七八十年代我们国家恢复高考开始江苏省都是作为我们国家高考中的一个领军省份 xff0c 为什么这么说是因为在我们国家很多高考的改革都是在江苏省实行的 xff0c 所以也从侧面反映了江苏省份高等教育发展的一个良好势头 xff0c 在江苏
  • 批处理-For详解

    大纲 一 前言 二 for语句的基本用法 三 for f delims tokens skip eol userbackq 变量延迟 四 for r 递归遍历 五 for d 遍历目录 六 for l 计数循环 一 前言 在批处理中 xff
  • 互阻放大器的稳定工作及其评估

    摘要 xff1a 互阻 放大器 xff08 TIA xff09 通常用于将 传感器 xff08 如 xff1a 光电 二极管 xff09 的输出电流转换成电压信号 xff0c 因为 xff0c 有些电路或仪器只能接受电压输入 将一个 运算放
  • 网页版模仿Excel

    网页版模仿Excel 最近公司闲的dan疼 xff0c 非要模仿Excel做一个网页版的Excel xff0c 刚开始听说要做这么一个东西的时候瞬间觉得公司领导高 sang 瞻 xin 远 bing 瞩 kuang xff0c 只能头铁的接