找回密码
 立即注册

QQ登录

只需一步,快速开始

nutstore
金牌服务用户   /  发表于:2024-6-7 17:32  /   查看:1548  /  回复:7
我们注意到非常偶然地有的表格,会在没有设置主题颜色的情况下,出现主题颜色变化的情况。


改变前
image.png116559142.png

改变后
image.png443064574.png

对 json 进行比较后,我们发现这个cell的背景色使用了accent5,而themeColor发生了变化
* accent5 从 4472C4 变成了 4bacc6
* name 从 Office Theme 变成了 Office
没有详细比较其他的部分,从呈现来看单元格中数据没有修改,似乎主要就是themeColor变了

而且并不是每个表格都会发生变化,比如我们这一周没有发布代码更新,表格本身也没有更新,但是表格复制出来再编辑后,有的是改变了的、也有没有改变的。


7 个回复

倒序浏览
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-6-11 09:39:35
沙发
您好,您上文提到了”复制“,也就是说,楼上提到的问题仅仅是在”复制“的基础上出现的问题吗?
如果是的话,您可以尝试打开浏览器版本的Ms Excel ,复制后进行粘贴,看是否主题色会发生变化。
以及,如果可以的话,请上传下您对比的两个json文件。我们在此基础上先调研下。
回复 使用道具 举报
nutstore
金牌服务用户   /  发表于:2024-6-11 12:00:30
板凳
Ellia.Duan 发表于 2024-6-11 09:39
您好,您上文提到了”复制“,也就是说,楼上提到的问题仅仅是在”复制“的基础上出现的问题吗?
如果是的 ...

您好

“复制”是说我们是把excel解析成ssjson后作为模板,要用时从模板ssjson复制一个文件出来,在业务中只修改新的文件。修改主要是后端gcexcel完成,展现主要是spreadjs完成,代码中不包括对 themeColor 的修改


在这个流程中,我们发现新的文件和之前作为模板的文件不一样。


可以对照的附件如下,这是两个从业务中复制出来然后脱敏了的 ssjson,一个和模板的themeColor保持了一致,一个和模板的themeColor有明显差别


【点餐啦】-2024年06月06日.ssjson (39.94 KB, 下载次数: 1)
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-6-11 15:08:32
地板
您好,由于涉及两个产品,目前需要排查下是哪个产品问题。
梳理下您的业务逻辑
1、excel转为json
2、GcExcel 复制json ,
3、GcExcel 设置数据源
4、GcExcel处理后返回给前端
5、SpreadJS接收ssjson,并展示。

我们需要知道 ,有问题的json第一次出现在哪一步?
是从第二步开始就是有样式问题的json  ,
还是从第三步后,设置数据源后开始有问题,
还是第四步,GcExcel给前端传的是有问题的json ,
还是第五步?

根据您给出的json文件,发现其用的是table的主题样式'Light 13',
对其切换table样式后,标题行的样式没有发生变化,似乎对标题行做了特殊处理。
image.png883440551.png
需要知道这部分设置的相关代码 。



回复 使用道具 举报
nutstore
金牌服务用户   /  发表于:2024-6-13 19:36:04
5#
Ellia.Duan 发表于 2024-6-11 15:08
您好,由于涉及两个产品,目前需要排查下是哪个产品问题。
梳理下您的业务逻辑
1、excel转为json

大致是

模板的初始化

- java:gcexcel 专门管修改ssjson的事情,比如说excel转为 ssjson。存成模板A
从模板复制新的ssjson,重复修改新的ssjson

- 业务流程中,需要的时候复制一份ssjson,从模板A复制出来一份B,不修改内容
- 使用 spreadjs 展示B,能修改样式的地方我们全部隐藏了,产生的修改事件发给后端,gcexcel 把修改应用到 ssjson 里面


问题出在后面修改的过程里面。可以认为gcexcel转换成ssjson应该是好着的。就是看看 spreadjs


修改的内容类似于(大部分时候只是设置value,只有 type sheetName row col value。只有修改样式时有style tag那些,但是ui上我们隐藏所有能改样式的地方了,这个只是构造出来的一个例子)
  1. {
  2.     "events": [
  3.         {
  4.             "col": 4,
  5.             "row": 0,
  6.             "sheetName": "数据汇总",
  7.             "style": {
  8.                 "backColor": "Accent 5",
  9.                 "borderBottom": {
  10.                     "color": "rgb(216,216,216)",
  11.                     "style": 1
  12.                 },
  13.                 "borderLeft": {
  14.                     "color": "rgb(216,216,216)",
  15.                     "style": 1
  16.                 },
  17.                 "borderRight": {
  18.                     "color": "rgb(216,216,216)",
  19.                     "style": 1
  20.                 },
  21.                 "borderTop": {
  22.                     "color": "rgb(216,216,216)",
  23.                     "style": 1
  24.                 },
  25.                 "decoration": {},
  26.                 "font": "700 16px Calibri",
  27.                 "foreColor": "Background 1",
  28.                 "formatter": "General",
  29.                 "hAlign": 0,
  30.                 "locked": true,
  31.                 "name": "__b-1-30000000-0",
  32.                 "shrinkToFit": false,
  33.                 "textDecoration": 0,
  34.                 "textIndent": 0,
  35.                 "themeFont": "Body",
  36.                 "vAlign": 1,
  37.                 "wordWrap": true
  38.             },
  39.             "tag": null,
  40.             "type": "cell_change",
  41.             "value": "姓名2"
  42.         }
  43.     ]
  44. }
复制代码




而且即使修改样式,也是在单元格的级别修改样式,类似于

  1. IWorksheet iWorksheet = workbook.getWorksheets().get(sheetName);
  2. if (iWorksheet == null) {
  3.     return;
  4. }

  5. // ...

  6.         IRange range = iWorksheet.getRange(changeItem.getInt("row"), changeItem.getInt("col"));

  7. // ...

  8. range.setValue(changeItem.get("value"));

  9. // ...
  10. JSONObject styleData = changeItem.optJSONObject("style", new JSONObject());
  11.         range.getStyle().fromJson(styleData.toString());
复制代码
我理解里面这样应该不会改到 themeColor?


代码比较多,不大好抽离出来一个最小的例子,逻辑就是上面这些了。代码里面没有其他地方有对style或者theme或者themeColor的修改


-----------------------------------------------

关于 Light13,这行的样式没有用这个。这次的问题和Light13这个 sheets.<TABLE>.tables[0].style ,也就是 { buildInName: Light13 }的这个样式没有关系。

这几个格子是通过 sheets.<TABLE>.namedStyles 使用了sheets.<TABLE>.theme.themeColor.accent5 这个颜色,这个颜色的值发生了改变。


<TABLE> 的值就是数据汇总,你们通过 jq 可以直接定位到值,或者编辑器搜索一下accent5就能搜到对应的位置。




回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-6-14 13:58:50
6#
您是否留下您的联系方式,电话沟通一下。
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-6-17 17:33:34
7#
您好,关于您给出的代码中
  1. range.getStyle().fromJson(styleData.toString());
复制代码


这个styleData是如何拿到的?
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2024-7-2 17:43:16
8#
您好,由于您长时间未回帖,本贴就先结帖啦。如果还有疑问,可以追贴询问。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部