加班,这两天在弄这个。有些复杂,写的头大。思路是清晰的,在做把逻辑变成编码实现这一步。
实现这个算法,很考验逻辑思维能力,以及思维的严谨性,需要覆盖到所有情况,不然,就会出错。
之所以要写这个算法逻辑,是为了做数据渲染的优化,把数据验证的设置从单个单元格的设置,改变为按照区域设置,这样能可行的话,会大大缩减数据量,因为属于某个范围的,只需要写一条数据,而不作优化的话,多少单元格,就有多少条数据。但是不容易,关联太多,逻辑复杂。
如果整列设置了数据验证,在web表格里却是按照单个单元格设置的话,重复的数据从接口返回都是很大数据量,这样导致从数据获取到整个页面加载出来速度就很慢。
把excel文件解压出来后,能看到某个设置了区域范围的sheet的xml结构数据中,数据验证的部分确实是按照范围来设置的。那怎么web版的表格中如果按照区域设置难点在哪呢?数据保存,按照范围拼接成字符串格式作为key值当然没问题,难点在于,存在旧区域被新区域分割的情况,区域是矩形范围,一个矩形和现有的矩形有交集,就会导致原先的矩形区域再被拆成若干个矩形:
如果另外设置一个区域M时,已经存在了区域A,这两个区域有交集,且区域M可能不只跟A区域有交集,还有B,C……等区域。
这时候与M有交集的A区域,有几种可能:
1:完全重合,2:A包含M,3:M包含A,4:有交集但互相无包含。
对于1和3,需要把旧区域直接删除替换新区域即可;
对于2和4,拿到其相交区域,依据相交区域,找其上下左右,至多会把旧区域A分割为4部分,当然可能是3部分,2部分,1部分,那就要看其left矩形存在与否,同样的,top,right, bottom矩形存在与否。
拿到这些被分割的区域,就要替换旧区域的key,要做这个。
上面只说了其中的区域分割的思路和逻辑,这只是其中一部分。还有诸多的细节。以及数据的管理和关联等。另外,还有在一个区域中,有插入行列的操作,会导致区域扩展,以及插入行列位置之后涉及区域的key值的更新。
另外还有,复制粘贴以及剪切粘贴,导致旧区域的被分割,这其实还是可以归纳为:用新区域分割旧区域的问题。跟选中新区域进行范围设置是一样的,只是数据来源不同。
但是,新区域的设置数据的来源,就没有那么简单了,不是统一把这个新区域设置为某个值。它是要从复制区域里找它所包含的数据验证区域的集合,再把这些区域一一对应到新区域这个目标,设置到新区域里,相当于把原来的做个整体的平移,坐标的转换。就是区域的增加,不过这里的区域可能是多个。这是新增的内容,此外还有如果是剪切,也会导致区域分割的问题。
比如一个区域的剪切,就可能会破坏原先的区域数据,导致原先的区域被分割,目标区域也同样可能会导致一些原来的区域被分割。
从某处剪切,就是圈一个个范围,里面有哪些区域在其中,这就是一个区域分割的场景。因为这个范围可能与若干区域有交集,就会把这些区域给分割。也就是应用到这里的是把涉及的区域都更新替换为分割后的区域。目标区域导致的区域分割,同样的道理。
网友评论