找回密码
 立即注册

QQ登录

只需一步,快速开始

spreadjs666
金牌服务用户   /  发表于:2024-11-13 20:39  /   查看:147  /  回复:12
本帖最后由 spreadjs666 于 2024-11-13 20:44 编辑
  1. const designer = new GC.Spread.Sheets.Designer.Designer(document.getElementById("gc-designer-container"));
  2.   const spread = designer.getWorkbook();
  3.   const sheet = spread.getActiveSheet();
  4. spread.options.scrollByPixel = true;
  5. spread.options.scrollbarShowMax = true;
  6. spread.options.scrollbarMaxAlign = true;
  7. spread.options.allowExtendPasteRange = true;
复制代码


如附件所示,在官网中执行以上代码,并将行宽拖宽,滚动后,执行formJSON + showCell, 第一次有偏差,第二次才生效。
场景:在数据协同过程中,保重用户的视图不产生位移,fromJSON,会导致试图重新定位,因此需要使用showCell和scroll进行还原
此问题为线上问题,因此希望能尽快给出解决方案,感谢

PS:帖子编辑有bug,代码补充在结尾了:
spread.suspendPaint();
spread.suspendEvent();
spread.fromJSON(spread.toJSON())
// 模拟定位到fromJSON前的单元格
spread.getActiveSheet().showCell(0,3,'top', 'left')
// 模拟定位到fromJSON前的单元格的偏移量
spread.getActiveSheet().scroll(0,100);
spread.resumePaint();
spread.resumeEvent();


录屏2024-11-13 20.12.01.mov

9.7 MB, 下载次数: 3

12 个回复

倒序浏览
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:7 天前
沙发
本帖最后由 Lynn.Dou 于 2024-11-14 15:12 编辑

您好,
您代码中写了 spread.getActiveSheet().scroll(0,100),但是我看视频中并没有执行。
请将视频中第二段代码修改如下,测试看问题是否解决:
  1. //获取偏移值
  2. const topRowOffset = sheet.getViewportTopRowOffset();
  3. const leftColumnOffset = sheet.getViewportLeftColumnOffset();
  4. spread.suspendPaint();
  5. spread.suspendEvent();
  6. spread.fromJSON(spread.toJSON())
  7. // 模拟定位到fromJSON前的单元格
  8. spread.getActiveSheet().showCell(0,3,GC.Spread.Sheets.VerticalPosition.top, GC.Spread.Sheets.HorizontalPosition.left)
  9. spread.resumeEvent();
  10. spread.resumePaint();
  11. // 模拟定位到fromJSON前的单元格的偏移量,需注意要放在paint之后执行
  12. spread.getActiveSheet().scroll(topRowOffset,leftColumnOffset);
复制代码

image.png89458617.png
回复 使用道具 举报
spreadjs666
金牌服务用户   /  发表于:7 天前
板凳
Lynn.Dou 发表于 2024-11-14 15:11
您好,
您代码中写了 spread.getActiveSheet().scroll(0,100),但是我看视频中并没有执行。
请将视频中第 ...

您好,采用您给出的代码之后,发现还是无法按照预期执行:
  1. const designer = new GC.Spread.Sheets.Designer.Designer(document.getElementById("gc-designer-container"));
  2.   const spread = designer.getWorkbook();
  3.   const sheet = spread.getActiveSheet();
  4. spread.options.scrollByPixel = true;
  5. spread.options.scrollbarShowMax = true;
  6. spread.options.scrollbarMaxAlign = true;
  7. spread.options.allowExtendPasteRange = true;
  8. function fromJSONFn () {
  9.   try {
  10.     let sheet = spread.getActiveSheet();
  11.     const row = sheet.getViewportTopRow(1,1)
  12.     const col = sheet.getViewportLeftColumn(1,1)
  13.        //获取偏移值
  14.     const topRowOffset = sheet.getViewportTopRowOffset();
  15.     const leftColumnOffset = sheet.getViewportLeftColumnOffset();
  16.     spread.suspendPaint();
  17.     spread.suspendEvent();
  18.     spread.fromJSON(spread.toJSON())
  19.     // 模拟定位到fromJSON前的单元格
  20.     spread.getActiveSheet().showCell(row,col,GC.Spread.Sheets.VerticalPosition.top, GC.Spread.Sheets.HorizontalPosition.left)
  21.     spread.resumeEvent();
  22.     spread.resumePaint();
  23.     // 模拟定位到fromJSON前的单元格的偏移量,需注意要放在paint之后执行
  24.     spread.getActiveSheet().scroll(topRowOffset,leftColumnOffset);
  25.   } catch (err) {
  26.     console.log(err);
  27.   }
  28. }
