热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

网页版模拟Excel

网页版模拟Excel近来公司闲的dan疼,非要模拟Excel做一个网页版的Excel,刚最先据说要做这么一个东西的时刻霎时以为公司指导高(sang)瞻(xin)远(bing)瞩(k
网页版模拟Excel

近来公司闲的dan疼,非要模拟Excel做一个网页版的Excel,刚最先据说要做这么一个东西的时刻霎时以为公司指导高(sang)瞻(xin)远(bing)瞩(kuang),只能头铁的接下了,那就最先干。实在重要目标是为了能连上本身的数据库,轻易支配表格,厥后发明完成本钱太高,做了一个前端DEMO就坚决摒弃了,然则这个DEMO照样有点意义,发开DEMO历程当中有些心得与收成。

github地点

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

完成功用

  • 字体、字号、色彩、背景色、加粗、斜体等字体款式基础支配功用
  • 鼠标拖拽多选单元格
  • 摆布居中规划
  • 兼并、拆分单元格
  • 插进去函数(没有盘算功用的函数,只是静态增加函数名)
  • 当地翻开excel(.xls)文件

截图

先看看现在的结果图:

《网页版模拟Excel》

转动题目

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

第一个遇到的题目就是转动题目,看上面的截图就晓得实在这是一种表格表头牢固,表格第一列牢固,其他部份转动的结果,然则实在没有那末简朴,另有一个题目是垂直转动的时刻第一行(表头)不动,然则第一列得随着动啊,程度转动亦是云云,这可怎样办啊,这类状况没遇到过啊,然则得处置惩罚啊。

不晓得的网友们能够斟酌斟酌怎样做? 晓得怎样处置惩罚这类状况的也别喷博主菜。

末了的处置惩罚要领就是写了三个table,一个放表头(第一行),一个放第一列,一个放表格重要内容,看下图:

《网页版模拟Excel》

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实例里建立两个对象数组,离别作为行数据和列数据,页面上离别对和标签运用v-for轮回衬着,如许就可以天生一张表格。每一个单元格都给加上行数和列树标志。

在鼠标按下猎取鼠标按下时地点单元格的行数和列数,鼠标松开时猎取松开时地点单元格的行数和列数,然后先轮回行数据的数组,一切在选中的行数的数据对象增加选中标志,然后再轮回列数据的数组,一切在选中的列数的数据对象增加选中标志,在页面临和标签运用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()

手动设置剪切板,平常用于用户复制内容时增加版权信息。


推荐阅读
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • React基础篇一 - JSX语法扩展与使用
    本文介绍了React基础篇一中的JSX语法扩展与使用。JSX是一种JavaScript的语法扩展,用于描述React中的用户界面。文章详细介绍了在JSX中使用表达式的方法,并给出了一个示例代码。最后,提到了JSX在编译后会被转化为普通的JavaScript对象。 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 本文介绍了RxJava在Android开发中的广泛应用以及其在事件总线(Event Bus)实现中的使用方法。RxJava是一种基于观察者模式的异步java库,可以提高开发效率、降低维护成本。通过RxJava,开发者可以实现事件的异步处理和链式操作。对于已经具备RxJava基础的开发者来说,本文将详细介绍如何利用RxJava实现事件总线,并提供了使用建议。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • 随着前端技术的发展,越来越多的开发者开始使用react、vue等web框架,但很少有人深入理解这些框架的源码。然而,这些框架底层都是由原生的javascript构建而成。对于初学前端的人来说,可能会认为javascript很容易上手,但实际上只是因为它被高度封装了。与能够使用封装类的人相比,能够理解框架原理的人则处于另一个层面。本文将深入剖析jquery源码,探寻框架底层的原理,帮助读者更好地理解web框架的运行机制。 ... [详细]
  • 作者表示自己最近工作非常忙碌,无法抽出时间写作。他计划在未来的几天内写关于namespace与C#的名字解析以及数据库内容转化为excel文件下载的知识。 ... [详细]
author-avatar
手机用户2502857731
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有