最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

luckysheet踩坑记录

来源:博客园


(资料图)

这几天接手一个luckysheet的项目,新需求+填坑总共花了一周,整理下踩的坑。

一,数字变为科学计数

这个真的是要给开发团队特别狠的法克鱿,已经设置文本的单元格(sheet和excel两边都是),在贴贴excel单元格的时候会自动被覆盖成一个科学计数法。如果你觉得仅仅是一个样式问题就错了,直接复制单元格并不会触发cellUpdated,cellUpdateBefore,cellEditBefore,cellMousedownBefore等方法,简单来说你没有双击到单元格内部的,这些方法统统不触发。

①格式设置

挣扎了两天后,我还是找到了个方法cellRenderBefore(cell: any, position: any)

,渲染前,所有表格滚动导致新增行,贴贴内容导致的新增行或者更新行,删除行都会触发这个方法,终于蹭进来了=。=

let ct = { fa: "@", t: "s" };if (!cell) {//空白格初始化为文本格式 nativeWindow.luckysheet.setCellFormat(position.r, position.c, "ct", ct);}  这一段的效果就是直接贴超长数字给新的空白格也没问题,但是直接复制单元格依然会出错。当时我就艹了,把console打烂了之后,我发现虽然所有的空白格默认是没有cell格式的,但是贴贴时会根据内容给一个初始化的格式,这里是先天带坑!所以单元格的格式会覆盖你设置了的格式。if (cell && cell.ct.t != "s") {//包含科学计数被强制覆盖的,单独处理 nativeWindow.luckysheet.setCellFormat(position.r, position.c, "ct", ct);}②内容修正  到了这里总算把格式重置好了,但是显示的内容还是科学计数,还需要修正,原始的复制数据又找了半天,因为这个钩子函数不在单元格的函数集里,是在工作表里。rangePasteBefore(Array: any, data: any)前者记录你复制的单元格的起始位置,后者记录你复制的数据。  这里又有三个坑:    位置部分仅包含起始的位置,你复制了几行几列,这个不会存;    复制多行时,复制的内容会包含一堆col,一开始我以为是记录列结构的,后面发现我想多了,这里球用没有,想获取列只能根据每个tr里的td数量来确定;    如果复制的时候列宽不够,显示的xxxx,那真的就复制xxxx,这个效果看的我直呼高效。  了解坑后,通过计算存储每次复制的起始行列和内容集,可以在cellRenderBefore时把科学计数的内容还原。③懒渲染  并不是贴贴后所有的内容都会重新赋值了,你没有滚动下去,那些没展示的内容依然是科学计数吧,一提交就g。并且,提交时的赋值是在提交后生效,应该是考虑到性能问题,这个函数是微任务。  所以在提交时还有两部,一方面是提交时也强势刷新数据,另一方面提交要加个异步。funSaveSheetData(): void { new Promise((resolve, reject) => { this.SaveSheetData(); resolve(""); }).then(() => { this.SendSheetData(this); }) }二,单元格可复制及换行①允许复制:allowCopy: true  同时要注意,在之前截获复制的方法rangePasteBefore内,解析数据时要增加判断,保证默认的复制功能正常②允许换行  cell.tb=2,这里又忍不住吐槽了,你行高可以动态拉伸,为什么列宽只能设置固定啊?三,设置格式及删除后保存  一旦有了格式,sheet会认为这是有效单元格,提交时会把这个单元格算进来,所以在提交前需要判断有效的单元格。

关键词: 起始位置 复制功能 为什么列