复制代码
调用fromJSONFn();页面还是未符合跳转预期
触控栏快照2024-11-14 16.16.13.png
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:7 天前
地板
收到,我们再调查一下看看
回复 使用道具 举报
spreadjs666
金牌服务用户   /  发表于:6 天前
5#
Richard.Ma 发表于 2024-11-14 17:52
收到,我们再调查一下看看

好的,线上问题,麻烦尽快,十分感谢
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:6 天前
6#
从您此前提供的视频来看,您期待的效果应是视图聚焦在cell(0,3)上,而不会产生偏移。
所以前面提到的方案,是模拟的视频中在控制台执行代码,测试是可以的。

不过,如果不通过控制台,而是在demo中通过代码执行,直接showCell就可以恢复cell(0,3)视图(不需要scroll),不会有偏移。所以这种差异应是受打开控制台对视图造成了影响导致的。
我整理了一个测试demo,您可以点击按钮看下效果,看在您的项目中直接执行showCell是否可以满足预期。
image.png950119323.png
如果我的理解有偏差,您留下联系方式,我们电话沟通下。

demo-sjs模板 - V17.0.4.html

4.86 KB, 下载次数: 1

回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:6 天前
7#
根据沟通的需求,重新调整了demo,您参考下。(完整代码见附件)
注:demo中监听了TopRowChanged、LeftColumnChanged事件来记录当前视图的单元格信息,以便后续恢复。
  1. function events(sheet) {
  2.                 sheet.bind(GC.Spread.Sheets.Events.TopRowChanged, function (sender, args) {
  3.                     console.log(args);
  4.                     rowOffset = args.newOffset;
  5.                     newRow = args.newTopRow;
  6.                 });
  7.                 sheet.bind(GC.Spread.Sheets.Events.LeftColumnChanged, function (sender, args) {
  8.                     console.log(args);
  9.                     columnOffset = args.newOffset;
  10.                     newColumn = args.newLeftCol;
  11.                 });
  12.             }
复制代码


demo-sjs模板 - V17.0.4.html

5.42 KB, 下载次数: 1

回复 使用道具 举报
spreadjs666
金牌服务用户   /  发表于:6 天前
8#
Lynn.Dou 发表于 2024-11-15 16:56
根据沟通的需求,重新调整了demo,您参考下。(完整代码见附件)
注:demo中监听了TopRowChanged、LeftCol ...

您好,您的demo是符合预期的。
但经排查,我们使用了spread.options.scrollbarAppearance = GC.Spread.Sheets.ScrollbarAppearance.mobile;
,一旦使用此属性,您给的demo也产生了不符合预期的情况,
我们为了用户的视觉体验使用了GC.Spread.Sheets.ScrollbarAppearance.mobile,因此期望能给出一个可以共存的可行方案,十分感谢。
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:3 天前
9#
本帖最后由 Lynn.Dou 于 2024-11-18 14:45 编辑

好的,我再结合您提供的信息调研下,有结果贴中同步。(SJS-27356)
回复 使用道具 举报
spreadjs666
金牌服务用户   /  发表于:前天 10:51
10#
Lynn.Dou 发表于 2024-11-18 10:50
好的,我再结合您提供的信息调研下,有结果贴中同步。(SJS-27356)

请问有进展了吗?
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部