这几天接手一个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会认为这是有效单元格,提交时会把这个单元格算进来,所以在提交前需要判断有效的单元格。 标签:luckysheet,记录,单元格,cell,复制,提交,格式,ct From: https://www.cnblogs.com/ashlly/p/17057459.html