文本讨论了如何在大数据量报表中,根据多个字段的组合条件设置单元格融合的需求、思路、实现过程及注意事项。初期平台仅支持相同值融合,通过零宽度字符实现按分组条件融合。后平台支持自定义融合,提出了通过比较多字段值并利用DataSet的preRowValue()函数判断是否融合的新思路,并给出了MapFunction类的实现示例和packageData()中的设置方法。还提醒报表列表需包含特定字段,并提供了相关参考资料链接。
一、需求
报表某个金额字段按照报表多个字段组合条件设置单元格融合,数据量较大。
二、思路
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() 处理比较慢,想到另外一个思路:
将多字段的值比较组装成字符串,利用DataSet的 preRowValue()函数判断和上一行是否是相同条件。
报表查询插件 DataSet 增加新字段(字符串类型,存储的是当前行需要设置不融合的字段集合(用逗号拼接),为空表示当前行不需要设置不融合)。
三、实现过程
利用MapFunction类实现多字段值进行判断
MapFunction类:下图示例代码中仅进行了 String.join() 用逗号拼接成字符串赋值字段 no_merge_compare 进行比较。
利用 preRowValue() 函数判断行是否设置不融合,如果和上一行比较字段的值相同则赋值空,否则赋值不融合字段用逗号拼接的字符串。如下图示例代码:
报表表单插件 packageData() 设置行不融合单元格,如下图示例代码:
四、效果图
五、开发环境版本
v5.0.011
六、注意事项
报表列表需要包含示例代码中字段 no_merge_fields ,可以隐藏不显示,否则 PackageDataEvent.getRowData() 无法获取字段 no_merge_fields 的值。
七、参考资料
推荐阅读