报表按条件设置单元格融合原创
金蝶云社区-周立思
周立思
4人赞赏了该文章 1330次浏览 未经作者许可,禁止转载编辑于2023年02月24日 15:59:57

一、需求

        报表某个金额字段按照报表多个字段组合条件设置单元格融合,数据量较大。

二、思路

        2022年回答社区提问:问题需求是希望按照分组条件进行单元格融合(https://developer.kingdee.com/questions/368779787076477696/answers/370627551666134528?productLineId=29  )。当时平台只支持单元格按照相同值融合,给出的解决方案利用了零宽度字符实现了按分组条件进行融合。后续12月份平台支持自定义单元格融合可以行设置不融合单元格:https://developer.kingdee.com/article/311516534676030464?productLineId=29&isKnowledge=2  。

        根据平台补丁支持的部分行设置不融合和 PackageDataEvent.getNoMergeKey() 设置的是当前行不与上一行进行融合,数据量较大如果只在packageData() 处理比较慢,想到另外一个思路:

  1. 将多字段的值比较组装成字符串,利用DataSet的 preRowValue()函数判断和上一行是否是相同条件。

  2. 报表查询插件 DataSet 增加新字段(字符串类型,存储的是当前行需要设置不融合的字段集合(用逗号拼接),为空表示当前行不需要设置不融合)。


三、实现过程

利用MapFunction类实现多字段值进行判断

image.png

MapFunction类:下图示例代码中仅进行了 String.join() 用逗号拼接成字符串赋值字段 no_merge_compare 进行比较。

image.png

利用 preRowValue() 函数判断行是否设置不融合,如果和上一行比较字段的值相同则赋值空,否则赋值不融合字段用逗号拼接的字符串。如下图示例代码:

image.png

报表表单插件 packageData() 设置行不融合单元格,如下图示例代码:

image.png


四、效果图

image.png


五、开发环境版本

v5.0.011


六、注意事项

报表列表需要包含示例代码中字段 no_merge_fields ,可以隐藏不显示,否则 PackageDataEvent.getRowData() 无法获取字段 no_merge_fields 的值。

七、参考资料

  1. 报表新增单元格融合功能:https://developer.kingdee.com/article/311543846003545856?productLineId=29&isKnowledge=2 

  2. 报表设置单元格融合:https://developer.kingdee.com/article/311516534676030464?productLineId=29&isKnowledge=2 (支持部分行设置不融合)

赞 4