chess3cake
发表于 2023-12-26 18:08:41
JoeJin 发表于 2023-12-26 17:57
OK,是否可以将您的场景理解为。您的产品提供了一个服务平台,您提供接口允许用户上传 Excel 模板。把用 ...
是的,我们会教给用户简单的gc模板语法,如果用户目标结果太过复杂才会由我们介入
chess3cake
发表于 2023-12-26 18:47:23
chess3cake 发表于 2023-12-26 18:08
是的,我们会教给用户简单的gc模板语法,如果用户目标结果太过复杂才会由我们介入
而且还面临公式扩展的问题,所以模板上数肯定是第一选择
JoeJin
发表于 2023-12-27 09:25:27
chess3cake 发表于 2023-12-26 18:08
是的,我们会教给用户简单的gc模板语法,如果用户目标结果太过复杂才会由我们介入
好的,理解。那 middle 计算出来的结果,是如何填到 B 页面的呢?
目前来看,流程如下:
A 页面模板上数 -> Middle 页面计算,过滤 -> ? -> B 页面。
主要还是想了解一下 B 页面,为什么也需要模板上数。数据目前是 Middle 产生的,从您提供的例子来看,通过Excel的数组公式,似乎是可以满足需求的。
chess3cake
发表于 2023-12-27 10:00:49
JoeJin 发表于 2023-12-27 09:25
好的,理解。那 middle 计算出来的结果,是如何填到 B 页面的呢?
目前来看,流程如下:
有一部分复杂公式,比如各种if,lookup,在数据量较大情况下执行较慢。我们会把它转变成一段对应的脚本,比如说sql或者groovy,然后用代码清洗,再拿到数后对B进行上数。也就是middle页和b页可能并不完全由公式关联。但是b页这种目标sheet往往会有公式/样式扩展的需求,很难直接在脚本中对b页直接上数。
JoeJin
发表于 2023-12-27 11:25:01
chess3cake 发表于 2023-12-27 10:00
有一部分复杂公式,比如各种if,lookup,在数据量较大情况下执行较慢。我们会把它转变成一段对应的脚本, ...
好的,感谢您详细的需求描述。
需求已经收录,我们将在后续的版本中研究并考虑实现。
如果有任何进展,我们将会与您分享。
现在没有太好的 workaround 方法,如果您能够区分 B 页面的话,可以现将B页面从模板页摘出来,等A页面上数及middle页面完成后,将B页面复制回来,再一次执行模板上数。
移动工作表,可以参考: https://demo.grapecity.com.cn/documents-api-excel-java/demos/moveworksheetbetweenworkbooks
chess3cake
发表于 2023-12-27 11:33:09
JoeJin 发表于 2023-12-27 11:25
好的,感谢您详细的需求描述。
需求已经收录,我们将在后续的版本中研究并考虑实现。
如果有任何进展, ...
实际场景会更复杂,b表可能是其他结果表的中间表,b表的公式扩展会有连带反应,所以这种做法必须要获取到从b开始的所有有公式关联的表,但如果b的关联表中使用模板公式,那么就无法直接识别。
由此引申出来的问题是,
我能够根据模板语法来筛选range吗?就像已经提供的根据样式等筛选range的功能一样。如果可以,那我就能直接区分出模板sheet。
JoeJin
发表于 2023-12-27 17:40:35
chess3cake 发表于 2023-12-27 11:33
实际场景会更复杂,b表可能是其他结果表的中间表,b表的公式扩展会有连带反应,所以这种做法必须要获取到 ...
可以试试使用“搜索”功能找到包含数据源的单元格。
https://www.grapecity.com.cn/developer/grapecitydocuments/excel-java/docs/Features/ManageWorksheet/RangeOperations/FindandReplaceData
根据数据源的字段来查找可能的单元格,再根据查找出来的结果,判断如果有 {{}} 就是模板语言的单元格。
在第一次上数之前,先把B页面可能用到的数据源都替换掉。
在第二次上数的时候,再替换回来。
chess3cake
发表于 2023-12-27 17:50:27
JoeJin 发表于 2023-12-27 17:40
可以试试使用“搜索”功能找到包含数据源的单元格。
https://www.grapecity.com.cn/developer/grapecity ...
可以尝试,感觉路子是ok的
chess3cake
发表于 2023-12-27 20:10:42
本帖最后由 chess3cake 于 2023-12-27 20:14 编辑
JoeJin 发表于 2023-12-27 17:40
可以试试使用“搜索”功能找到包含数据源的单元格。
https://www.grapecity.com.cn/developer/grapecity ...
我使用以下代码循环查询是能够达到检索到所有可能单元格的目的。
IRange usedRange = workbook.getWorksheets().get(0).getUsedRange();
FindOptions findOptions = new FindOptions();
findOptions.setLookIn(FindLookIn.Values);
findOptions.setLookAt(LookAt.Part);
IRange candidateTemplateCell = usedRange.find("{{", findOptions);
while (candidateTemplateCell != null) {
System.out.println(candidateTemplateCell.getValue());
candidateTemplateCell = usedRange.find("{{", candidateTemplateCell, findOptions);
}
但是经过我的测试,find并不能支持正则表达式,如果我将上述代码中的find字符串从"{{"替换成"\\{\\{(.)+\\}\\}",该代码无法搜索到预期单元格。
有使用正则表达式进行搜索的案例分享一下吗,或者我有办法自定义匹配逻辑吗?
使用find这个api,和我自己遍历range拿到所有单元格进行评估,这两个方案之间有什么显著差异吗?
JoeJin
发表于 2023-12-28 11:28:14
chess3cake 发表于 2023-12-27 20:10
我使用以下代码循环查询是能够达到检索到所有可能单元格的目的。
https://demo.grapecity.com.cn/documents-api-excel-java/demos/specialcellsfindanytext
您可以参考这个例子,使用正则表达式搜索,这个就是自己遍历了。