请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

Aria

中级会员

93

主题

268

帖子

757

积分

中级会员

积分
757
Aria
中级会员   /  发表于:2025-3-28 17:20  /   查看:245  /  回复:9
1金币
本帖最后由 Joestar.Xu 于 2025-4-9 09:41 编辑

调研编号:DOCXLS-12203

V7.0.7版本下是正常的:

image.png974289245.png

但是升级到V7.2.1后,就不正常了:
image.png893531494.png

demo已上传到附件,该问题为升级后问题,请尽快排查

GALAXY-28680_v707.zip

12.06 MB, 下载次数: 9

GALAXY-28680_v721guandata.zip

896.73 KB, 下载次数: 9

GALAXY-28680_v728withoutrep.zip

899.72 KB, 下载次数: 11

9 个回复

倒序浏览
Aria
中级会员   /  发表于:2025-3-31 10:48:01
沙发
请问该问题是否有进展
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2025-3-31 14:01:54
板凳
您好,问题已复现,该问题与https://gcdn.grapecity.com.cn/showtopic-235275-1-1.html属于同一个问题,都是由于扩展后单个单元格变成范围后导致的,可以靠修改模板来解决这个问题:

image.png733707885.png

image.png984501037.png
回复 使用道具 举报
Aria
中级会员   /  发表于:2025-4-1 15:54:38
地板
加上这个名称管理后,sheet1的其他列还有问题:
image.png774192504.png

且第二个sheet还是有空白行多出来
image.png523882750.png
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2025-4-2 09:26:44
5#
您好,除了要添加自定义名称来约束扩展逻辑以外,还要修改模板中的单元格语法才能按照预期显示。


另外,在旧版本中即使做了以上修改也会有空白行出现,我在V8中测试了一下,没有出现这个问题,推测是个旧版本的Bug,已经在新版本修复,具体请参考附件。

Spill805.zip

942.72 KB, 下载次数: 11

回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2025-4-10 14:37:21
6#
本帖最后由 Joestar.Xu 于 2025-4-10 14:38 编辑

您好,关于这个问题,主要是要弄清楚"TemplateOptions.ReferenceExpandPolicy"的用途,以及为什么要设置这样一个Option。

我们先理解GcExcel模板引擎在生成一个公式时,它是如何调整单元格引用的。假设有这样一个数据源:

image.png90304564.png

有这样一个模板:

image.png203389586.png

这个模板展开后,C5单元格中的公式应该变成什么样子呢?

可以肯定的是,它不能再是C4, 因为C4这个单元格会展开成多个单元格,它应该是这多个单元格共同构成的一个区域。这个区域的大小不是固定的,它取决于C4这个单元格能扩展出来的单元格数量,以及它扩展的方向。

而且,我们还知道,这里面有两家公司。每家公司都会有一个公式来计算总销售额,两个公式不能打架。因此,当我们根据模板公式=sum(C4)生成报表的公式时,并不是把模板C4单元格展开的所有单元格都拿进来考虑,而是要筛选,只选择和当前公司有关的那一部分单元格。

最后,这个报表展开后是这样:

image.png853228149.png

我们可以看到,在展开的报表中,生成了两个公式,

一个在C9单元格,内容是“= SUM (C4:C8)”,一个在C16单元格,内容是“=SUM(C13:C15)”。

GcExcel的模板引擎究竟是怎么计算出区域C4:C8和C13:C15的呢?

1.  首先,模板引擎会根据父子关系把所有的单元格构造成一棵树,树的根节点是worksheet。为了简化,我们只挑选我们关注的这几个单元格,出来的树形图是这样(图中括号表示当前单元格对应的模板单元格)。

image.png770899352.png

2. 模板引擎需要为C9(C5)和C16(C5)这两个单元格生成公式,因为这两个单元格是模板单元格C5扩展来的,它上面有公式=sum(C4)。

3. 模板引擎发现公式中引用了C4单元格,它需要去找C4单元格扩展出来的单元格。但它不能把所有C4扩展出来的单元格都找出来,而是要找和当前单元格有关的单元格。当模板引擎为C9(C5)生成公式时,它会先向上找C5和C4的父单元格C2,于是会找到C2(C2)这个单元格,然后向下找所有c4扩展出来的单元格,于是会找到c4(c4),c5(c4),c6(c4),c7(c4),c8(c4), 这些单元格构成的区域是C4:C8。

4. 最终,模板引擎为c9(C5)生成一个公式:=sum(C4:C8),同理,也为C11(c2)生成一个公式:=sum(C13:C15)。

经过上面的分析,我们可以看出,模板引擎在生成公式的时候,它会考虑单当前单元格和被引用单元格的关系,他们共同的父单元格是一个关键因素,它是挑选被引用单元格的依据。

这是GcExcel 的模板引擎在生成公式时的默认策略,这个策略在大部分情况下都符合您的期望,但是在有些情况下,和您的期望不同,比如您这个模板。

我们看看这个模板的特殊性,我们只挑选我们需要关注的几个单元格,B8,C8,M8,N8,BO8,CC8,其它无关的单元格隐藏掉

image.png438079528.png

下面是这几个单元格的内容

