惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
GbyAI
GbyAI
爱范儿
爱范儿
H
Hackread – Cybersecurity News, Data Breaches, AI and More
C
Check Point Blog
M
MIT News - Artificial intelligence
量子位
宝玉的分享
宝玉的分享
MongoDB | Blog
MongoDB | Blog
V
Visual Studio Blog
罗磊的独立博客
F
Fortinet All Blogs
美团技术团队
博客园_首页
博客园 - 【当耐特】
L
LangChain Blog
月光博客
月光博客
腾讯CDC
The Cloudflare Blog
D
Docker
博客园 - 聂微东
Stack Overflow Blog
Stack Overflow Blog
WordPress大学
WordPress大学
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报

博客园 - USEGEAR

学习使用 处理Python对象和列表【5】 学习使用:创建 Python 可调用的 Delphi 函数【4】 学习使用TPythonDelphiVar组件 数据交换Delphi与Python传值【3】 学习使用 数据交换 Delphi 与 Python 传值【2】 学习使用 Python4Delphi 是什么【1】 学习unigui【47】扫码安装apk 学习unigui【46】让客户端浏览器可以选下载你的apk 学习unigui【45】UnimDatePicker等按钮汉化崩溃 学习unigui【44】如何和uinHTMLFrame打交道 学习unigui【43】如何和控件打交道 学习unigui【42】UnimDatePicker的使用 学习unigui【41】htmlframe的交互现象 学习unigui【40】加入监控墙-1 头大的内存泄漏 学习unigui【39】单独文件在ms win server 上执行的坑 学习unigui【38】重新认识UUNIGUI--为什么这样快? 站在“架构与性能”层面重新审视 学习unigui【37】nginx的反向代理 ,程序中的重新定向 学习unigui【36】把数据导航放在Unidbgrid脚中 学习unigui【35】dbgrid字段宽度自适应 KingSADA的工业历史数据库的访问
学习unigui【48】lucksheet表格的显示object
USEGEAR · 2026-06-10 · via 博客园 - USEGEAR

图片

图片

结论:[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 当前对象域里的数据。