luckysheet踩坑记录
2023-04-18 15:18:50 时间
这几天接手一个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会认为这是有效单元格,提交时会把这个单元格算进来,所以在提交前需要判断有效的单元格。
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击