单元格
内容
B8
{{ds_5.c34(S=None)}}
C8
{{ds_4.c37(S=None,C=None)}}
M8
{{==IFERROR(RANK(N8,N:N),"")(S=None,C=C8)}}
N8
{{==IFERROR(BO8/CC8-1,"")(S=None,C=B8)}}
BO8
{{=SUM(ds_5.c0)(S=None,C=B8)}}
CC8
{{=SUM(ds_5.c13)(S=None,C=B8)}}
需要注意:N8,BO8,CC8的父单元格是B8, M8的父单元格是C8,C8没有父单元格,可以认为它的父是Worksheet,B8的父也是worksheet,因为前面的A8是空的。下面是模板单元格的父子关系图。

image.png660714721.png

模板单元格M8上有一个公式: =IFERROR(RANK(N8,N:N),""), 当M8展开后,它会生成很多单元格,比如:M8(M8),M9(M8),M10(M8)…,模板引擎需要为每一个单元格生成一个公式,公式中的N8这个单元格应该变成什么呢?

根据我们前面介绍,模板引擎需要从单元格树中的所有N8展开的单元格中,挑选和当前单元格有关系的单元格。但发现,M8和N8没有共同的父,他们最近的共同的祖先是Worksheet, 于是,模板引擎认为,worksheet下面所有的N8生成的单元格,都和当前单元格有关,于是就生成了公式:

=IFERROR(RANK(N8:N17,N:N),"")。

这个公式不是我们期望的,造成这个问题的原因是M8的父单元格和其它父单元格不一样,如果M8的父单元格也是B8, 生成的公式就是我们期望的。

不知道为什么要这样的设计模板?B8和C8都是门店,但它们内容不同,N8,BO8,CC8是基于B8的门店分类,而M8基于C8的门店分类,把它们用一个公式关联起来,感觉逻辑上不合理。

当然,现实中有各种各样的需求,只能说,这种需求,模板引擎默认的公式扩展策略无法满足需要,需要采用另一种策略。

GcExcel提供了一个选项"TemplateOptions.ReferenceExpandPolicy",它可以改变公式中单元格引用的扩展策略,如果把它设置为”Excel”,它就会按照Excel中复制/粘贴的策略走。

Excel中对公式的复制/粘贴策略是怎么样的呢?它不会考虑被引用单元格的变化,只考虑当前单元格的位置,它有这样两条原则:

1. 绝对引用保持不变,比如$A$1这样的单元格,不管公式复制到哪儿都不变。

2. 相对引用不改变大小,只改变位置,当前单元格位置偏移了多少,那么引用的单元格位置也偏移多少。

对于这个模板,刚好Excel 这种复制策略能满足需求,因此需要设置选项"TemplateOptions.ReferenceExpandPolicy"为”Excel”

回复 使用道具 举报
Aria
中级会员   /  发表于:2025-4-16 10:09:24
7#
你好,GC模板引擎是需要M8 和 N8 是同一个父格,这是一个什么潜在的逻辑吗?是相邻单元格的父格要一致?我们想要知道要想模板符合GC模板引擎的计算逻辑,模板在设计上有什么样的限制

另外,提到的在V8中已修复,是指在配置TemplateOptions.ReferenceExpandPolicy=true后就可以了,还是还需要修改模板?如果需要修改模板,要怎么修改,是否有不修改模板的方案
image.png340765380.png
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2025-4-16 11:25:19
8#
本帖最后由 Joestar.Xu 于 2025-4-16 11:26 编辑

如果M8和N8的父格不是同一个父格的话,模板引擎在扩展的时候会寻找他们的共同父格,最高级为WorkSheet级别。

M8中的公式引用了N8,且M8和N8都会扩展,由于共同父格为WorkSheet,于是,模板引擎认为,WorkSheet下面所有的N8生成的单元格,都和当前单元格M8有关。

如果你将{{==IFERROR(RANK(N8,N:N),"")(S=None,C=C8)}}中的C=C8更改为C=B8,与N8的父格一致,他们将会同步扩展,并且符合客户的要求。

V8中的修复指的是在配置了TemplateOptions.ReferenceExpandPolicy=true,且修改了模板中的部分公式后,不会有多余的空行展示出来。

如果是V7的话,配置了TemplateOptions.ReferenceExpandPolicy=true,且修改了模板中的部分公式后,会有多余的空行展示出来。
回复 使用道具 举报
Aria
中级会员   /  发表于:2025-4-17 11:25:00
9#
1. 在实际运用中,M8 和 N8就是会有父格不一样的场景。V8中修复,提到需要修改模板的部分公式,具体修改了哪些?
2. “我们想要知道要想模板符合GC模板引擎的计算逻辑,模板在设计上有什么样的限制” 这个希望能详细说明下,只有了解了这其中的逻辑,才能更好的引导客户按规范去实现自己的业务场景
3. 该问题是否能在7版本中修复
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2025-4-18 08:58:54
10#
您好,

具体的修改内容请参考五楼的附件,修改了其中的M8、Z8:AC8这五个单元格。

其他的问题目前还在确认中,有结果会在帖子中回复您。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部