行云数据 发表于 2023-3-22 11:34:15

GC获取结果和spreadjs显示不一致(DOCXLS-7830)

本帖最后由 Lynn.Dou 于 2023-3-22 17:42 编辑

问题描述:(生产反馈问题)
gcexcel获取excel表单和spreadjs显示不一致(Excel软件打开显示通过)。比如:


gcexcel获取excel表单sheet1中的B2单元格值为:不通过;但是通过spreadjs获取B2单元格只显示:通过;



问题DEMO(代码+excel底稿文件)详见附件;

Lynn.Dou 发表于 2023-3-22 17:30:04

您好,
问题已复现,已将此问题记录下来进一步调研原因,待有进展贴中通知您。
本贴先做保留处理。

行云数据 发表于 2023-4-7 16:53:19

Lynn.Dou 发表于 2023-3-22 17:30
您好,
问题已复现,已将此问题记录下来进一步调研原因,待有进展贴中通知您。
本贴先做保留处理。

请问这个问题有进展了吗?我们生产环境又出现了

Clark.Pan 发表于 2023-4-7 19:47:32

收到,我们跟进一下。

Lynn.Dou 发表于 2023-4-11 17:29:56

更新进展,经调研此问题属于浮点数问题的限制,
如果想保持计算结果一致,您可以在导入excel文件时设置setDoNotRecalculateAfterOpened(true),即导入后不重算公式。
示例代码如下:
Workbook workbook = new Workbook();
      XlsxOpenOptions options = new XlsxOpenOptions();
      options.setDoNotRecalculateAfterOpened(true);
      workbook.open("v33.xlsx",options);

行云数据 发表于 2023-4-18 14:42:57

Lynn.Dou 发表于 2023-4-11 17:29
更新进展,经调研此问题属于浮点数问题的限制,
如果想保持计算结果一致,您可以在导入excel文件时设置set ...

这个设置处理逻辑是什么呢?会引发其他的问题么?

Lynn.Dou 发表于 2023-4-18 18:01:47

行云数据 发表于 2023-4-18 14:42
这个设置处理逻辑是什么呢?会引发其他的问题么?

setDoNotRecalculateAfterOpened(true),即导入后不重算公式。
也就是不会对您导入工作簿的公式做重新计算。
举个例子,正常来说,您在SJS导出文件的时候,json中存储的已经是SJS计算后的公式值了。
如果此时导入GcExcel,GcExcel会根据公式字符串,走自己的计算引擎重新计算一遍。
由于“浮点数问题的限制”,出现了贴中所述情况。
如果setDoNotRecalculateAfterOpened(true),就不会再计算,会根据SJS导出文件的公式值来存储了。
页: [1]
查看完整版本: GC获取结果和spreadjs显示不一致(DOCXLS-7830)