USEGEAR

导航

学习unigui【48】lucksheet表格的显示object

图片

图片

 

 

结论:[object Object] 这次不是普通的数据格式错误,根因是 V20 填报页运行在 iframe 中,父窗口传入的 Luckysheet JSON 对象和 iframe 内部 Luckysheet 运行时不在同一个 JS 对象域。

问题现象

V20 填报页打开报表时,部分单元格本应显示正常文本或公式结果,却显示成 [object Object]

同时会出现几个误导点:

  1. 后端传来的 JSON 看起来是正常对象。
  2. 前端 typeof cell === 'object' 也成立。
  3. 手工把 m/v 转成字符串,短时间似乎能缓解。
  4. 但刷新公式、重绘 canvas、切换运行时缓存后,问题仍可能复现。

所以它表现像“某些单元格值没有格式化”,但实际不是简单的显示格式问题。

问题根因

关键点来自 Luckysheet issue dream-num/Luckysheet#1334 的启发:iframe 跨 JS realm 会导致对象身份判断失效。

V20 的数据流是:

父窗口/宿主页面生成 payload
-> 通过直接调用或消息传给 iframe
-> iframe 内的 Luckysheet 使用这些对象初始化

这里的坑是:

  1. 父窗口里的 Object 和 iframe 里的 Object 不是同一个构造器。
  2. 一个对象从父窗口传进 iframe 后,typeof value === 'object' 仍然为真。
  3. 但在 iframe 内执行 value instanceof Object 可能为假。
  4. Luckysheet 内部若依赖这类判断,就可能不把单元格对象当作对象处理。
  5. 最后对象被当作普通值渲染,字符串化后就变成 [object Object]

这也是为什么之前一直在 m/vcelldataflowdata、canvas 刷新上补丁,很难彻底解决。那些都是结果层修补,不是入口处修正对象域。

解决思路

正确收口点是在 luckysheet.create(...) 之前,把宿主传进来的 Luckysheet JSON 重新落到 iframe 当前 JS realm 内。

当前处理是:

 
function rehomeLuckysheetDataForIframe(data) { if (!data || typeof data !== 'object') return data; try { return JSON.parse(JSON.stringify(data)); } catch (e) { console.warn('[V20] iframe data rehome failed:', e); return data; } }

调用位置:

 
sheets = rehomeLuckysheetDataForIframe(sheets);

它的意义不是业务清洗,也不是格式转换,而是“对象重新归属”:让传入 Luckysheet 的所有普通 JSON 对象都变成 iframe 自己上下文里的对象。

防回归要点

  1. 不要再把 [object Object] 首先当作 m/v 字符串问题。
  2. 不要在 workbookCreateAfter 后做全表运行时 normalize 作为常态路径。
  3. 不要靠二次 refreshFormula()、canvas 强刷、全量扫描来兜底。
  4. rehomeLuckysheetDataForIframe() 是 iframe 版 V20 的关键入口保护,不应删除。
  5. 公式链仍保留 calcChain / refreshFormula(),但避免向 setCellValue 写 { f: formula } 这类对象值。

一句话总结:
[object Object] 的根因是 iframe 跨对象域导致 Luckysheet 识别单元格对象失败;解决方式是在 Luckysheet 初始化前,把宿主传入的 JSON 深拷贝成 iframe 当前对象域里的数据。

posted on 2026-06-10 09:49  USEGEAR  阅读(2)  评论(0)    收藏  举报